如何获取并记录源节点S与目的节点D间丢包信息及丢包原因?
获取源节点S与目的节点D间丢包信息及原因的方法
一、端到端数据包追踪工具
- tcpdump/Wireshark抓包对比:在S和D两端同时启动抓包:
- S端执行:
tcpdump -i <网卡接口> host <D的IP> and port <目标端口> -w s_send.pcap - D端执行:
tcpdump -i <网卡接口> host <S的IP> and port <源端口> -w d_recv.pcap
之后用Wireshark打开两个pcap文件,提取S发送的数据包序列号列表和D接收的列表,直接对比找出缺失的200个包的序列号。同时查看是否有ICMP错误包(比如目标不可达、TTL超时),或TCP重传标记(tcp.analysis.retransmission),快速定位丢包原因。
- S端执行:
- mtr路径丢包排查:在S端执行
mtr --report <D的IP>,它会实时显示路径上每个中间节点的丢包率。如果某段路由器丢包率异常,丢包大概率发生在该节点,再针对这个节点查日志或抓包。
二、网络中间设备的日志与监控
- ACL丢弃日志:如果中间路由器/交换机配置了访问控制列表(ACL),开启日志功能(比如Cisco设备在ACL规则后加
log关键字),设备会记录被丢弃数据包的源IP、目的IP、端口,以及丢弃原因(比如ACL拒绝、带宽超限)。 - QoS队列统计:若网络配置了流量控制策略,查看接口的QoS统计(比如Cisco用
show policy-map interface <接口>),可以看到因队列溢出、低优先级被丢弃的数据包数量和类型。 - SNMP计数器对比:通过SNMP读取设备接口的丢包计数器(比如IF-MIB的
ifInDiscards/ifOutDiscards,TCP-MIB的tcpOutSegs/tcpInSegs),对比S、D及中间节点的计数器差值,定位丢包发生的位置。
三、协议层自带的丢包反馈机制
- TCP SACK与重传分析:TCP的选择性确认(SACK)会明确告知发送端哪些分段已接收、哪些丢失。在Wireshark里过滤
sack,就能看到D端返回的缺失序列范围;同时标记为tcp.analysis.retransmission的包,就是S端因未收到ACK而重传的包,对应原始丢包的序列号。 - ICMP错误报文:如果丢包是因为端口未开放、网络不可达、TTL耗尽等原因,中间设备或D端会返回ICMP错误包。在S端抓包过滤
icmp,就能直接看到丢包的具体原因。
四、自定义标记与监控脚本
- 给每个应用层数据包添加唯一递增的序列号,D端接收后记录所有收到的序列号,和S端的发送列表对比,直接得到200个丢包的ID。再结合抓包数据,追踪这些ID对应的包在传输路径中的状态。
- 用Python的scapy库写脚本,模拟发送带标记的数据包,实时跟踪每个包的接收状态,一旦发现未收到,立即触发对中间节点的日志查询或临时抓包,快速定位原因。
示例场景的具体操作步骤
针对S发1000个包、D仅收800个的情况:
- 从S端的pcap文件中导出所有发送数据包的序列号列表,从D端的pcap导出接收列表;
- 对比两个列表,筛选出200个缺失的序列号;
- 在S端的pcap中找到这些缺失包,检查包的TTL、大小、协议字段,确认发送环节无异常;
- 用mtr排查路径,定位丢包率高的中间节点,查看该节点的ACL日志或QoS统计;
- 如果路径无异常,检查D端的系统日志(比如Linux的
/var/log/syslog),看是否有防火墙拦截、进程崩溃、缓冲区溢出导致的丢包记录。
内容的提问来源于stack exchange,提问作者Maryam
相关产品推荐
相关产品推荐

