TCP 流分析82 条

TCP 乱序判读

乱序是包按非递增顺序到达:抓包看 seq 跳跃后回补;与丢包的差异在于所有数据最终到齐(无重传或极少)。

乱序是什么

乱序指报文按非递增的序列号到达:抓包上表现为 seq 跳跃后又被后面的段补上。它与丢包的关键区别是数据最终全部到齐,通常没有重传或只有极少量重传。轻微乱序对 TCP 影响有限,持续大量乱序会不断触发重复确认、拖慢吞吐,常见于多路径转发、链路捆绑与负载均衡场景。

基本信息

本质数据到达顺序与发送顺序不一致
标注字段tcp.analysis.out_of_order
对端的应对发送重复 ACK 与 SACK 通报缺口
与丢包的区别数据最终到齐,重传极少或没有
常见来源多路径转发、链路捆绑、网卡多队列导致的观测假象

典型使用场景

  • 排查吞吐下降但链路无明显丢包的情况
  • 评估多路径或链路捆绑对业务的副作用
  • 区分收到的重复 ACK 是乱序引起还是丢包引起
  • 核对抓包机自身多队列是否制造了假的乱序
  • 比较改造前后乱序比例,评估网络调整效果

常用过滤

常用过滤
tcp.analysis.out_of_order                          # 被标注为乱序的报文
tcp.analysis.duplicate_ack && !tcp.analysis.retransmission   # 重复确认但无重传
tcp.stream == N && tcp.seq                          # 逐包核对序列号
tcp.analysis.out_of_order && ip.src == 10.0.0.9    # 限定来源

现象与结论

现象结论依据
seq 跳跃后被回补乱序所有数据最终到达
seq 跳跃后出现重传丢包缺口无法由已到达的段补齐
重复 ACK 靠 SACK 补齐乱序缺口被后到的段填上
抓包机多队列导致顺序错乱观测假象核对网卡多队列与抓包方式
乱序与丢包可能同时出现在一条会话里,先判断所有序列号是否最终都到达,再看重传数量。
无线接入与虚拟化网络天然存在乱序,少量乱序属正常现象,不必按故障处理。

补充要点

  • 少量乱序属正常现象,先看占比再决定是否需要处理
  • 多路径转发是乱序的高发场景,可从路径策略与分流方式入手
  • 抓包机多队列可能在显示层面制造乱序,核对网卡与采集方式
  • 乱序严重时 TCP 仍能完成传输,问题通常表现在吞吐而非失败
把乱序事件与时间轴对齐,可以判断它是长期存在还是集中在某次网络调整之后。

易错点

  • 把乱序当丢包处理:误判后会去优化链路,而真实瓶颈可能在多路径调度的分配策略上
  • 忽略抓包机自身影响:多队列网卡在不恰当的抓包方式下会产生假的乱序记录
  • 只看重复 ACK 数量不看后续重传,导致乱序与丢包两种成因混为一谈

数据来源与参考

  • Wireshark User's Guide(乱序)
  • RFC 5681
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌