乱序是什么
乱序指报文按非递增的序列号到达:抓包上表现为 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 仍能完成传输,问题通常表现在吞吐而非失败
把乱序事件与时间轴对齐,可以判断它是长期存在还是集中在某次网络调整之后。