在 Scapy(或者甚至只是 Python)中,我如何获得给定数据包的大小(以字节为单位)?我很想使用这个函数len
,但我不确定它在数据包的情况下究竟返回什么。
>>> len(IP(dst="www.google.com"))
20
>>> len(IP(dst="www.google.com")/TCP(dport=80))
40
>>> 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
正在返回数据包长度。
我一直在观察的是 Len(packet[Layer]) 实际上会执行 LenField 类型的操作。它将返回数据包中的字节数,从指定的层开始,一直到数据包的末尾。因此,虽然此方法可用于确定整体数据包大小,但请注意,它无法确定单个层的长度。
这是我在使用 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 用于创建数据包等其他事情时上述内容是否有意义。