服务器端主动关闭连接, 产生的TIME_WAIT状态为啥会占用服务端大量端口

写回答…1. 对的。2. 并没有占用「端口」。3. 不会,除非你的客户端都在少数几个IP上(比如连接是通过应用层负载均衡进来的,这种情况下你干嘛不复用连接?)。TIME_WAIT 状态到底会占用什么?随意 Google 一下就可以得到答案:tcp - What is the cost of many TIME_WAIT on the server side?被占用的是一个五元组:(协议,本地IP,本地端口,远程IP,远程端口)。对于 Web 服务器,协议是 TCP,本地 IP 通常也只有一个,本地端口默认的 80 或者 443。只剩下远程 IP 和远程端口可以变了。如果远程 IP 是相同的话,就只有远程端口可以变了。这个只有几万个,所以当同一客户端向服务器建立了大量连接之后,会耗尽可用的五元组导致问题。

■网友
为什么高并发的短连接生成的TIME_WAIT会导致服务器端口不够用?只有主动关闭的一方才会进入TIME_WAIT状态,那这种情况也就是高并发连接都是服务端主动关闭。那么端口不够用就是文件描述符不够用了,因为文件描述符只有在从TIME_WAIT状态转换到CLOSE状态后才会真正被系统收回。TIME_WAIT状态会持续2MSL的时间才会转换到CLOSE状态,一般是1-4分钟。如果在这段时间内文件描述符都被用完了,而关闭的连接处于TIME_WAIT状态导致文件描述符并没有被真正释放,就会出现这种情况。
■网友
1.知道"套接字对(socket pair)"是啥咩? "返回并未占用服务器新的端口" 这句话是错的(或者说整句话都是错的)2.保留端口负责接收那些因为没有收到ack包而重发fin包的套接字 如果没有TIMEWAIT 指定端口在短时间内被重新分配给其他套接字 读着数据 写着数据 突然收到一个FIN包!(师爷你好 师爷再见)3.可以被分配的端口也就2~3W(有具体的数字 我就偷个懒不搜了) 不够用很奇怪么?这种问题搜下咩 一堆一堆的比我写的好的答案..
■网友
Cannot assign requested address.
一般就是五元组time_wait满了

■网友
服务器是不是代理,也就是说会作为client端请求其他服务器连接。如果是端口不够用,只能是作为client主动关闭了链接。值得check下。
■网友
涉及到两个数据结构,这里起个名字分别叫做npcb(假设有3
个,分别叫做npcb1,npcb2,npcb3)
和lpcb(假设有8个,从lpcb1到lpcb8)

比如来了一个新的连接,用了npcb1,比如这个npcb1的端口存在了lpcb1里。
此时有个假设,连接存在的时间(比如发送了一个很小的文件,比如花费1分钟)远小于2msl(比如花费20分钟)。
这种情况下只能连续发送8个文件。第九个文件要等到某个lpcb从timewait变为closed才能开始传输。也就是从第8个文件发送完成后12分钟才开始传输第9个文件。
理解的关键在于 npcb即便在timewait也能再次被使用。而lpcb只有变为closed后才能被使用。
【服务器端主动关闭连接, 产生的TIME_WAIT状态为啥会占用服务端大量端口】


    推荐阅读