我有一个设备使用“upd dst port”上的 Tcpdump 过滤捕获流量,然后它会创建一个 pcap 文件供 wireshark 读取。
我从跑步中得到的:
tcpdump udp dst port 5201 -qUns 0 -i wlan0 -w file.pcap
仅是 IP 碎片帧。(这并没有给我关于 radiotap 速率的实际信息)
在跑步的时候:
tcpdump udp -qUns 0 -i wlan0 -w file.pcap
给我带有 udp 帧和碎片帧的输出。
甚至更多... 为什么当我在 wireshark 上过滤 IP[10]==17 上的流量(即 IP 标头中的协议字段)时,我只能获得总结果的约 0.3%,而如果我在显示过滤器文本框中简单地输入“udp”,我只能获得总结果的 16%,并且碎片化的 IP 数据包会被隐藏? 有什么区别?
提前致谢。
答案1
我从跑步中得到的:
tcpdump udp dst port 5201 -qUns 0 -i wlan0 -w file.pcap
仅是 IP 碎片帧。
这可能是因为,无论去往端口 5201 的流量都是由 UDP 数据包组成,而这些数据包的大小超过了单个链路层数据包的容量,因此 IP 必须对它们进行分段。
不幸的是,这个过滤器只能捕捉第一的片段,因为 libpcap 使用的 OS 过滤机制会逐个数据包地进行过滤,而不会保留任何数据包历史记录,并且 1) 碎片 UDP 数据包的第一个片段将包含完整的 UDP 标头,而其他片段将没有任何信息来标识它们是该碎片数据包的附加片段(没有数据包历史记录,IP 标识符没有帮助)或 2) UDP 标头本身是碎片,在这种情况下过滤器根本不起作用(这在实践中可能永远不会发生,但 RFC 791 并未排除这种可能性)。不会捕获其他片段,因此您将无法获得完整的数据包。
(这并没有给我关于 radiotap 速率的实际信息)
如果任何数据包没有关于无线分路速率的信息,这是适配器驱动程序中的一个错误;碎片 IP 数据包不包含任何会导致它们没有速率信息而其他数据包却有的信息。
为什么当我在 IP[10]==17(IP 头中的协议字段)上使用 wireshark 过滤流量时,只能得到总结果的 0.3% 左右,而如果我在显示过滤器文本框中写入简单的“udp”,则可以得到总结果的 16%,并且碎片化的 IP 数据包会被隐藏?
因为诸如的表达式中的偏移量ip[10] == 17
从 0 开始,所以第一个字节应该是ip[0]
,因此,由于协议号是第十个字节,所以 UDP 数据包的正确测试应该是ip[9] == 17
,而不是ip[10] == 17
。