据我所知,'time_wait'stat中的tcp端口不能被使用。 但是,在我的实验中,服务器重用了“time_wait”端口? 为什么?
首先,在客户端机器上input命令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个时间等待连接。
[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
服务器configuration
[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
客户端configuration
[root@livecd ~]# cat /proc/sys/net/ipv4/ip_local_port_range 40000 40001
重要我也尝试Ubuntu的服务器14.04,但得到了相同的结果。
时间等待状态用于防止来自先前连接的旧数据包被接收到新的连接中。 它有效地允许有足够的时间让旧数据包在networking中“死亡”。
但是,只要SYN上的初始序列号高于套接字上的最后一个序列号,处于Timewait状态的套接字就可以接受新的连接。