在Scapy/Python中获取数据包大小

9
在Scapy(或者仅仅是Python),如何获取给定数据包的字节大小? 我想使用函数len,但是我不确定在这种情况下它具体返回什么。
>>> len(IP(dst="www.google.com"))
20

>>> len(IP(dst="www.google.com")/TCP(dport=80))
40

len是否提供数据包大小,如果从tcpdump文件生成了1000个数据包。那么这些数据包的每个长度相加是否能为您提供实际的数据传输大小?请给予建议。 - ramdaz
3个回答

10
>>> len(IP(dst="www.google.com"))
20

IP头部最少包含20个字节。

>>> len(IP(dst="www.google.com")/TCP(dport=80))
40

一个最小的TCP头部还有另外20个字节(20+20==40)。

因此,似乎len返回的是数据包长度。


那么你的意思是什么?size和length是相同的吗? - ramdaz
1
我指出len函数在这个库中返回了OP的示例所期望的数据包大小。 - MattH

2
我观察到的是Len(packet[Layer])会执行LenField类型的操作。它将返回数据包中从指定层开始一直到数据包末尾的字节数。因此,虽然这种方法可以确定整个数据包的大小,但请注意它不能确定单个层的长度。

好的,你的意思是它不会找到头部的长度,而是总是头部+有效载荷的长度。 - Ricky Robinson

2

以下是我使用Scapy嗅探数据包时获取数据包大小/长度的方法。

pkt.sprintf("%IP.len%")

完整示例:

from scapy.all import *

# callback function - called for every packet
def traffic_monitor_callbak(pkt):
    if IP in pkt:
        print pkt.sprintf("%IP.len%")

# capture traffic for 10 seconds
sniff(iface="eth1", prn=traffic_monitor_callbak, store=0, timeout=10)

我只用过Scapy来嗅探数据包,所以不确定在使用Scapy创建数据包等其他事情时是否有意义。


1
为什么不对每个数据包p执行len(p)呢? - Ricky Robinson
1
两者对我来说都可以。我只是想展示实际数据包长度可以从数据包本身中获取。Scapy中的pkt.sprintf函数非常有用,可以抓取各种头部字段,所以在这里也展示一下它的使用。 - Banjer

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