本文目录导读:

在 TCP 协议中,tcp_loss_detection_timeout 并不是一个标准的 TCP 内核参数名称,您可能指的是与 丢包检测和重传超时(RTO,Retransmission Timeout) 相关的机制。
在 Linux 系统中,最接近您描述的、用于控制 TCP 丢包检测超时行为的参数通常是 tcp_retries1 和 tcp_retries2,这两个参数决定了 TCP 在认为连接丢失之前,会进行多少次重传尝试,从而间接决定了超时时间。
以下是关于 TCP 丢包检测超时(以 Linux 为例)的详细解释:
核心概念:RTO(重传超时)
TCP 的丢包检测主要基于 RTO(Retransmission Timeout,重传超时),当一个数据包被发送后,发送方会启动一个计时器,如果在这个计时器到期之前没有收到确认(ACK),发送方就认为该数据包丢失,并立即进行重传。
RTO 的计算不是固定的,它是动态的,基于网络状况的 RTT(Round-Trip Time,往返时间) 及 RTT 的方差(抖动)进行估算,Linux 内核使用 Jacobson/Karels 算法来计算 RTO。
关键内核参数:tcp_retries1 和 tcp_retries2
这两个参数是控制“TCP 什么时候宣布丢包并采取行动”的核心。
-
tcp_retries1:- 含义: 定义了 TCP 在尝试发送一个数据段(数据包)并遭遇重传超时(RTO)后,需要重传多少次,才会认为“网络层可能存在故障”。
- 默认值: 通常为 3。
- 效果: 当重传次数超过这个阈值时,TCP 会更新路由表(将路由的 MTU 降低,或尝试更优路径),并通知上层应用(如通过
tcp_info结构体提供丢包信息)。它并不直接导致连接断开。
-
tcp_retries2:- 含义: 定义了 TCP 在遭遇重传超时(RTO)后,需要重传多少次,才会彻底放弃该连接。
- 默认值: 通常为 15。
- 效果: 当重传次数超过这个阈值时,TCP 会主动关闭连接,向对端发送 RST(复位)包,并释放所有相关资源,这是连接断开的最终判定。
超时时间是如何计算的?
超时时间并不是一个固定的秒数,而是一个指数级增长的序列,每次重传超时(RTO)超时后,下一次的 RTO 值会翻倍(这就是著名的“指数退避”算法),直到达到一个上限(通常为 120 秒)。
下表展示了基于默认 tcp_retries2 = 15 的重传过程:
| 重传次数 | 事件 | 当次 RTO 等待时间 (秒) | 累计等待时间 (秒) | 备注 |
|---|---|---|---|---|
| 1 | 发送数据包,预期 ACK | 0 (初始 RTO 估算) | 0 | |
| 2 | RTO 超时,第一次重传 | 0 (翻倍) | 0 | |
| 3 | RTO 超时,第二次重传 | 0 (翻倍) | 0 | tcp_retries1 = 3 阈值到达,更新路由 |
| 4 | RTO 超时,第三次重传 | 0 (翻倍) | 0 | |
| 5 | RTO 超时,第四次重传 | 0 (翻倍) | 0 | |
| 6 | RTO 超时,第五次重传 | 0 (翻倍) | 0 | |
| 7 | RTO 超时,第六次重传 | 0 (翻倍) | 0 | |
| . 15 | 持续 RTO 超时并重传 | 0 (上限) | ... | 之后的 RTO 被限制在 120 秒 |
| 16 | 第 15 次重传后超时 | 0 | 约 15-19 分钟 | tcp_retries2 阈值到达,连接断开 |
关键结论:
- 仅因为
tcp_retries1(默认 3 次重传)超时,不会立刻断开连接。 - 连接断开需要
tcp_retries2(默认 15 次重传)超时,整个过程大约需要 15 到 19 分钟(取决于初始 RTO 和是否达到上限 120 秒)。
如何查看和调整这些参数?
在 Linux 系统中,您可以通过 sysctl 命令查看和修改这些参数:
# 查看当前值 sysctl net.ipv4.tcp_retries1 sysctl net.ipv4.tcp_retries2 # 临时修改(重启后失效) sudo sysctl -w net.ipv4.tcp_retries1=5 sudo sysctl -w net.ipv4.tcp_retries2=10 # 永久修改(写入 /etc/sysctl.conf 或 /etc/sysctl.d/ 下的文件) # 添加如下行: net.ipv4.tcp_retries1 = 5 net.ipv4.tcp_retries2 = 10 # 生效永久配置 sudo sysctl -p
- 您提到的
tcp_loss_detection_timeout不是一个标准内核参数,它可能是一个应用层定义的名称,或者是误写。 - 真正的丢包检测超时由
tcp_retries1和tcp_retries2控制,通过“重传次数 * 指数增长的 RTO”来计算最终超时时间。 - RTO 本身是动态计算的,最小通常为
200ms(通过tcp_rto_min调整),最大为120s(硬编码)。 - 默认情况下,一个连接的丢包检测到最终断开,大约需要 15-19 分钟,如果您需要更快的故障检测,可以调小
tcp_retries2的值。
如果您在某个特定工具或代码中看到了 tcp_loss_detection_timeout 这个变量名,请提供更多上下文(如具体的源码、工具名),我可以帮您进一步定位其具体含义和行为。
标签: tcp_loss_detection_timeout RTO超时