本文为摘录,原文为: https://vincent.bernat.ch/en/blog/2014-tcp-time-wait-state-linux#summary

1 TL;DR

  • 不用启用 net.ipv4.tcp_tw_recycle , 该选项已在 Linux4.12 废弃
  • 多数情况下, TIME-WAIT 状态的 socket 无害

2 About the TIME-WAIT state

2.1 TCP state diagram

http://tcpipguide.com/free/t_TCPOperationalOverviewandtheTCPFiniteStateMachineF-2.htm

  • 只有主动关闭连接一端会进入 TIME-WAIT 状态
  • 另外一端通常会走另外一条路径,快速关闭连接
  • 可以通过命令 ss -tan 来查看状态
    $ ss -tan | head -5
    LISTEN     0  511             *:80              *:*
    SYN-RECV   0  0     192.0.2.145:80    203.0.113.5:35449
    SYN-RECV   0  0     192.0.2.145:80   203.0.113.27:53599
    ESTAB      0  0     192.0.2.145:80   203.0.113.27:33605
    TIME-WAIT  0  0     192.0.2.145:80   203.0.113.47:50685
    

2.2 Purpose

3 Problems

4 Other solutions

4.1 net.ipv4.tcp_tw_reuse

5 Another

6 总结

在某些场景下,60 秒的等待销毁时间确实是难以接受的,例如:高并发的压力测试。当我们通过并发请 求测试远程服务的吞吐量和延迟时,本地就可能产生大量处于 TIME_WAIT 状态的 TCP 连接,在 macOS 上可以使用如下所示的命令查看活跃的连接: