6

カスタム Wireshark ディセクタで欠落している UDP フレームをどのように特定しますか?

CQS フィード用のカスタム ディセクタを作成しました(リファレンス ページ)。このフィードを受信するときのサーバー ギャップの 1 つ。Wireshark によると、一部の UDP フレームはまったく受信されません。他のすべてのサーバーにギャップがないため、フレームが送信されたことはわかっています。

CQS フレームは複数のメッセージで構成され、それぞれに独自のシーケンス番号があります。私のカスタム ディセクタは、Wireshark に次のデータを提供します。

cqs.frame_gaps          - the number of gaps within a UDP frame (always zero)
cqs.frame_first_seq     - the first sequence number in a UDP frame
cqs.frame_expected_seq  - the first sequence number expected in the next UDP frame
cqs.frame_msg_count     - the number of messages in this UDP frame

そして、このスクリーンショットに示すように、これらの各値をカスタム列に表示しています。ワイヤーシャークのスクリーンショット

最後に処理されたシーケンス番号を(ローカル静的として)保存し、ディセクタがフレームを処理するときにギャップにフラグを立てるコードをディセクタに追加しようとしましたcurrent_sequence != (previous_sequence + 1). GUI でクリックする場所に応じて、ディセクタがランダム アクセスの順序で呼び出される可能性があるため、これは機能しませんでした。したがって、フレーム 10、次にフレーム 15、次にフレーム 11 などを処理できます。

ディセクタがその前のフレーム (または次のフレーム) が欠落しているかどうかを知る方法はありますか?

ディセクタは C で書かれています。

( serverfault.com の関連投稿も参照してください)

4

2 に答える 2

4

Wireshark は分析を複数回行うことに注意してください。ファイルをロードするときに、初めて厳密な順序でパケットを分析します。次に、packet_tree_viewをスクロールするか、パケットを選択してツリーを構築すると、ディセクタが呼び出されます。

ディセクタが初めて呼び出されたかどうかを確認できます。

 if (PINFO_IS_VISITED(pinfo)) { ... };

ディセクタは、最初の解剖と次の解剖では異なる動作をする必要があります。

最初の分析では、パケットごとにいくつかの情報を (ハッシュ テーブルなどに) 格納する必要があります。これは、シーケンス番号であり、順序が間違っている場合です。2 回目に呼び出されたときに、パケット ツリーを適切に構築するために必要になります。

于 2012-10-30T07:41:06.060 に答える
0

前または次のフレームを覗くことができるかどうかはわかりませんが、Wireshark が tcpdump をロードしているときに、各フレームでディセクタを順番に呼び出します。したがって、配列またはハッシュ テーブルである静的ローカル変数を追加して、そこに値を格納するだけです。その後、ディセクタはその配列を前後のフレームでチェックし、その分析を行うことができます。

フレーム番号、IP 情報などに関する情報の関数引数の 1 つであるpinfo vairableを確認する必要があります。

于 2010-06-06T02:13:02.580 に答える