首页/系统/Linux 内核与性能调优速查/net.ipv4.tcp_fin_timeout FIN_WAIT2 超时
sysctl 内核参数72 条

net.ipv4.tcp_fin_timeout FIN_WAIT2 超时

控制主动关闭方在 FIN_WAIT2 状态等待对端 FIN 的超时秒数(默认 60);它不影响 TIME_WAIT 时长。

tcp_fin_timeout 是什么

net.ipv4.tcp_fin_timeout 控制主动关闭方在 FIN_WAIT2 状态的等待时长,默认 60 秒。四次挥手过程中,本机发出 FIN 并收到对端 ACK 后进入 FIN_WAIT2,等待对端也发来 FIN;如果对端应用迟迟不关闭套接字,本机就会在这里一直等到超时。它常被误认为「TIME_WAIT 时长」的开关,其实 TIME_WAIT 由协议规定为 2MSL,Linux 上固定约 60 秒且不提供配置项,两者的状态与成因完全不同。

基本信息

参数net.ipv4.tcp_fin_timeout(单位秒,默认 60)
作用状态FIN_WAIT2,等待对端发送 FIN
对应状态查看ss -tan state fin-wait-2
易混参数TIME_WAIT 由协议固定,Linux 未提供超时配置项
常见成因对端应用未正确关闭套接字,读端已关闭但写端仍在
影响面全局生效,作用于所有主动关闭的连接

典型使用场景

  • 排查连接长期占用:ss 里出现大量 FIN_WAIT2,判断是对端未关闭还是本机超时设置过长
  • 短连接服务调优:希望异常残留的连接更快释放,避免句柄与内存被长期占用
  • 定位对端实现问题:应用层协议未按约定关闭连接时,本机只能等到超时
  • 理解状态机:区分 FIN_WAIT2 与 TIME_WAIT,避免在错误的方向上调参
  • 对比验证:调整后观察 FIN_WAIT2 数量的变化,确认连接释放是否及时

查看与观察

查看与观察
sysctl net.ipv4.tcp_fin_timeout          # 读当前超时
ss -tan state fin-wait-2 | wc -l          # FIN_WAIT2 数量
ss -tan state fin-wait-2 | head           # 看对端地址分布,定位是哪类连接
ss -tan state time-wait | wc -l           # 对比 TIME_WAIT 数量
netstat -s | grep -i -E 'fin|resets'      # 连接关闭相关统计

关闭相关状态对照

状态含义超时与配置
FIN_WAIT1已发 FIN 等待对端 ACK短时过渡态,通常不出现堆积
FIN_WAIT2已收到 ACK,等待对端 FIN由 tcp_fin_timeout 控制,默认 60 秒
TIME_WAIT主动关闭方保持的最终状态约 2MSL(Linux 约 60 秒),无配置项
CLOSE_WAIT对端已关闭,本机应用未关闭由应用负责关闭,堆积说明应用有缺陷
大量 FIN_WAIT2 通常指向对端应用的关闭流程不规范:服务端在收到对端的 FIN 后应及时调用关闭,而不是把套接字留在半关闭状态。压缩本机超时只能缩短残留时间,不能修正对端的行为。
看到 TIME_WAIT 与 60 秒左右的时长吻合时,不要再去调 fin_timeout:两者是老资料里最常见的混淆点。需要处理 TIME_WAIT 应转向连接模式改造与端口复用方向。

易错点

  • 把 FIN_WAIT2 与 TIME_WAIT 当成同一个东西:调参方向完全错误,问题不会消失
  • 只调短超时而不查对端:残留连接变少但根因仍在,业务延迟可能因为提前断开而上升
  • 忽略 CLOSE_WAIT:该状态堆积属于应用未关闭套接字,属于代码层面的问题
  • 在全局参数上做激进调整:所有连接的关闭行为都会改变,影响面超出预期
  • 不做数量对比:无法判断调整究竟改善了什么

数据来源与参考

  • man 7 tcp(FIN_WAIT2 与 TIME_WAIT)
  • Linux 内核 Documentation/admin-guide/sysctl/net.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌