Чтобы указать scapy на чтение пакетов размером более 65535 байт, вы должны читать пакеты по одному с многих генераторов чтения pcap, найденных в scapy.utils API. В частности, следующие классы в 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 ). Для программирования pragmati c можно также установить эту конфигурацию при чтении pcaps вместо сохранения аргумента size
везде, где read_packet()
вызывается в генераторе.
Интересное примечание : Это значение по умолчанию, по-видимому, связано со структурой пакета IPv4, в которой длина пакета представлена 16-битным числом. Другими словами, самый большой пакет, который может отобразить это значение заголовка, составляет 1111111111111111
байт, или 2 ^ 16 = 65536. Если считать с нуля, то наибольший размер пакета IPv4 составляет 65535 байт. Для USB, как и в моем случае, возможны пакеты большего размера.