Home / cs-notes / Network / Protocol / TCP / Problems / TIME_WAIT 过多
问题
内存占用
- 内核 hash table
- 量级
- 1万条TIME_WAIT的连接,消耗约 1M 内存
- 可以忽略
CPU 占用
- 每次分配新的随机端口需要遍历 bound ports
- 可以忽略
参数调优
- net.ipv4.tcp_timestamps
- RFC 1323
- TCP Reliability
- TCP option
- timestamp
- last send (4 Byte)
- last receive (4 Byte)
- Used By
- tcp_tw_reuse
- tcp_tw_recycle
- timestamp
- TCP option
- TCP Reliability
- RFC 1323
- net.ipv4.tcp_tw_reuse
- reuse time_wait connection
- 场景
- 不断与服务器建立短连接
- 总是自己先发起关闭,处于 TIME_WAIT
- 不断重新连接对方
- 依赖 tcp_timestamps
- 连接复用后重置时间戳
- 延迟数据到达时,时间戳小于连接重置时间戳,那么该延迟数据可以安全丢弃
- 需要连接双方同时支持 timestamps
- 仅影响 outbound 连接
- 即客户端连向服务器的 socket
- net.ipv4.tcp_tw_recycle
- timewait 回收
- 开启此配置后,内核快速回收 timewait 连接
- 不再是 2MSL
- 而是 RTO
- Retransmission Timeout 数据包重传超时
- 根据 RTT 动态计算,远小于 2MSL
- socket 进入 TIME_WAIT 状态后,内核记录 socket 统计数据
- 包括最后一次收到数据包的时间戳
- 数据包到达时,如果时间晚于所记录的时间戳,就丢弃
- 该配置需要连接双方支持 timestamps
- 主要影响 inbound 连接
- 服务端主动关闭连接后,快速回收 TIME_WAIT 状态的连接
- 如果客户端处于 NAT 网络
- 多个客户端,同一个 IP 出口
- 在一个 RTO 时间内,只有一个客户端能与服务器连接成功
- 不同的客户端发包时间不一致,造成服务器丢弃数据包