Linux

為什麼linux重用’time_wait’埠?

  • August 25, 2016

據我所知,’time_wait’ stat 中的 tcp 埠不能使用。但是,在我的實驗中,伺服器重用了“time_wait”埠?為什麼?

首先,在客戶端機器中,輸入 command 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,但得到了相同的結果。

時間等待狀態用於防止來自先前連接的舊數據包被接受到新連接中。它有效地為舊數據包在網路中“消亡”提供了足夠的時間。

但是,只要 SYN 上的初始序列號高於套接字上看到的最後一個序列號,處於 Timewait 狀態的套接字就可以接受新連接。

引用自:https://serverfault.com/questions/792170