Linux
為什麼linux重用’time_wait’埠?
據我所知,’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 狀態的套接字就可以接受新連接。