本文目录导读:

tcp_retries2 是 Linux 内核中控制 TCP 连接在建立连接后(即 ESTABLISHED 状态)发送数据包时,最大重传次数的内核参数。
核心结论: tcp_retries2 不是直接设置“重传多少次”,而是通过设置超时时间(timeout),内核根据 RTO(Retransmission Timeout,重传超时时间)动态计算出重传次数,默认值为 15,对应超时时间约 15-30 分钟(取决于 RTT 大小)。
工作机制:指数退避 + 上限次数
当 TCP 发送一个数据段后,若在规定时间内未收到 ACK(确认),会触发重传,每次重传的等待时间(RTO)会指数增长(乘以 2),直到达到上限 tcp_retries2 设置的次数。
命令查看当前值:
sysctl net.ipv4.tcp_retries2 # 或 cat /proc/sys/net/ipv4/tcp_retries2
官方定义与默认行为
- 默认值:15
- 单位:次数(重传尝试次数)
- 作用:控制 TCP 在放弃连接前,最多重传多少次。
- 结果:达到上限后,TCP 会关闭连接,并向应用层报告
ETIMEDOUT(超时错误)或ECONNRESET(连接重置)。
注意:Linux 内核中,tcp_retries1 和 tcp_retries2 都基于指数退避的超时时间,但 tcp_retries1(默认 3)是在重传次数达到该值后,通知 IP 层更新路由(如触发 ARP 探测),而 tcp_retries2 是最终放弃连接的阈值。
实际重传次数与时间的关系
由于 RTO 初始值(tcp_rto_min,默认 200ms)和 RTT(往返时间)不同,相同的 tcp_retries2 在不同场景下对应的总耗时差异很大。
假设初始 RTO = 200ms,RTT 稳定,无拥塞: 重传次数与时间对应关系(指数退避:1, 2, 4, 8, 16, 32... 秒):
| 重传次数 | 第 N 次等待时间 | 累计耗时 |
|---|---|---|
| 1 | ~0.2s | 2s |
| 2 | ~0.4s | 6s |
| 3 | ~0.8s | 4s |
| 15 | ~1638s (约27分) | 约 3277s |
*实际超时时间 ≈ `初始RTO (2^retries - 1)** 但 RTO 有上限(tcp_rto_max,默认 120s),因此实际时间会受tcp_rto_max` 限制。
更真实的公式(Linux 4.x+):
- 每次重传的 RTO = min(
tcp_rto_max,RTO * 2) - 重传总时间 ≈
初始RTO* (2^N - 1) 且单次 RTO ≤ 120秒
因此默认 tcp_retries2 = 15 时,最坏情况超时约 15~30 分钟(若 RTT 很大,可能缩短)。
如何根据需求调整 tcp_retries2
(1)缩短超时时间(更快释放连接)
负载均衡器、Web 服务器,希望快速感知对端离线。
sysctl -w net.ipv4.tcp_retries2=5
对应超时时间约 3~6 秒(取决于 RTT)。
(2)延长超时时间(容忍网络抖动)
长连接、卫星链路、高延迟环境。
sysctl -w net.ipv4.tcp_retries2=20
对应超时时间可达 30 分钟以上。
(4)永久生效
echo "net.ipv4.tcp_retries2 = 5" >> /etc/sysctl.conf sysctl -p
与 tcp_retries1 的区别
| 参数 | 默认值 | 触发动作 |
|---|---|---|
tcp_retries1 |
3 | 重传达到该次数后,更新路由(如 ARP 探测) |
tcp_retries2 |
15 | 重传达到该次数后,彻底放弃连接 |
示例流程:
- 发送数据,未收到 ACK。
- 第 1~3 次重传:正常指数退避。
- 第 4 次重传:
tcp_retries1被触发,内核检查路由是否可用(如发送 ARP 请求)。 - 第 4~15 次重传:继续退避重试。
- 达到
tcp_retries2上限:关闭连接,上报错误。
查看当前连接的重传状态
使用 ss -ti 查看 TCP 连接信息(-t 显示 TCP,-i 显示内部信息):
ss -ti | grep -A1 "ESTAB" # 输出中会显示 retrans 次数、rto 当前值等
tcp_retries2次数 = 重传尝试的最大次数(不是时间)。- 实际超时时间 = 指数退避累加,受
tcp_rto_min和tcp_rto_max约束。 - 默认 15 次 ≈ 15~30 分钟超时。
- 调小 = 更快放弃连接;调大 = 更容忍网络故障。
- 调整前应先分析实际场景(RTT 大小、丢包率、应用容忍度)。
标签: TCP重 传 sysctl参数