首页/网络/协议速查/RTO 超时重传与指数退避
TCP 与 UDP54 条

RTO 超时重传与指数退避

重传超时由平滑 RTT(SRTT)与抖动(RTTVAR)计算,Linux 最小 RTO 约 200ms;超时后 RTO 翻倍退避,避免网络雪崩。

协议速查网络更新于 2026-10-13

RTO 超时重传是什么

发送方为每个报文设置一个重传超时时间 RTO:超过这个时间还没收到确认就重传,并把 RTO 翻倍(指数退避),避免在拥塞时火上浇油。RTO 由平滑往返时间 SRTT 与抖动 RTTVAR 共同计算,Linux 上最小约 200 毫秒,上限约 120 秒。观察 SYN 之间 1 秒、2 秒、4 秒的间隔,就是退避在起作用。

基本信息

计算公式SRTT + max(时钟粒度, 4 × RTTVAR)
最小 RTOLinux 约 200 毫秒(tcp_rto_min)
退避方式每次超时后翻倍,上限约 120 秒
规范RFC 6298
观测命令ss -ti 的 rto 与 retrans 字段
统计计数netstat -s 中的重传段计数

典型使用场景

  • 解释建连等待时间为何长达数十秒:SYN 超时按指数退避重试
  • 排查偶发卡顿:RTO 过大说明 RTT 抖动明显或链路质量差
  • 评估链路质量:用重传率作为客观指标而不是主观感受
  • 理解丢包后的恢复速度:超时重传比快速重传慢得多
  • 区分 RTT 抖动与真实丢包:两者都会引起重传,但处理方向不同

查看 RTO 与重传情况

查看 RTO 与重传情况
ss -ti | grep -E 'rto|retrans'                 # 连接级 rto 与重传计数
ss -o state established '( dport = :443 )' | head
netstat -s | grep -i -A1 'segments retransmited'  # 全局重传段统计
nstat -az TcpRetransSegs | tail -3
sysctl net.ipv4.tcp_rto_min                      # 最小 RTO
# 抓包看重传与超时退避
tcpdump -nn -S -v 'tcp port 8080' -c 20 | grep -i -E 'seq|ack'

要点读法

项目含义实践意义
RTO 公式SRTT 加四倍抖动估计抖动大的链路 RTO 会被明显抬高
最小 RTOLinux 约 200 毫秒低于此值容易在轻微抖动时误重传
退避上限约 120 秒连续超时会导致建连或请求长时间挂起
重传计数单位时间内重传的报文段数持续增长说明链路存在真实丢包
快速重传三个重复确认触发,不必等超时比 RTO 恢复快得多,是正常路径
连续超时退避是「建连要等很久」的常见原因:抓包看到 SYN 之间呈 1 秒、2 秒、4 秒、8 秒递增,就是指数退避在起作用,这时应排查目标端口是否被静默丢弃,而不是继续等待。
不要手工把最小 RTO 调得更小:过小的 RTO 会在正常的网络抖动下产生大量误重传,既浪费带宽又可能触发不必要的拥塞窗口收缩。

易错点

  • 把重传率升高直接归因于本端网卡:需要结合对端与中间链路一起看,单侧统计说明不了方向
  • 只看到少量重传就大动干戈:偶发重传是正常现象,应关注随时间的趋势与业务受影响程度
  • 调整 tcp_rto_min 试图降低建连超时:真正的问题往往是防火墙静默丢弃或路由不可达
  • 忽略应用层超时短于 TCP 重传时间:应用先放弃,重传还在进行,资源被无效占用

数据来源与参考

  • RFC 6298(RTO 计算)
  • man 7 tcp

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌