RTO 超时重传是什么
发送方为每个报文设置一个重传超时时间 RTO:超过这个时间还没收到确认就重传,并把 RTO 翻倍(指数退避),避免在拥塞时火上浇油。RTO 由平滑往返时间 SRTT 与抖动 RTTVAR 共同计算,Linux 上最小约 200 毫秒,上限约 120 秒。观察 SYN 之间 1 秒、2 秒、4 秒的间隔,就是退避在起作用。
基本信息
| 计算公式 | SRTT + max(时钟粒度, 4 × RTTVAR) |
|---|---|
| 最小 RTO | Linux 约 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 会被明显抬高 |
| 最小 RTO | Linux 约 200 毫秒 | 低于此值容易在轻微抖动时误重传 |
| 退避上限 | 约 120 秒 | 连续超时会导致建连或请求长时间挂起 |
| 重传计数 | 单位时间内重传的报文段数 | 持续增长说明链路存在真实丢包 |
| 快速重传 | 三个重复确认触发,不必等超时 | 比 RTO 恢复快得多,是正常路径 |
连续超时退避是「建连要等很久」的常见原因:抓包看到 SYN 之间呈 1 秒、2 秒、4 秒、8 秒递增,就是指数退避在起作用,这时应排查目标端口是否被静默丢弃,而不是继续等待。
不要手工把最小 RTO 调得更小:过小的 RTO 会在正常的网络抖动下产生大量误重传,既浪费带宽又可能触发不必要的拥塞窗口收缩。