2012-02-13 8 views
9

実際、私には2つの関連する質問があります。pcap_sendpacketで1500バイトを超えるパケットを送るには?

私は、フィルタリングされたネットワークトラフィックをDebianのlibpcapで取得しています。次に、このトラフィックをWin2k3サーバーで再生する必要があります。時には、TCPとUDPの両方のパケットをキャプチャして、1500バイト(イーサネットのデフォルトのMTUサイズ)よりもはるかに大きいものもあります。たとえば、2000バイト以上。私はそのLinux上でMTUのサイズを特に変更しなかった。そこで質問#1:

これらのパケットがデフォルトのMTUよりもずっと大きい理由は何ですか?Jumbo frames?このWikipediaの記事では、「ジャンボフレームを使用できるネットワークインターフェイスカードはジャンボフレームを使用するために明示的な設定が必要です」と述べていますが、このような設定についてはわかりません。またifconfigは私に "MTU:1500"を示しています。それは何らかの形で "割り込み結合"技術(またはthis articleのような "割り込み合体")と関係がありますか?私はそのようなパケットを抑えることができますか?

その後、質問#2:

私はWindows上でpcap_sendpacketすることにより、このようなパケットを送信することができますどのように? 1500バイトを超えるパケットの場合にのみエラーメッセージ "send error:PacketSendPacket failed"が表示されます。私はジャンボフレームを使うことができないようだ.PCIカードのような直接接続されたカスタム "ネットタップ"にデータを送信しているので、NICを設定できるかどうかわからないからだ。ほかに何か?これらのパケットをプロトコルルールに従って断片化する必要がありますか?

はEDIT:ガイ・ハリスとしてNICによって

チェック断片化が示唆さ:

~# ethtool -k eth0 
Offload parameters for eth0: 
rx-checksumming: on 
tx-checksumming: on 
scatter-gather: on 
tcp-segmentation-offload: off 
udp-fragmentation-offload: off 
generic-segmentation-offload: off 
generic-receive-offload: off 
large-receive-offload: off 
ntuple-filters: off 
receive-hashing: off 

eth1br0に同じ - 私は盗聴だeth0eth1間のネットワークブリッジ。

さらに、大きなUDPパケットを受信します。

お使いのネット​​ワークアダプタは、おそらくそう、TCPセグメンテーション/ desegmentationオフロードとIPフラグメンテーション/再組み立てオフロードを行っている
+0

pcapはおそらく、あなたのワイヤパケットから1つのチャンクに分割されたデータグラムをつなぎ合わせています。あなたがイーサネットフレームを与え、パケットを転送しないように頼むことができるかどうか確認してください。 –

+0

@NikolaiNFetissov:私はイーサネットフレームを受信して​​います –

答えて

4

¿キャプチャにwiresharkを使用していますか?

デフォルトでは、wiresharkは断片化されたIPデータグラムを再構築し(断片化せずに再構成されたMTU-higgerの単一パッケージとしてpcapファイルに格納します)、重要です。 無効にするには:

編集 - >設定 - >プロトコル - > ipV4->を選択し、 "断片化されたIPv4データグラムを再構成する"のチェックを外します。

+0

私はlibpcap(Wiresharkのコア)でキャプチャしています。任意の情報をどのようにlibpcapでこれを無効にするには? –

+1

あなたが使用しているパッケージがこのパッチを適用しない限り、Libpcapはこの機能を単独では持っていません - > http://seclists.org/tcpdump/2007/q2/112 libpcapのバージョンを確認したり、配布によって提供されるもの(時には奇妙なパッチを適用する...) –

+0

+1。情報のためのtnx、私はソースから最後のlibpcapを構築しました、今私はMTU、1518バイトより少し大きいパケットを見るだけです。イーサネットのトレーラーのせいだ。しかし、私はまだ 'pcap_sendpacket'でこれらのパケットを送ることはできません。その予告編を削除して修正する必要がありますか? –

6

  • 1つのイーサネットフレームに収まるよりも大きくなっているあなたのマシンによって送信されるUDPパケットがされています断片化されずにネットワークアダプタに渡され、ネットワークアダプタは断片化を行い、それらもフラグメント化される前にlibpcapに渡されます。
  • ネットワークアダプタによって受信された単一のイーサネットフレームよりも大きいUDPフラグメントは、ホストに渡される前にネットワークアダプタによって再構成され、再構成後にlibpcapに渡されます。
  • 1つのイーサネットフレームに収まらない大きすぎるTCPストリームデータのチャンクがネットワークアダプターに渡され、ネットワークアダプターがチャンクを小さなTCPセグメントに分割し、フルチャンクがlibpcapに渡されます。
  • ネットワークアダプタによって受信されたTCPセグメントは、より大きなチャンクのTCPデータに再アセンブルされ、チャンクはホストに渡されてからlibpcapに渡されます。

ので、何のlibpcapを見ているがないイーサネットパケットであり、イーサネットフレームサイズに制限ではありません。

(つまりNikolai Fetissovはおそらく正しいです; イーサネットフレームのように見えるかもしれませんが、ネットワークアダプタとドライバがそのように見えるからです。

ethtoolコマンドを使用して、ネットワークアダプタでどのような形式のセグメンテーション/デフラグメンテーション/フラグメンテーション/リアセンブリを行っても、それらを抑制することができます。 TCP Segementation Offload、UDP断片化オフロード、一般セグメンテーションオフロード、Large Receive Offload、Generic Receive Offloadなどのオプションをオフにします。

これらのオプションを無効にすると、その大きなパケットがなくなり、問題なく再生できるはずです。 です。あなたが今までにキャプチャした再組み立て済みパケット/断片化されていないパケットを再生する簡単な方法はありません。断片化/再セグメント化されたのと同じ方法で、元々断片化/セグメント化されていました。

+1

+1:情報をチェックしています... –

+0

pls編集済みの記事を参照してください –

関連する問題