首页/网络/抓包与流量分析速查/FIN_WAIT 状态机速览
TCP 流分析82 条

FIN_WAIT 状态机速览

主动关闭方经历 FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT;对端迟迟不发 FIN 会卡在 FIN_WAIT_2,靠 tcp_fin_timeout 兜底。

FIN_WAIT 状态机速览

主动关闭连接的一方要依次经过三个阶段:发出 FIN 后进入等待对方确认的第一阶段,收到确认后进入第二阶段,收到对方的 FIN 之后再进入超时等待阶段并保持一段时间。如果对端迟迟不发 FIN,连接就会卡在第二阶段,靠内核的超时参数兜底回收。

基本信息

适用平台TCP 状态机行为,Linux 可用 ss 查看
状态顺序等待第一阶段 → 等待第二阶段 → 超时等待
查看命令ss -tan 配合状态过滤条件
兜底参数Linux 的 tcp_fin_timeout 控制第二阶段的最长停留

典型使用场景

  • 理解关闭流程:明确主动关闭方要经历哪些阶段
  • 排查连接泄漏:大量停留在第二阶段说明对端不配合关闭
  • 对照抓包与状态:抓包看不到状态名,需按 FIN 方向推断
  • 评估参数影响:不同内核参数会导致停留时长不同
  • 定位两端不对称:一侧已关闭而另一侧仍占用,说明流程没走完

查看方式

查看方式
ss -tan | grep -E 'FIN-WAIT'          # 查看处于关闭过程中的连接
sysctl net.ipv4.tcp_fin_timeout       # 第二阶段的最长停留时间
ss -s | grep -i timewait              # 超时等待状态的数量

状态读法

状态含义异常信号
第一阶段已发 FIN 等待对方确认长期停留说明对方未应答
第二阶段对方已确认但未发 FIN大量停留说明对端不关闭
超时等待等待足够久以吸收延迟报文数量异常高需关注连接复用
已关闭连接结束正常状态
停留在第二阶段的连接数量是判断对端行为的重要指标。数量持续偏高,通常说明对端应用完成了半关闭却没有继续关闭连接。
抓包看不到状态名,只能按 FIN 的方向与顺序推断。抓包结论要与本机状态查询的输出对照,才能得出可靠判断。
停留时长受内核参数控制,跨机器对比行为之前先确认参数是否一致,否则很容易把配置差异当成对端异常。

易错点

  • FIN_WAIT_2 时长受内核参数影响,跨机器对比行为前核对参数
  • 抓包与 ss 状态对照:抓包看不到状态名,需按 FIN 方向推断
  • 只看到大量关闭中连接就判定泄漏:也可能是短连接业务本身就多
  • 忽略超时等待数量的异常升高,它往往反映连接复用没做好

数据来源与参考

  • RFC 9293(状态机)
  • Linux ip-sysctl 文档
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌