2012-05-11 4 views
4

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

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

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

len дает размер пакета, и если есть 1000 пакетов, сгенерированных из файла tcpdump. Объединяет ли длина каждого из этих пакетов реальный размер передачи данных? Посоветуйте – ramdaz

ответ

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

Есть 20 байт минимального заголовка IP.

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

В минимальном заголовке TCP (20 + 20 == 40) имеется еще 20 байтов.

Так что кажется, что len возвращает длину пакета.

+0

Итак, что вы подразумеваете? размер и длина одинаковые или нет? – ramdaz

+1

Я указываю, что 'len' возвращает ожидаемый размер пакета для примеров OP с этой библиотекой. – MattH

2

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

+0

Ну, вы имеете в виду, что он не найдет длину заголовка, но всегда заголовок + полезная нагрузка. –

1

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

+0

Почему вы просто не делаете 'len (p)' для каждого пакета 'p'? –

+1

Оба, похоже, работают на меня. Я просто показываю, что фактическая длина пакета может быть захвачена из самого пакета. Функция 'pkt.sprintf' в scapy довольно полезна для захвата различных полей заголовков, поэтому просто показывается ее использование здесь. – Banjer

Смежные вопросы