我想捕获发往本地端口的 UDP 数据包,过滤表达式就像udp port 20000. 我注意到如果 UDP 数据包上有 IP 碎片,libpcap 只能捕获第一个 IP 碎片。我猜原因是第二个 IP 片段没有 UDP 标头(我认为 TCP 相同),所以 libpcap 无法使用过滤器 express 捕获它们udp port 20000。
有什么解决方法吗?或任何其他可以捕获发往特定本地端口的数据包的库?
谢谢!
我猜原因是第二个 IP 片段没有 UDP 标头(我认为 TCP 相同),所以 libpcap 无法使用过滤器 express udp 端口 20000 捕获它们。
对,那是正确的。
您可以尝试udp port 20000 or (ip[6:2] & 0x1fff) != 0,它将捕获到或来自端口 20000 的数据包和第一个片段以外的 IP 片段;这并不理想,但这是你可以用 libpcap 过滤器做的所有事情,因为它使用的过滤器机制(它是 OS 内核的一部分)不维护数据包之间的任何历史记录,因此无法知道带有给定的 IP ID 恰好与另一个具有相同 IP ID、片段偏移量为 0 和端口为 20000 的 UDP 标头的数据包属于同一片段。
(另请注意,至少某些版本的 Linux 会以相反的顺序传输 IP 数据报的片段 - 以便让接收者首先看到最后一个片段,从而能够更经常地正确估计重组数据包的大小. 这将使使用检查 TCP 或 UDP 标头中的字段的过滤器捕获 IP 数据包的所有片段变得更加困难。)