UDPSocket
(UDPデータグラムの場合)およびInputStream
(TCPストリームの場合)の実装を使用して、パケットキャプチャインターフェイス(jpcapなど)の上に座る作業を行った人はいますか?
jpcapのコールバックAPIを考えると、それほど難しいことではないと思いますが、誰かがすでにそれを行っていますか?これを行うことに問題はありますか(たとえば、TCPストリームを自分で再構築する方法を理解する必要がありますか?)
UDPSocket
(UDPデータグラムの場合)およびInputStream
(TCPストリームの場合)の実装を使用して、パケットキャプチャインターフェイス(jpcapなど)の上に座る作業を行った人はいますか?
jpcapのコールバックAPIを考えると、それほど難しいことではないと思いますが、誰かがすでにそれを行っていますか?これを行うことに問題はありますか(たとえば、TCPストリームを自分で再構築する方法を理解する必要がありますか?)
TCP の再構築はJNetPcapで行うことができます。完全な例を次に示します。
final String SOME_PORT = 8888;
StringBuilder errbuf = new StringBuilder();
Pcap pcap = Pcap.openOffline("/dir/someFile.pcap", errbuf); //Can be replace with .openLive(...)
if (pcap == null) {
System.err.printf("Error: "+errbuf.toString());
return;
}
//Handler that receive Tcp Event one by one
AnalyzerListener<TcpStreamEvent> handler = new AnalyzerListener<TcpStreamEvent>() {
@Override
public void processAnalyzerEvent(TcpStreamEvent evt) {
JPacket packet = evt.getPacket();
Tcp tcp = new Tcp();
if (packet.hasHeader(tcp)) {
//Limiting the analysis to a specific protocol
if (tcp.destination() == SOME_PORT || tcp.source() == SOME_PORT) {
String data = new String(tcp.getPayload());
System.out.println("Capture data:{"+data+"}");
}
}
}
};
TcpAnalyzer tcpAnalyzer = JRegistry.getAnalyzer(TcpAnalyzer.class);
tcpAnalyzer.addTcpStreamListener(handler, null);
//Starting the capture
pcap.loop(Pcap.LOOP_INFINATE, JRegistry.getAnalyzer(JController.class), null);
私はこの特定のことを行っていませんが、C/C++ でキャプチャされたパケットを解析するために多くの作業を行っています。このための Java ライブラリが存在するかどうかはわかりません。
基本的に、IP から始めて、プロトコル スタックを上っていく必要があります。pcap データはリンクレベルのヘッダーから始まりますが、非 IP パケットを無視する以外に、気にすることはあまりないと思います。
IP で最も難しいのは、断片化されたデータグラムを再構成することです。これは、Flags フィールドと Fragment Offset フィールドの More Fragments ビットを使用して行われ、Identification フィールドと組み合わせて、フラグメントを異なるデータグラムから区別します。 次に、Protocol フィールドを使用して TCP および UDP パケットを識別し、Header Length フィールドを使用して、対応するヘッダーの開始。
次のステップは、TCP と UDP の両方について、逆多重化であり、キャプチャされたパケット ストリーム内のさまざまな接続を分離します。どちらのプロトコルも、送信元と宛先の IP アドレスと送信元と宛先のポートの 4 つのタプルによって接続を識別します (まあ、UDP 自体には接続がありませんが、私にはもっと適切な言葉がありません)。これらの値の 4 つすべてに一致する一連のパケットになります。
これが完了すると、チェックサムをチェックしたい場合を除き、UDP の場合はほぼ完了です。UDP ヘッダーの Length フィールドは、パケットの長さを示します。ヘッダーの 8 バイトを差し引くと、データがあります。
実際にストリームを再構成する必要があるため、TCP はやや複雑です。これは、長さと組み合わせたヘッダーのシーケンス番号を使用して行われます。これら 2 つの合計は、ストリーム内の次のシーケンス番号を示します。2 方向のトラフィックを追跡していることに注意してください。
(これは、実際の TCP 実装を作成するよりもはるかに簡単です。その場合、Nagle アルゴリズムやその他の詳細を実装する必要があります。)
ヘッダー形式に関する情報はネット上にたくさんあります。初心者向けのグーグル「IPヘッダー」。Wireshark のようなネットワーク アナライザーは、キャプチャされたデータがどのように表示されるかを示すため、この作業に不可欠です。実際、Wireshark はオープン ソースであるため、それがどのように機能するかを調べることで、おそらく多くのことを知ることができます。