为什么linux重用'time_wait'端口?

为什么linux重用'time_wait'端口?

据我所知,'time_wait'统计中的tcp端口无法使用。但是,在我的实验中,服务器重用了“time_wait”端口?为什么?

首先,在客户端计算机中输入命令ehco 40000 40001 > /proc/sys/net/ipv4/ip_local_port_range。因此,TCP 端口的最大数量为 2。

服务器代码

while (1) {
    int len = sizeof(struct sockaddr);
    fd = accept(sfd, &remote, &len);

    read(fd, buf, sizeof(buf));
    close(fd);
}

客户代码

    for (i = 0; i < 3; i++)
    {
        sleep(1);
        pid_t pid = fork();
        if (pid == 0)
        {
            handler();
            exit(0);
        }
    }

 void handler()
 {
      * ............. */

      res = connect(sfd, result->ai_addr, result->ai_addrlen);
      if (res == -1) {
        perror("error");
        exit(1);
      }

      printf("connect\n");
 }

展示

[root@livecd ~]# ./client 
connect
[root@livecd ~]# connect
connect

最多有 3 个连接。我认为,最多 2 个连接。为什么 ?服务器有 2 个 timewait 连接。

[root@livecd ~]# netstat -anp | grep TIME
tcp  192.168.88.131:2016   192.168.88.132:40000  TIME_WAIT                  
tcp  192.168.88.131:2016   192.168.88.132:40001  TIME_WAIT                              

环境

Linux livecd.centos 2.6.32-642.el6.i686 #1 SMP Tue May 10 16:13:51 UTC 2016

服务器配置

[root@livecd ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout 
60
[root@livecd ~]# cat /proc/sys/net/ipv4/tcp_tw_recycle 
0
[root@livecd ~]# cat /proc/sys/net/ipv4/tcp_tw_reuse 
0

客户端配置

[root@livecd ~]# cat /proc/sys/net/ipv4/ip_local_port_range 
40000   40001

重要的 我也尝试了 ubuntu server 14.04,但得到了相同的结果。

答案1

问题的转录部分似乎有很多错误,并且缺少重要的部分,但我想我可以以任何方式回答。事实上只有两个端口号,不是意味着只能有两个连接。连接通过四个值来区分:

  • 源地址
  • 源端口
  • 目的地址
  • 目的端口

因此,如果正常情况下,客户端打开带有新端口号的新连接,则服务器可以使用相同的端口号,并且它们仍然是不同的 TCP 连接。就是这样最多服务器工作,只有服务器侦听的服务器端端口(即服务的所谓“众所周知的端口”),并且连接到它的每个客户端在客户端上都有不同的本地地址+端口。

所以,您确实应该看到三个连接。您只看到两个的原因可能是其中一个已经等待了适当的时间,或者一个尚未达到该状态。您的 grep 过滤器可能隐藏了重要信息。对于此测试,您可能希望服务器在接受每个连接时在本地打印一些内容。

相关内容