Python 使用scapy读取/捕获大于65535字节的数据包
我发布并回答这个问题是因为我花了很长时间才弄明白,我希望它能帮助其他人并节省时间 我正在阅读Wireshark中创建的USBPcap文件,其中包含高达494439字节的大型等时数据包。然后我尝试用scapy解析python中的数据包。不幸的是,对于大于65535字节的数据包,scapy 2.4.3默认忽略超过65535字节的字节Python 使用scapy读取/捕获大于65535字节的数据包,python,scapy,Python,Scapy,我发布并回答这个问题是因为我花了很长时间才弄明白,我希望它能帮助其他人并节省时间 我正在阅读Wireshark中创建的USBPcap文件,其中包含高达494439字节的大型等时数据包。然后我尝试用scapy解析python中的数据包。不幸的是,对于大于65535字节的数据包,scapy 2.4.3默认忽略超过65535字节的字节 有没有办法读取大于65535字节的数据包?为了指示scapy读取大于65535字节的数据包,您必须从API中的许多pcap读取生成器中一次读取一个数据包。具体而言,sc
有没有办法读取大于65535字节的数据包?为了指示scapy读取大于65535字节的数据包,您必须从API中的许多pcap读取生成器中一次读取一个数据包。具体而言,
scapy.utils
中的以下类支持从pcap或pcapng文件读取大数据包:
class scapy.utils.PcapReader(文件名)
class scapy.utils.PcapNgReader(文件名)
class scapy.utils.RawPcapReader(文件名)
class scapy.utils.RawPcapNgReader(文件名)
scapy.utils.rdpcap(文件名,计数=-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字节的数据包(请参阅)。对于实用编程,当在生成器上调用read\u packet()
时,也可以在读取PCAP时设置此配置,而不是保持size
参数
:此默认值似乎是由于IPv4数据包结构造成的,其中数据包长度由16位数字表示。换句话说,这个头值可以描述的最大数据包是
1111111111
字节,或者2^16=65536。从零开始计算,最大的IPv4数据包为65535字节。对于USB,就像我的情况一样,可以使用更大的数据包。您可以设置conf.bufsize
@Cukic0d谢谢您的提示!我已更新答案以反映此配置设置。