2012-05-11 90 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是給出數據包大小,並且是否有從tcpdumpfile生成的1000個數據包。總結每個數據包的長度是否爲您提供實際的數據傳輸大小?建議 – ramdaz

回答

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

中有一個最小的IP報頭20個字節。

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

在最小的TCP報頭(20 + 20 == 40)中還有另外20個字節。

所以看來len正在返回數據包長度。

+0

那麼你在暗示什麼?大小和長度是否相同? – ramdaz

+1

我指出'len'正在爲這個庫的OP示例返回預期的數據包大小。 – MattH

2

我一直在觀察的是Len(packet [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

爲什麼不對每個數據包'p'都做'len(p)'? –

+1

兩者似乎都適合我。我只是表明實際的數據包長度可以從數據包本身獲取。 scapy中的'pkt.sprintf'函數在抓取各種頭字段時非常有用,所以在這裏也只是顯示它的用法。 – Banjer