乱序与丢包的区别
乱序指报文到达顺序与发送顺序不一致,接收方看到序号前后跳跃,但缺口随后会被补齐;丢包则是某个序号一直没到,只能靠重传弥补。区分两者的意义在于:偶发乱序本身是很多网络的正常行为,只有伴随快速重传、吞吐下降或应用错误时才值得处理。还有一个常见陷阱是「假乱序」——抓包主机自己的网卡卸载功能会把大段数据重新组合,让抓包看起来乱序,实际链路完全正常。
基本信息
| 过滤字段 | tcp.analysis.out_of_order 与 tcp.analysis.ooorder |
|---|---|
| 常见成因 | 多路径转发、链路聚合、中间设备队列、网卡卸载 |
| 与丢包的区别 | 乱序的缺口会被补齐,丢包只能靠重传恢复 |
| 抓包点影响 | 发送端抓包出现乱序多为本机卸载造成,接收端出现则更接近真实链路 |
| 本章平台 | Wireshark 4.x、Linux ethtool 查看卸载状态 |
典型使用场景
- 吞吐上不去且伴随快速重传:确认是链路乱序触发的不必要重传
- 抓包分析前排除干扰:先确认乱序是否来自抓包主机的卸载功能
- 链路聚合改造后评估:判断乱序是否落在可接受范围内
- 多路径环境验收:确认转发策略是否造成同一连接跨路径
- 区分应用乱序与网络乱序:应用层乱序要回到协议实现看
定位乱序
定位乱序
tcp.analysis.out_of_order
tcp.analysis.ooorder && ip.src == 10.0.0.5 # 只看某方向的乱序帧
# 对照检查本地卸载状态(抓包端):
ethtool -k eth0 | grep -E 'tso|gro|lro'
ethtool -K eth0 tso off gro off lro off # 临时关闭,抓完可恢复
# 结合重传一起看,判断乱序是否引发额外重传:
tcp.analysis.retransmission || tcp.analysis.fast_retransmission场景与判读
| 场景 | 判读 | 处置 |
|---|---|---|
| 发送端抓包出现乱序 | 多为网卡卸载造成的假乱序 | 关闭卸载后重抓验证 |
| 接收端抓包出现乱序 | 链路或中间设备重排 | 结合多路径与聚合口配置分析 |
| 多路径或链路聚合环境 | 乱序常见,属设计内行为 | 评估重传比例是否可接受 |
| 乱序后紧跟快速重传 | 乱序触发了不必要的重传 | 调整路径或聚合哈希策略 |
| 乱序伴随实际丢包 | 混合问题,先解决丢包 | 按丢包定位方法分段排查 |
本地抓包前建议临时关闭 offload:ethtool -K eth0 tso off gro off lro off,抓完再恢复,否则分析结论会被网卡改写。
判断真乱序还是假乱序有个简单办法:看乱序是否成片出现且成对反转,网卡卸载造成的假乱序往往规律性强,真实链路乱序则更零散。