tcp_retries2如何重传次数

联启 网络工具 12

本文目录导读:

tcp_retries2如何重传次数-第1张图片-电脑手机工具软件下载 - 免费实用工具合集 | 联启科技

  1. 工作机制:指数退避 + 上限次数
  2. 官方定义与默认行为
  3. 实际重传次数与时间的关系
  4. 如何根据需求调整 tcp_retries2
  5. tcp_retries1 的区别
  6. 查看当前连接的重传状态

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_retries1tcp_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 重传达到该次数后,彻底放弃连接

示例流程:

  1. 发送数据,未收到 ACK。
  2. 第 1~3 次重传:正常指数退避。
  3. 第 4 次重传:tcp_retries1 被触发,内核检查路由是否可用(如发送 ARP 请求)。
  4. 第 4~15 次重传:继续退避重试。
  5. 达到 tcp_retries2 上限:关闭连接,上报错误。

查看当前连接的重传状态

使用 ss -ti 查看 TCP 连接信息(-t 显示 TCP,-i 显示内部信息):

ss -ti | grep -A1 "ESTAB"
# 输出中会显示 retrans 次数、rto 当前值等

  • tcp_retries2 次数 = 重传尝试的最大次数(不是时间)。
  • 实际超时时间 = 指数退避累加,受 tcp_rto_mintcp_rto_max 约束。
  • 默认 15 次 ≈ 15~30 分钟超时。
  • 调小 = 更快放弃连接;调大 = 更容忍网络故障。
  • 调整前应先分析实际场景(RTT 大小、丢包率、应用容忍度)。

标签: TCP重 传 sysctl参数

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