需要写个程序通过 pcap-filter 表达式过滤数据包,测试时发现过滤结果不对!现将问题简化如下(以tcpdump举例)
问题描述 通过 tcpdump 过滤出 173_20170107_180747_p5p2.pcap 文件中IP为 10.10.88.173 的数据包,并保存为 result.pcap ,过滤命令 tcpdump -r 173_20170107_180747_p5p2.pcap -w result.pcap "host 10.10.88.173" 原始数据包用 wireshark 打开,设置过滤表达式为 ip.addr==10.10.88.173 ,发现IP为 10.10.88.173 的数据包个数为 7150 但用 wireshark 打开tcpdump过滤出的 result.pcap 文件,发现其数据包个数为 7152 ,如下图!( 此时如果知道原因就不用往下看了 )

问题分析 通过对比wireshark和tcpdump过滤出的数据包,发现 tcpdump 过滤出的pcap文件,多了两个ARP数据包。如图

但就自己所了解的,ARP协议应属于链路层的,不属于IP网络层的( 这种表述可能有争论 ),为什么tcpdump会将其包含在过滤结果内呢? 通过 man pcap-filter 查阅pcap-filter表达式语法,发现自己写的tcpdump过滤表达式 host 10.10.88.173 是正确的啊

但细看却发现,默认下的 host , src host , dst host 过滤出的数据包,是包含 ARP , RARP 协议的!!!wireshark解析ARP数据包,其也包含对应的IP 10.10.88.173 , man pcap-filter ,其准确描述如下

问题解决 将tcpdump过滤表达式修改为 ip host 10.10.88.173 ,即运行命令 tcpdump -r 173_20170107_180747_p5p2.pcap -w result.pcap "ip host 10.10.88.173" 即可! 问题总结 在使用tcpdump或其他工具过特定IP的数据包时,pcap-filter过滤表达式的书写要注意! 如果仅仅是想过滤出IP层的特定IP的数据,需要使用 ip host X.X.X.X 或 ip src X.X.X.X 或 ip dst X.X.X.X 如果仅仅是想过滤出ARP或RARP协议的IP数据包时,需要使用 arp host X.X.X.X 或 rarp host X.X.X.X man pcap-filter ,多熟悉下