2012-05-11 124 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はパケットサイズを指定しており、tcpdumpファイルから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

私は、このライブラリを使って、OPのサンプルの予想パケットサイズを 'len'が返していることを指摘しています。 – 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

関連する問題