当你关闭一个 socket 时,主动关闭一端的 socket 将进入 TIME_WAIT 状态,而被动关闭一方则转入CLOSED状态。
1. 为什么设计TIME_WAIT
当一端调用close()时,就说明本端没有数据要发送了。我们没有任何机制保证最后的一个ACK能够正常传输,第二,网络上仍然有可能有残余的数据包(wandering duplicates),我们也必须能够正常处理。
2.问题点
在高并发短连接的TCP服务器,当服务器处理完 请求后立刻按照主动正常 关闭连接。。。这个场景下, 会出现大量socket处于 TIMEWAI T 状态。如果客户端的并发量持续很高, 此时部分客户端就会显示 连接不上。
3、解决
只能尝试修改内核,sysctl改两个内核参数就行了,如下:
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
简单来说,就是打开系统的TIMEWAIT重用和快速回收。