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 应转向连接模式改造与端口复用方向。