#Blog #Network #interview
计算机网络-Linux服务器中出现大量time_wait的解决办法
1. 为什么会出现大量 time_wait 状态

- 高并发场景下,服务器需要频繁建立和断开连接,导致大量
time_wait状态出现。 - 如果服务器使用的是
HTTP 1.0,默认没有开启长连接,那么每次请求都需要建立新的连接。 - 如果客户端出现了异常情况,比如不发送
FIN报文了,那么服务端就会吃满整个time_wait时间段(也就是2*MSL,Max Segment Lifetime,在Linux上面是30秒,那么time_wait时间就是60s)
2. 如何解决
- 调整
net.ipv4.tcp_tw_reuse内核参数,允许重用time_wait状态所占据的端口 - 调整
net.ipv4_tcp_fin_timeout内核参数,减少time_wait状态维持的时间。
3. 为什么不默认配置 tcp_tw_reuse
- 无论是允许复用
time_wait状态的端口就是降低time_wait状态的持续时间,本质上都相当于跳过了time_wait状态,这样会导致两个问题:- 历史的
RST报文不会被time_wait状态过滤,历史报文会干扰后续的连接 - 如果第四次挥手失败(即
ACK报文丢失了),那么,被动关闭方可能不能正确关闭
- 历史的
- 简单说,调整该内核参数,就是为了在高并发场景下牺牲鲁棒性,来节省性能消耗。