关于FIN_WAIT1
这篇讲的是TCP连接关闭过程中FIN_WAIT1状态持续时间的问题。作者从TCPCopy社区的一个讨论切入,先通过经典的四次挥手流程图帮我们回忆TCP关闭的步骤,重点解释了主动关闭方在发出FIN包后所处的FIN_WAIT1状态。 文章核心是纠正一个常见误解:很多资料会说tcp_fin_timeout控制FIN_WAIT1的超时,但实际上这个参数控制的是FIN_WAIT2状态的持续时间。真正的关键参数是tcp_orphan_retries,它决定了当FIN包的ACK确认未收到时,系统会进行多少次重试。作者通过一个用netcat和iptables搭建的实验,清晰地展示了FIN包被丢弃后的重试行为——每次重试间隔翻倍(约200ms,400ms,800ms...),并引用了Linux内核源码来证明当tcp_orphan_retries设为0时实际生效值为8。 因此,对于线上出现大量FIN_WAIT1连接的服务器,解决方案很明确:根据网络状况适当调低tcp_orphan_retries的值。文章最后还延伸了一点,讨论了FIN_WAIT1状态可能被利用进行DoS攻击的风险,使话题更深入。