私はネットワークで動作するアプリケーションを書いています。いくつかのテストを実行するには、前日のフローを再現する必要があります。ただし、同時に、現在動作しているリスナーを停止することはできません。また、着信フローを保存するために既存のプログラムを書き直すこともできません。私のタスクを解決するために、tcpdumpを使用することにしました。
次のコマンドを使用して、宛先マシンでtcpdumpを実行します。
tcpdump -w capture.cap -n "dst Host host.domain.com and port 5555"
Tcpickまたはscapyを使用してcapture.capを読み取ったとき。 1472バイトより長いすべての有用なデータは、長さが1472になるように切り捨てられています。ただし、ヘッダーには、元のパケットの長さが書き込まれています。私が判断できるように、UDPパケットはいくつかに分割され、その後再び連結されます。ただし、tcpdumpは、ヘッダーのないすべてのパッケージを除外する可能性があります(最初のパケットにのみ表示されるはずです)。
完全なUDPパッケージをダンプする方法はありますか?
IPパケットが、パケットが送信されているネットワークリンクのMTUより大きい場合、IPはそれをネットワークに適合するIPパケットにフラグメント化します。これは、UDP層ではなくIP層によって行われます。
イーサネットのMTUは通常1500バイトです(最大イーサネットパケットサイズは1518で、これには14バイトのヘッダー、1500バイトのペイロード、および4バイトのFCSが含まれます)。オプションがない場合、IPv4ヘッダーは20バイトであり、UDPヘッダーは8バイトであるため、最大UDPペイロードサイズは1500-28 = 1472です。
したがって、[〜#〜] ip [〜#〜]は、パケットを2つ以上のフラグメントに分割し、受信マシンでそれらを再構成します。
Tcpdumpが最初のフラグメント以外のフラグメントをキャプチャしない理由については、関連する質問を参照してください。
-s 0を使用すると、パケット/フレーム全体が確実にキャプチャされます。断片化されている場合は、ダンプを分析することでわかります。
PcapデータのGUIアナライザーとしてwiresharkを試してください。出力などに色を付けます。