私はこれまでにこれらの方法を試しました:
1) 送信元 IP/ポートと宛先 IP/ポートをキーとしてハッシュを作成します。ハッシュ内の各位置は、パケットのリストです。次に、ハッシュはファイルに保存され、各フローは特殊文字/行で区切られます。問題: 大規模なトレースに十分なメモリがありません。
2) 上記と同じキーでハッシュを作成しますが、ファイル ハンドルのみをメモリに保持します。各パケットは、正しいファイルを指すハッシュ [キー] に入れられます。問題: フロー/ファイルが多すぎて (~200k)、メモリ不足になる可能性もあります。
3) ソース IP/ポートと宛先 IP/ポートをハッシュし、情報をファイルに入れます。2 と 3 の違いは、ここでは操作ごとにファイルを開いたり閉じたりするため、同時に多くのファイルを開きすぎてメモリ不足になる心配がありません。問題点: 遅すぎる、ファイル数が 2 と同じなので実用的でない。
4) ソース IP/ポート ペアのハッシュを作成し、フローごとにトレース全体を反復します。そのフローの一部であるパケットを取得し、それらを出力ファイルに配置します。問題: 200k のフローを持つ 60 MB のトレースがあるとします。このようにして、たとえば 60 MB のファイルを 20 万回処理します。繰り返しながらパケットを削除すると、それほど苦痛ではなくなるかもしれませんが、これが良い解決策になるかどうかはわかりません。
5) それらを IP 送信元/送信先で分割し、それぞれに対して 1 つのファイルを作成し、フローを特殊文字で区切ります。まだファイルが多すぎます (+50k)。
今は Ruby を使っていますが、これは悪い考えだったのかもしれません。現在、トレースを tshark でフィルタリングして、関連する情報のみを表示しているため、これ以上小さくすることはできません。
1) で説明したように、C#/Java/C++ を使用してすべてをメモリにロードすることを考えましたが、特に、より効率的な方法でも後でメモリが不足する可能性があるため、ここでより良いアプローチがないかどうか疑問に思っていました。より大きなトレースを使用する必要がある場合は言語。
要約すると、私が直面している問題は、ファイルが多すぎるか、メモリが不足していることです。
また、情報をフィルタリングするためのツールを検索しようとしましたが、存在しないと思います。私が見つけたものは、いくつかの統計を返すだけで、必要に応じてすべてのフローをスキャンするわけではありません。