4. 网络延迟基础:RTT、RTO 的概念与 Wireshark 查看方法

说到网络延迟,很多人第一反应就是「ping 一下」。但说实话,ping 只能告诉你一个大概的往返时间,真正要定位重传和性能瓶颈,你得搞懂两个核心指标:RTT 和 RTO。

我刚开始做网络排障那会儿,也分不清这两个东西。直到有一次线上业务超时,我盯着抓包文件看了半天,才发现是 RTO 计算出了问题。嗯,从那以后我就把这两个概念刻在脑子里了。

4.1 什么是 RTT?

RTT(Round-Trip Time),就是数据包从发送端到接收端,再返回确认所花的总时间。说白了,就是「你发一句,对方回一句,中间等了多久」。

在 TCP 里,RTT 是动态变化的。网络拥堵、链路抖动、服务器负载,都会影响它。Wireshark 会为每个 TCP 会话计算 RTT,而且分两种:

  • 初始 RTT:三次握手阶段算出来的 RTT,通常比较准
  • 采样 RTT:数据传输过程中,每个数据包和对应的 ACK 之间的时间差

关键点:RTT 是衡量网络「快不快」的直接指标。如果 RTT 突然飙升,大概率是链路出了问题。

4.2 什么是 RTO?

RTO(Retransmission Timeout),是发送端等待 ACK 的超时时间。如果超过这个时间还没收到确认,发送端就会认为数据丢了,触发重传。

RTO 不是拍脑袋定的,它是根据 RTT 算出来的。TCP 协议里有一套算法:

  1. 先测量 RTT 的平滑值(SRTT)
  2. 再计算 RTT 的偏差(RTTVAR)
  3. 最后 RTO = SRTT + 4 × RTTVAR

为什么是 4 倍?我个人的理解是:TCP 想留出足够的余量,避免因为网络抖动就误判丢包。但余量太大也不行,业务会等死。

注意:RTO 的最小值通常是 200ms(Linux 内核默认),最大值不超过 120 秒。如果你看到 RTO 频繁触发,说明网络状况已经很差了。

4.3 RTT 和 RTO 的关系

这两个指标是「父子关系」。RTT 是实测值,RTO 是计算值。RTT 越稳定,RTO 就越准;RTT 抖动越大,RTO 就越保守。

我曾经遇到过一个案例:某业务跨海链路,RTT 平时 150ms,但每隔几分钟会跳到 500ms。结果 RTO 被算法拉到了 2 秒以上,导致正常丢包也要等 2 秒才重传。这就是 RTT 抖动引发的连锁反应。

RTT 与 RTO 关系流程图 RTT 与 RTO 关系流程 发送端发送数据 接收端回复 ACK 数据包 ACK RTT = 数据包往返时间 RTO = SRTT + 4 × RTTVAR 超时未收到 ACK → 触发重传 RTT 越稳定 → RTO 越精准 → 重传效率越高 RTT 抖动越大 → RTO 越保守 → 业务等待时间越长

4.4 在 Wireshark 中查看 RTT

Wireshark 查看 RTT 有几种方式,我常用的有两个:

4.4.1 通过「统计」菜单查看

  1. 打开抓包文件,选中任意一个 TCP 数据包
  2. 点击菜单栏 统计 → TCP 流图形 → 往返时间(RTT)
  3. Wireshark 会弹出一个散点图,横轴是时间,纵轴是 RTT 值

这个图特别直观。如果 RTT 点都集中在一条水平线上,说明网络稳定。如果点散得到处都是,那就要小心了。

4.4.2 直接在数据包详情里看

选中一个 TCP 数据包,展开 Transmission Control Protocol 部分,找到 Timestamps 或 SEQ/ACK 分析。Wireshark 会显示:

  • Time since first frame in this TCP stream:相对时间
  • RTT:当前数据包与对应 ACK 之间的时间差

小技巧:在 Wireshark 的列显示里添加「RTT」列,可以一眼看到每个数据包的 RTT。右键点击列头 → 列首选项 → 添加「tcp.analysis.ack_rtt」。

4.5 在 Wireshark 中查看 RTO

RTO 不像 RTT 那样直接显示在数据包上,但 Wireshark 会通过分析告诉你「这个包是不是超时重传」。

4.5.1 通过过滤表达式

tcp.analysis.retransmission
tcp.analysis.fast_retransmission
tcp.analysis.spurious_retransmission

这三个过滤条件分别对应:

过滤表达式 含义 触发条件
tcp.analysis.retransmission 超时重传 超过 RTO 未收到 ACK
tcp.analysis.fast_retransmission 快速重传 收到 3 个重复 ACK
tcp.analysis.spurious_retransmission 虚假重传 重传后收到原始 ACK

4.5.2 查看 RTO 计算值

Wireshark 不会直接显示 RTO 数值,但你可以通过 SEQ/ACK 分析 间接推断:

  • 找到重传的数据包
  • 看它和原始数据包的时间差
  • 这个时间差 ≈ 当时的 RTO 值

举个例子:原始包在 0.5 秒发送,重传包在 1.2 秒发送,时间差 0.7 秒。那当时的 RTO 大概就是 700ms 左右。

避坑指南:我曾经遇到过一种情况,RTT 只有 10ms,但 RTO 被算到了 1 秒。原因是 TCP 的 RTO 计算有「退避」机制——连续重传时,RTO 会翻倍。第一次 1 秒,第二次 2 秒,第三次 4 秒……这就是所谓的「指数退避」。

4.6 实战:从 RTT 和 RTO 判断网络问题

光知道概念没用,得会用。我总结了几种常见场景:

现象 RTT RTO 可能原因
RTT 稳定但偏高 100-300ms 正常 物理距离远(跨海、跨国)
RTT 突然飙升 从 20ms 跳到 500ms 随之增大 链路拥堵或路由变化
RTT 正常但频繁重传 10-20ms 偏大 中间设备丢包(交换机、防火墙)
RTT 抖动剧烈 10ms ~ 1000ms 波动 被拉大 无线网络、卫星链路

你想想看,如果 RTT 只有 10ms,但 RTO 是 1 秒,那中间肯定有问题。要么是 TCP 参数配置不合理,要么是网络存在间歇性丢包。

核心思路:RTT 看「快不快」,RTO 看「等多久」。两者结合,才能判断网络到底「好不好」。

4.7 本章小结

RTT 和 RTO 是 TCP 性能分析的基石。RTT 是实测的往返时间,RTO 是计算的重传超时。Wireshark 里看 RTT 很方便,看 RTO 需要结合重传包的时间差来推断。

我个人习惯是:先看 RTT 散点图,判断网络稳定性;再看重传类型,判断是超时还是快速重传;最后结合时间差,反推 RTO 是否合理。这套流程走下来,大部分延迟问题都能找到根因。