首页/网络/抓包与流量分析速查/单向丢包的判定方法
丢包与时延定位60 条

单向丢包的判定方法

同一方向数据在两端抓包数量不一致即该方向丢包:发送侧已发出、接收侧没收到(且发送侧有重传),方向、区段都能就此锁定。

单向丢包的判定方法

判断单向丢包最扎实的办法是两端同时抓包:对比同一时间窗内某个方向的数据在发送侧与接收侧的数量与序列号覆盖范围,差集就是真正丢失的部分。单侧抓包无法区分「发出但没到达」与「根本就没有发」,可靠的结论必须建立在两端数据之上。

基本信息

适用平台两端都能抓包的链路,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

单侧与双侧能力对照

方法能回答的问题局限
单侧抓包发了多少、是否有重传无法区分丢失与未发送
两端抓包哪个方向丢了哪些字节需要两侧同时取数
只看重传标记是否存在重传无法给出丢包区间与方向
序列号是跨机器比对最稳的锚点。两侧时钟未同步时用时间戳相减会得出错误结论,改用序列号区间做集合比较就不受影响。
抓包工具自身的缓冲溢出同样会造成「接收侧少了包」的假象。动手对比之前先看两端的抓包统计里有没有丢弃计数,把它排除掉再下结论。
单向丢包常与链路的方向性相关,比如某段链路的上行拥塞、光模块单向劣化或方向性限速。定位到方向之后,排查范围会显著缩小。

易错点

  • 单侧抓包无法区分"发出未达"与"根本没发",结论必须两端取数
  • 抓包点自身丢包(缓冲区满)会伪造丢失区间,先核对抓包统计
  • 用两侧时间戳直接相减:时钟不同步时会把时钟差算成时延或丢包
  • 只看重传数量不看序列号区间,无法确定丢失的字节范围与影响面

数据来源与参考

  • Wireshark User's Guide(TCP 分析)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌