получить размер пакета в scapy / python
в Scapy (или даже просто Python, для этого), как я могу получить размер в байтах данного пакета?
У меня есть соблазн использовать функцию len
но я не уверен, что именно она возвращает в случае пакетов.
>>> len(IP(dst="www.google.com"))
20
>>> len(IP(dst="www.google.com")/TCP(dport=80))
40
3 ответов
>>> len(IP(dst="www.google.com"))
20
в минимальном IP-заголовке есть 20 байтов.
>>> len(IP(dst="www.google.com")/TCP(dport=80))
40
есть еще 20 байт в заголовке TCP (20+20==40).
получается, что len
возвращает длину пакета.
Я наблюдал, что Len(packet[Layer]) фактически выполнит действие типа LenField. Он возвращает количество байтов в пакете, начиная с указанного слоя, вплоть до конца пакета. Поэтому, хотя этот метод будет работать для определения общего размера пакета, просто будьте осторожны, что он не будет работать для определения длины отдельного слоя.
вот как я хватаю размер/длину пакета при обнюхивании пакетов с помощью 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 для других вещей, таких как создание пакетов.