我发布并回答这个问题是因为我花了很长时间才弄清楚,希望它可以帮助其他人并节省时间。
我正在读取Wireshark中创建的USBPcap文件,其中包含大型等时数据包,最大为494439字节。然后,我试图用scapy解析python中的数据包。不幸的是,对于大于65535字节的数据包,scapy 2.4.3默认忽略第65535个字节之后的字节。
是否可以读取大于65535字节的数据包?
答案 0 :(得分:0)
为了指示scapy读取大于65535字节的数据包,必须一次从scapy.utils API中找到的许多pcap读取生成器中读取一个数据包。具体来说,scapy.utils
中的以下类支持从pcap或pcapng文件读取大包:
class scapy.utils.PcapReader(filename)
class scapy.utils.PcapNgReader(filename)
class scapy.utils.RawPcapReader(filename)
class scapy.utils.RawPcapNgReader(filename)
请注意,scapy.utils.rdpcap(filename, count=- 1)
不支持此功能。
我的解决方案:
from scapy.all import *
packet_reader = RawPcapNgReader('my_pcapng_file.pcapng')
while True:
try:
# created my own usb_packet class to parse packet header on __init__
p = usb_packet(packet_reader.read_packet(size=500000)) # read packet up to 500 kB large
if p.filter(): # filter packets based on usb_packet custom filter method
print(len(p.hex_str), len(p.data_packets)) # do stuff to the filtered packets
except EOFError:
break
要通过sniff
或类似的方式捕获数据包,可以通过class scapy.config.Conf.bufsize
设置缓冲区大小,默认为65536以允许捕获65535字节的数据包(请参阅docs)。对于实用的编程,在读取pcap时也可以设置此配置,而不是在生成器上调用size
的任何地方都保持read_packet()
参数。
An interesting note:此默认值似乎归因于IPv4数据包结构,其中数据包长度由16位数字表示。换句话说,此标头值可以描述的最大数据包为1111111111111111
字节,即2 ^ 16 = 65536。从零开始,我们拥有最大的IPv4数据包65535字节。就我而言,对于USB,更大的数据包是可能的。