tcpdump: 匹配精确的数据包长度

3
我需要捕获长度等于16字节的数据包。 我找到的最接近的是这个:
tcpdump -ni lo -ttt dst port 1337 and greater 16

如果我添加其他过滤器来匹配我的意愿,例如:
tcpdump -ni lo -ttt dst port 1337 and greater 16 and not greater 17
tcpdump -ni lo -ttt dst port 1337 and \(greater 16 and not greater 17\)
tcpdump -ni lo -ttt dst port 1337 and greater 16 and less 16

它根本没有显示任何数据包。

尽管如此,使用:

tcpdump -ni lo -ttt dst port 1337 and less 16

似乎也不起作用,我在想less过滤器是否有效...

欢迎任何帮助 :)


我认为长度包括所有的头部,而不仅仅是TCP数据。我不认为你会看到只有16字节的数据包。在以太网帧中的TCP段具有18字节的以太网头和尾,以及至少16字节的TCP头(通常由于TCP选项而更多)。 - Barmar
我应该明确一下,tcpdump将我发送的数据包视为长度为16字节的数据包。这就是为什么我想使用数据包长度来过滤它们。我猜它从总长度中删除了通常的TCP层,对吗?或者它显示的是无关的长度? - naab
1
是的,tcpdump在向您显示内容之前会进行大量解码,并显示协议特定数据。但是过滤器是由一个低级库实现的,该库对协议了解不多。 - Barmar
你说得对,我的数据包长度实际上是68而不是我以为的16。非常感谢你。 - naab
1个回答

4
正如Barry Margolin所指出的,greater运算符检查整个数据包的长度,包括所有头部。例如,16个字节的TCP有效负载加上20个字节的TCP头部(这是TCP头部长度的最小值,不包括选项)加上20个字节的IPv4头部(这是IPv4头部长度的最小值,不包括选项)再加上14个字节的以太网头部,总共为70个字节。
从“lo”来看,我猜您正在Linux上捕获数据包并在环回接口上进行捕获,在这种情况下,数据包具有(虚假的)以太网头部。
68个字节是旧版tcpdump中默认的快照长度,没有IPv6支持,因此报告的长度可能是捕获长度,最后2个字节被截断了。尝试使用标志-o 0运行tcpdump(除非是真正老旧的版本,快照长度为0将意味着“将快照长度设置得非常高,以防止数据包被截断)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接