Scapy (またはそのために Python だけでも) で、特定のパケットのサイズをバイト単位で取得するにはどうすればよいですか? この関数を使用したくなりlen
ますが、パケットの場合に正確に何を返すかわかりません。
>>> len(IP(dst="www.google.com"))
20
>>> len(IP(dst="www.google.com")/TCP(dport=80))
40
>>> 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
そのため、パケット長が返されているようです。
私が観察しているのは、 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 を使用する場合に上記が意味をなすかどうかはわかりません。