单向丢包的判定方法
判断单向丢包最扎实的办法是两端同时抓包:对比同一时间窗内某个方向的数据在发送侧与接收侧的数量与序列号覆盖范围,差集就是真正丢失的部分。单侧抓包无法区分「发出但没到达」与「根本就没有发」,可靠的结论必须建立在两端数据之上。
基本信息
| 适用平台 | 两端都能抓包的链路,Linux tcpdump 或 Wireshark |
|---|---|
| 判定依据 | 发送侧已发出的序列号区间减去接收侧实际收到的区间 |
| 对齐方式 | 按序列号对齐,不依赖时钟同步 |
| 注意事项 | 抓包点自身的缓冲溢出会伪造出丢失区间 |
典型使用场景
- 定位丢包方向:区分上行丢包与下行丢包
- 收敛丢包区段:把丢失范围精确到序列号区间
- 验证链路设备:对比途经设备两侧的数据量
- 排除抓包假象:先核对两端抓包统计里的丢弃计数
- 输出证据:给出丢包字节数与占比,便于后续交涉
对照口径
对照口径
# 发送侧:统计该流已发出的序列号范围
tshark -r tx.pcap -Y 'tcp.srcport == 50000 && tcp.len > 0' -T fields -e tcp.seq -e tcp.len | tail -5
# 接收侧:统计实际收到的序列号范围
tshark -r rx.pcap -Y 'tcp.srcport == 50000 && tcp.len > 0' -T fields -e tcp.seq -e tcp.len | tail -5单侧与双侧能力对照
| 方法 | 能回答的问题 | 局限 |
|---|---|---|
| 单侧抓包 | 发了多少、是否有重传 | 无法区分丢失与未发送 |
| 两端抓包 | 哪个方向丢了哪些字节 | 需要两侧同时取数 |
| 只看重传标记 | 是否存在重传 | 无法给出丢包区间与方向 |
序列号是跨机器比对最稳的锚点。两侧时钟未同步时用时间戳相减会得出错误结论,改用序列号区间做集合比较就不受影响。
抓包工具自身的缓冲溢出同样会造成「接收侧少了包」的假象。动手对比之前先看两端的抓包统计里有没有丢弃计数,把它排除掉再下结论。
单向丢包常与链路的方向性相关,比如某段链路的上行拥塞、光模块单向劣化或方向性限速。定位到方向之后,排查范围会显著缩小。