Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用scapy读取/捕获大于65535字节的数据包_Python_Scapy - Fatal编程技术网

Python 使用scapy读取/捕获大于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

我发布并回答这个问题是因为我花了很长时间才弄明白,我希望它能帮助其他人并节省时间

我正在阅读Wireshark中创建的USBPcap文件,其中包含高达494439字节的大型等时数据包。然后我尝试用scapy解析python中的数据包。不幸的是,对于大于65535字节的数据包,scapy 2.4.3默认忽略超过65535字节的字节


有没有办法读取大于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谢谢您的提示!我已更新答案以反映此配置设置。