据我所知,'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
时间等待状态用于防止来自先前连接的旧数据包被接受到新连接。它有效地为旧数据包在网络中“消亡”留出了足够的时间。
但是,只要 SYN 上的初始序列号高于套接字上看到的最后一个序列号,处于 Timewait 状态的套接字就可以接受新连接。