什么是 RTO 上下限
RTO(Retransmission Timeout)是内核等待确认的超时值,它由 RTT 测量值动态推导,并受两个参数约束:tcp_rto_min 是下限(默认 200 毫秒),tcp_rto_max 是上限(默认 120 秒)。下限决定最快多久开始重传,上限决定退避能拉多长。它们属于专家级微调项,正常场景保持默认并改善链路质量,比改参数更能解决重传问题。
基本信息
| 参数路径 | net.ipv4.tcp_rto_min / net.ipv4.tcp_rto_max |
|---|---|
| 默认值 | 200ms / 120s |
| 推导依据 | 基于 RTT 与 RTT 方差的平滑估算 |
| 相关参数 | tcp_retries1/2、tcp_syn_retries、tcp_frto |
| 生效范围 | 内核全局,新连接生效 |
| 观测 | ss -tin 的 rto、rtt 字段 |
典型使用场景
- 内网低延迟环境:评估是否因 RTO 下限过大导致故障感知偏慢
- 弱网链路:确认重传退避是否拉得过长,影响恢复时间
- 连接级排查:从 ss 读出实际 rto/rtt 值,与链路特征对比
- 与其他重传参数联合评估,避免只改一项造成行为不一致
- 理解内核行为以解释抓包里的重传间隔规律
查看与观测
查看与观测
sysctl net.ipv4.tcp_rto_min net.ipv4.tcp_rto_max 2>/dev/null
# 部分内核不导出这两个键,此时以 ss 观测实际值为准
ss -tin state established | head -4 # 关注 rto 与 rtt 字段
ss -tin | grep -m3 -o 'rto:[0-9]*' # 单连接当前的 RTO
ss -tin | grep -m3 -o 'rtt:[0-9.]*/[0-9.]*' # 平滑 RTT 与方差
nstat -az 2>/dev/null | grep -i 'timeout' | head判读要点
| 观测值 | 正常表现 | 异常表现 |
|---|---|---|
| rto | 随 RTT 稳定在小范围 | 持续贴上限说明链路极不稳定 |
| rtt | 与物理链路特征相符 | 远高于预期可能是排队或跨区绕行 |
| 重传间隔 | 按退避规律递增 | 无规律或过密提示中间设备异常 |
| 超时次数 | 低频偶发 | 集中出现说明存在持续丢包 |
不同内核版本对这两个 sysctl 键的导出情况不同,读不到不代表参数不存在;用 ss -tin 观察实际 rto 值更直接,也避免依赖特定版本的行为。
把 RTO 下限调得过小会抬高无效重传的数量与带宽浪费,在本来就丢包的链路上会进一步恶化表现。
调参前先确认重传的真实成因:抓包与 nstat 计数可以区分链路丢包、重复报文与伪重传,三种情况的处置方向完全不同。