TCP 流分析82 条

TCP RTT 测量方法

从数据包发出到其确认返回的时间差即一次 RTT 样本(Wireshark 用 tcp.analysis.ack_rtt 给出);持续统计可发现时延漂移与队列堆积。

RTT 是怎么测出来的

RTT(往返时延)指一次「发出数据到收到对应确认」的耗时。抓包里有两种取法:握手阶段直接读 SYN 与 SYN-ACK 的时间差,最省事;传输阶段用 Wireshark 标注的 tcp.analysis.ack_rtt 批量取样。单点数值意义有限,样本的中位数与上限分布才能反映链路质量与队列状态。

基本信息

适用工具Wireshark / tshark;用 tcpdump 需按时间戳自行计算
核心字段tcp.analysis.ack_rtt,单位秒
快速估算SYN 与 SYN-ACK 的时间差
采样注意样本越密越接近真实值,纯 ACK 受延迟确认污染
统计手段tshark -z io,stat 的 AVG/MAX 聚合或 Time Sequence 的 RTT 图

典型使用场景

  • 判断用户侧延迟投诉是否由链路时延造成
  • 对比同业务在不同机房的 RTT 与 SLA 承诺
  • 区分「时延大」与「丢包多」:两者对业务的伤害方式不同
  • 监控长连接业务的时延是否随时间劣化

统计示例

统计示例
tcp.analysis.ack_rtt > 0.1                                   # 快速筛出高时延确认
tshark -r a.pcap -Y 'tcp.analysis.ack_rtt > 0.1' -T fields -e ip.dst -e tcp.analysis.ack_rtt | head
tshark -r a.pcap -q -z io,stat,0,"AVG(tcp.analysis.ack_rtt)tcp.analysis.ack_rtt"   # 平均 RTT
tshark -r a.pcap -q -z io,stat,0,"MAX(tcp.analysis.ack_rtt)tcp.analysis.ack_rtt"   # 峰值 RTT

现象与结论

现象含义下一步
RTT 稳定且小链路健康把注意力转向应用处理耗时
RTT 锯齿上升后骤降队列堆积后被丢包释放检查是否伴随重传与窗口收缩
RTT 持续高但无丢包路径本身就是长时延核对物理距离、专线或 SLA
ACK 间隔固定为 0.04 或 0.2 秒延迟确认在起作用改用数据段样本,不要用纯 ACK 样本
延迟确认会让纯 ACK 样本偏大,判断时优先取「携带数据的段 → 其确认」这类样本。
抓包点的 RTT 只代表该点到对端的一段路径,端到端时延需要两端抓包相减或应用层埋点佐证。

进阶要点

  • 先取握手 RTT 作为路径基线,再看数据阶段样本,两者接近说明网络本身稳定
  • 把样本按会话分组比较,能区分「只有个别对端慢」与「整条链路都慢」
  • 高 RTT 链路要同时看窗口大小,窗口不足时吞吐会被时延直接限制
  • 测时延变化趋势时固定过滤条件与时间窗,避免样本口径漂移
  • 把结论与 ping、MTR 等工具的结果对照,交叉验证更有说服力
Linux 侧可用 ss -ti 查看内核记录的 rtt 与 rttvar,与抓包得到的结论互相印证。

易错点

  • 用单个最大 RTT 下结论:排队抖动会偶发制造高值,应看中位数与 95 分位
  • 把 RTT 偏大直接归因于运营商:还要排除接收端延迟确认、抓包机网卡多队列与虚拟化开销
  • 两端时间未同步却直接相减:跨机时间差会污染结果,需先核对时钟源

数据来源与参考

  • RFC 6298(RTT 测量)
  • Wireshark User's Guide
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌