两端对照抓包原理
同一个包在链路不同位置上的存在性差异,就是丢包段的位置。做法是在两端(客户端网段、服务端)用相同过滤条件、覆盖同一时间窗各抓一份 pcap,然后按 TCP 序号或 ICMP 序列号对照:A 侧发出了、B 侧没收到,问题就落在 A 到 B 之间那段路径上。这个方法把「丢包在哪」从猜测变成可夹逼的结论,配合逐跳统计可继续缩小到某一跳或某台设备。
基本信息
| 适用场景 | 跨机房的连接超时、大包丢失、间歇中断 |
|---|---|
| 前置条件 | 两端时钟同步(NTP offset 一秒内)、过滤条件对称 |
| 常用工具 | tcpdump -w 落盘,事后用 Wireshark 或 tshark 解析 |
| 产出 | 一份能说清「谁发出、谁没收到」的对照表 |
典型使用场景
- 业务偶发超时但两端日志都正常:需要判定丢包发生在哪一段
- 大包不通:一端能发出大包、另一端收不到,直接指向 MTU 或分片问题
- 与运营商或云厂商交涉:用两端证据说明责任边界,比口头描述有效
- 验证中间设备是否改写流量:两端 MTU、TOS、VLAN 字段对照可见改动
- 复现间歇故障:两端同时常驻抓包,故障发生时比对时间窗
对照流程
对照流程
# 端 A(客户端侧),固定五元组与时间窗:
tcpdump -i eth0 -nn -s 0 -w /tmp/A.pcap 'host 203.0.113.10 and tcp port 443'
# 端 B(服务端侧),过滤条件与 A 保持严格对称:
tcpdump -i eth0 -nn -s 0 -w /tmp/B.pcap 'host 10.0.0.100 and tcp port 443'
# 事后按同一条件解析,先对齐时间戳再看序号:
tcpdump -nn -tttt -r /tmp/A.pcap | head -20
tcpdump -nn -tttt -r /tmp/B.pcap | head -20
# 抓包前确认两端时钟偏差:
chronyc tracking | grep -E 'System time|Leap'对照结论
| 现象 | 定位 | 下一步 |
|---|---|---|
| A 发出、B 未收到 | A 到 B 方向丢包 | 在中间设备逐段抓包或用逐跳统计收窄 |
| B 收到但没有响应 | B 端应用或本机协议栈问题 | 查监听、连接队列、应用日志 |
| B 响应、A 未收到 | B 到 A 方向丢包 | 查回程路由与出口方向策略 |
| 两端都完整、应用仍失败 | 应用层逻辑或超时配置 | 看应用日志与依赖调用耗时 |
| 仅大包丢失 | MTU 或分片处理问题 | 查隧道 MTU 与路径 MTU 发现 |
抓包范围与时长要提前算好磁盘:全量抓 10Gbps 链路十分钟就能写满数百 GB,建议用 -C 滚动并限制文件数。
两端都完整却仍失败时,别急着怀疑抓包工具:多路径(等价路由、聚合口)会让同一连接的不同包走不同路径,单点抓包本身就看不全。