![为什么linux重用'time_wait'端口?](https://linux22.com/image/91303/%E4%B8%BA%E4%BB%80%E4%B9%88linux%E9%87%8D%E7%94%A8'time_wait'%E7%AB%AF%E5%8F%A3%EF%BC%9F.png)
据我所知,'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 过滤器可能隐藏了重要信息。对于此测试,您可能希望服务器在接受每个连接时在本地打印一些内容。