получить размер пакета в scapy/python

Как в Scapy (или даже просто в Python) получить размер данного пакета в байтах? У меня возникает соблазн использовать функцию len, но я не уверен, что именно она возвращает в случае пакетов.

>>> len(IP(dst="www.google.com"))
20

>>> len(IP(dst="www.google.com")/TCP(dport=80))
40

person Ricky Robinson    schedule 11.05.2012    source источник
comment
Предоставляет ли len размер пакета, и есть ли 1000 пакетов, сгенерированных из файла tcpdumpfile. Дает ли суммированная длина каждого из этих пакетов реальный размер передаваемых данных? Посоветуйте   -  person ramdaz    schedule 04.06.2012


Ответы (3)


>>> 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 возвращает длину пакета.

person MattH    schedule 11.05.2012
comment
Так что ты имеешь в виду? размер и длина совпадают или нет? - person ramdaz; 04.06.2012
comment
Я указываю, что len возвращает ожидаемый размер пакета для примеров OP с этой библиотекой. - person MattH; 04.06.2012

Я заметил, что Len(packet[Layer]) фактически выполняет действие типа LenField. Он вернет количество байтов в пакете, начиная с указанного уровня и до конца пакета. Поэтому, хотя этот метод будет работать для определения общего размера пакета, просто имейте в виду, что он не будет работать для определения длины отдельного слоя.

person Stanley Switalski    schedule 19.09.2012
comment
Ну, вы имеете в виду, что он не найдет длину заголовка, но всегда заголовок + полезная нагрузка. - person Ricky Robinson; 20.11.2013

Вот как я получаю размер/длину пакета при анализе пакетов с помощью 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 для других вещей, таких как создание пакетов.

person Banjer    schedule 10.01.2014
comment
почему бы вам просто не сделать len(p) для каждого пакета p? - person Ricky Robinson; 13.01.2014
comment
Оба, кажется, работают для меня. Я просто показываю, что фактическую длину пакета можно получить из самого пакета. Функция pkt.sprintf в scapy очень полезна для захвата различных полей заголовков, поэтому просто покажем ее использование здесь. - person Banjer; 13.01.2014