net.ipv4.tcp_fin_timeout怎样超时

联启 网络工具 13

本文目录导读:

net.ipv4.tcp_fin_timeout怎样超时-第1张图片-电脑手机工具软件下载 - 免费实用工具合集 | 联启科技

  1. 核心角色:FIN-WAIT-2 状态
  2. 具体的超时机制(分两种情况)
  3. 关键点与副作用
  4. 与 TIME-WAIT 的区别
  5. 如何检查和设置
  6. 总结:它怎样超时?

net.ipv4.tcp_fin_timeout 这个参数控制的是 TCP 连接在 FIN-WAIT-2 状态下的超时时间

要理解它的超时机制,必须先搞清楚它在 TCP 四次挥手过程中的具体位置和逻辑:

核心角色:FIN-WAIT-2 状态

当客户端(主动关闭方)发送 FIN 并收到服务端(被动关闭方)的 ACK 确认后,客户端进入 FIN-WAIT-2 状态。

  • 此时的状态:客户端已经不再发送数据,但理论上仍可以接收来自服务端的剩余数据(半关闭状态)。
  • tcp_fin_timeout 的作用:它规定了客户端在这个 FIN-WAIT-2 状态下最多能等待多长时间,如果超时,内核会自动关闭这个连接。

具体的超时机制(分两种情况)

tcp_fin_timeout 并不是所有场景下都会触发,它的行为取决于服务端(被动关闭方)的后续动作:

服务端正常发送 FIN(正常关闭)

  1. 客户端发送 FIN -> 进入 FIN-WAIT-1
  2. 服务端回复 ACK -> 客户端进入 FIN-WAIT-2此时计时器开始计时(时长 = tcp_fin_timeout 的值)。
  3. 服务端处理完剩余数据后,发送自己的 FIN
  4. 客户端收到 FIN 并回复 ACK -> 进入 TIME-WAIT 状态。
    • 在这种情况下,tcp_fin_timeout 的计时器会被正常终止,连接不会因为该参数超时。它并未发挥作用

服务端不发送 FIN(连接半开/挂起/异常)

  1. 客户端发送 FIN -> 进入 FIN-WAIT-1
  2. 服务端回复 ACK -> 客户端进入 FIN-WAIT-2计时器开始计时
  3. 服务端因为以下原因一直不发送它的 FIN
    • 程序 Bug,未正确关闭 socket。
    • 客户端和服务端之间的网络中断(如网线拔了),但未触发 RST。
    • 服务端进程挂死(如死循环、OOM Kill 前未关闭连接)。
  4. 客户端等待 tcp_fin_timeout 秒(默认通常为 60 秒)后,内核判断超时,会直接丢弃这个连接,资源被回收。
    • tcp_fin_timeout 发挥了作用 —— 避免了客户端永远卡在 FIN-WAIT-2 状态

关键点与副作用

  • 默认值:通常是 60 秒(不同内核版本可能为 60 或 0,Linux 2.4 后默认 60)。
  • 调小风险:如果你将 tcp_fin_timeout 设置得很小(5 秒),
    • 如果服务端只是网络暂时抖动或处理慢了一点点,客户端就会强行关闭连接。
    • 后果:连接被意外截断,服务端可能还在发送数据或等待客户端 ACK,造成数据丢失或服务端 LAST-ACK 状态堆积。
  • 调大风险:设置得很大(300 秒):
    • 如果一个服务端进程崩溃后,大量被其持有的连接会卡在 FIN-WAIT-2 状态。
    • 后果:客户端上会积累大量半开连接,耗尽文件描述符和内存资源。

与 TIME-WAIT 的区别

很多人会混淆这两个参数:

参数 控制的状态 持续时间 谁在等 为啥要等
tcp_fin_timeout FIN-WAIT-2 可配置(默认 60s) 主动关闭方 等待被动关闭方发送它的 FIN
tcp_tw_reuse / tcp_tw_recycle(已废弃) TIME-WAIT 固定 2*MSL(约 60s) 主动关闭方 确保老的数据包在网络中消失
  • 一句话总结
    • FIN-WAIT-2 超时 = 你(客户端)在等对方(服务端)主动说再见
    • TIME-WAIT 超时 = 你(客户端)在等网络上的旧包彻底消失

如何检查和设置

# 查看当前值
sysctl net.ipv4.tcp_fin_timeout
# 临时修改(例如改为 30 秒)
sysctl -w net.ipv4.tcp_fin_timeout=30
# 永久修改(在 /etc/sysctl.conf 或 /etc/sysctl.d/ 下添加)
echo "net.ipv4.tcp_fin_timeout = 30" >> /etc/sysctl.conf
sysctl -p

它怎样超时?

net.ipv4.tcp_fin_timeout 的超时行为是:当客户端主动关闭连接后,进入 FIN-WAIT-2 状态,若对方(服务端)没有在规定时间内发送它的 FIN 包,内核会在超时后将此连接强制销毁(关闭),释放系统资源。 这是一个兜底保护机制,防止因对端异常导致的连接无限挂起。

标签: tcp_fin_timeout 超时机制

抱歉,评论功能暂时关闭!