2

私は現在、イーサネット接続を介して送信されるデータを追跡および解釈するのに役立つJavaのツールを開発しています。私はすでにパケットスニファとパケットデータインタプリタの両方の開発に成功しています。

トレースファイル内の特定のパケットに移動しようとすると、問題が発生します。各パケットにはタイムスタンプが関連付けられているので、特定のタイムウィンドウに移動できるようにしたいと思います。これを行うための私の現在の方法は以下のとおりです。

public ArrayList<Packet> getTimeWindow(double time, int window) {
    ArrayList<Packet> packets = new ArrayList<Packet>();
    double start = time - window;
    double end = time + window;

    JpcapCaptor captor = null;
    try {
        captor = JpcapCaptor.openFile(this.traceFile); 
    } catch (IOException e) {e.printStackTrace();}

    Packet p = captor.getPacket();
    while(packet != null) {
        if(f.timestamp > end) return packets;
        if(p.timestamp >= start) packets.add(p);    
        packet=captor.getPacket();
    }
    return packets;
}

これは小さなトレースでは問題なく機能しますが、数百万のパケットを処理している場合はかなり遅くなる可能性があります。何らかの形の二分探索アルゴリズムを実装したいのですが、前処理せずにパケットの途中に移動する方法がわかりません。パケットは行ごとに整理されておらず、ファイル内のランダムなポイントにジャンプしても、パケットの先頭にいることを保証できません。

要約:キャプチャ(.pcapまたは.cap)ファイルで特定のパケットを検索する効率的な方法を開発しようとしています。私はネットを精査しましたが、私が求めていることを完全に実行できるものを見つけることができませんでした。

誰かがあなたが提案できるアイデア/解決策を持っているなら、それは大いにありがたいです。

ありがとう!

4

2 に答える 2

1

簡単で小規模な解決策は、問題のファイルの単純なインデックスを作成することです。たとえば、1000 番目のパケットごとの開始点のオフセットをファイルに記録できます。この情報 (元のトレース ファイルへの 64 ビット インデックスのシーケンスのみ) を小さなインデックス ファイルに格納します。次に、バイナリ検索を行うときに、このインデックスを元のファイルと一緒に使用して、読み取りを開始する正しいポイントを (1000 パケット以内で) 見つけることができます。

もちろん、これにはトレース ファイルの前処理 (または生成中の処理) が必要です。

于 2012-06-20T01:33:52.083 に答える
0

これは推測にすぎませんが、インターバル ツリーまたはセグメント ツリーが適切な選択になる可能性があります。すべてのパケットをメモリに収めることができると仮定します。インターバル ツリーは、Cormen らのアルゴリズムに従えば、かなり簡単に作成できます。セグメント ツリーは、メモリの点でより高価になる可能性がありますが、より高速なスタブ クエリが得られるはずです。

パケットがメモリに収まらない場合。キャプチャ ファイルのタイムスタンプを最も広い間隔として使用し、誰かがその間隔に移動した場合に各ファイルにドリルダウンできます。

于 2012-06-19T22:56:27.130 に答える