在scapy / python中获取数据包大小

时间:2012-05-11 13:13:07

标签: python size packet scapy

在Scapy中(或者甚至只是Python,为此),如何获得给定数据包的大小(以字节为单位)? 我很想使用函数len,但我不确定在数据包的情况下它究竟返回了什么。

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

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

3 个答案:

答案 0 :(得分:9)

>>> 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正在返回数据包长度。

答案 1 :(得分:2)

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

答案 2 :(得分: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来创建数据包等其他东西时,我不确定上述是否有意义。