本文目录导读:

Linux 系统中 net.ipv4.tcp_retries2 参数默认值为 15(次)。
这个参数控制的是 TCP 连接在重传探活(Retransmission Timeout, RTO)阶段,内核认为连接已彻底断开的最大重试次数。
以下是关于该参数次数的详细说明,以及它如何影响连接超时时间(因为次数转换为时间是动态计算的):
核心含义
- 参数名:
net.ipv4.tcp_retries2。 - 默认值:
15。 - 功能:当 TCP 连接已经建立了(非 SYN 阶段),如果对端一直没有 ACK(确认)回复,内核会重传数据段。
tcp_retries2定义了从第 1 次重传开始,到内核放弃该连接并通知上层应用(比如返回ETIMEDOUT或EHOSTUNREACH)之间的最大重传次数。
超时时间如何计算?(非常重要的概念)
15 次并不意味着简单地等待 $15 \times \text{RTT}$(往返时间)就超时,TCP 的重传时间是指数退避(Exponential Backoff)的。
- RTO(初始重传超时):第一个 RTO 通常是基于 RTT(往返时间)动态计算的,最小值有下限(通常为 200ms 或由
tcp_rto_min决定)。 - 退避算法:每次重传失败,下一次的 RTO 会翻倍(直到达到上限
tcp_retries2或tcp_retries1触发的上限)。
关键公式与结果(基于 Linux 内核默认行为):
当 tcp_retries2 = 15 时,从开始重传到最终放弃,理论上的超时时间上限约为 924 秒(约 15.4 分钟)。
- 计算逻辑:RTO 从 ~0.2秒(200ms)开始,经过指数退避(翻倍),到第 15 次重试时,RTO 已经非常大,内核的实现中,当到达第 15 次重传后,再等待一个最终的超时(大约是 2 分钟),然后才真正断开。
- 实际感受:在大多数广域网场景下,如果对端完全死机或网络中断,开启了
15次的tcp_retries2,应用层可能需要等待大约 13~15 分钟才会感知到连接断开(返回 ETIMEDOUT 错误),如果对端发送了 RST(重置),则立刻断开。
常见场景与调优建议
| 场景 | 推荐值 | 原因 |
|---|---|---|
| 服务器(高可用 / 快速故障检测) | 5 ~ 8 |
减少连接挂死时间,尽快释放资源给新请求,预计超时时间约为 3~8 分钟。 |
| 默认的通用配置 | 15 |
对于公网长连接,给与足够的重试机会,容忍短暂网络中断。 |
| 对端移动设备或可靠性低 | 8 ~ 10 |
在容忍网络抖动和快速回收资源之间取得平衡。 |
| Nginx / 负载均衡器后端 | 3 ~ 5 |
后端服务器探活需要更快的检测速度,减少“慢启动”时的资源浪费。 |
如何修改?(临时与永久)
临时修改(立即生效,重启后失效):
sysctl -w net.ipv4.tcp_retries2=8
永久修改(需重启网络或系统):
在 /etc/sysctl.conf 或 /etc/sysctl.d/ 下的自定义文件中添加:
net.ipv4.tcp_retries2 = 8
然后执行 sysctl -p 使其生效。
- 默认次数:15 次。
- 实际超时时间:约 924秒(15.4分钟)。
- 关键点:次数不是时间,而是退避算法的基数,降低这个值可以显著加快连接断开的检测速度(代价是可能过早放弃对短暂网络故障的容忍)。
如果你想要一个 具体的、可预期的超时时间,使用 tcp_retries2 其实不太精确,更精确的方法是直接修改应用层的 socket 选项 SO_RCVTIMEO 或 SO_SNDTIMEO(设置秒级超时),这比调整内核参数更直观。
标签: tcp_retries2