2013-06-03 32 views
7

我想捕捉其目的地为本地端口UDP数据包,所述过滤器表达式类似udp port 20000。我注意到,如果UDP数据包上存在IP碎片,libpcap只能捕获第一个IP碎片。我想原因是第二个IP片段没有UDP头(我认为它与TCP相同),所以libpcap无法使用过滤器express udp port 20000捕获它们。的libpcap不能捕获IP片段

都对此有任何解决方法吗?或任何其他库可以捕获指定到特定本地端口的数据包?

谢谢!

+0

如果一个UDP数据包是支离破碎,碎片不识别它们的源/目的,那么如何在宙斯的屁眼的名字他们得到路由到正确的主机和应用程序? –

+0

第二个片段带有IP头,但没有UDP头。 IP/TCP堆栈将在将整个UDP数据包传送到应用程序之前组装第一个和第二个IP碎片。但在我看来,libpcap无法识别第二个IP片段。 – misteryes

+0

tcp/ip堆栈如何知道第二个片段与没有UDP头部的第一个片段属于同一个套接字?也许你将不得不自己重新组装 - 这真的不应该那么困难。 –

回答

7

我猜原因是第二个IP片段不能与UDP报头(我认为这是TCP一样),所以使用过滤器表达UDP端口的libpcap不能捕捉它们20000

是的,这是正确的。

您可能会尝试udp port 20000 or (ip[6:2] & 0x1fff) != 0,它会捕获端口20000的数据包除第一个片段之外的IP片段;这并不理想,但只要使用过滤器机制(它是操作系统内核的一部分)不会在数据包之间维护任何历史记录,并且因此无法知道带有给定的IP ID恰好与具有相同IP ID,0的片段偏移量和具有端口20000的UDP头部相同的片段的一部分。

(还要注意,至少某些版本的Linux将传输在反向为了一个IP数据报的片段 - 为了让收件人先看到最后一个片段,从而能够更频繁地正确估计重组后的包的大小,这将使甚至困难。用一个检查过滤器来捕获IP数据包的所有片段在TCP或UDP报头字段。)