5

特定のネットワーク カードをリッスンし、jPcap ライブラリを使用して TCP (TCP のみ) パケットをキャプチャしています。ただし、個々のパケットではなく、TCP セッション全体が必要です。

Wireshark では、「follow tcp stream」を選択できるため、会話全体を最初から最後まで取得できます。私はまさにそれをJavaでやりたいと思っています。これらのパケットをリアルタイムで再構築するにはどうすればよいですか? ネットワークカードをリッスンし、新しいパケットをキャプチャしながら、TCP セッションを再構築したいと考えています。どうすればこれを達成できますか?パケットをキャプチャするコードは次のとおりです。

jpcap.NetworkInterface[] devices = JpcapCaptor.getDeviceList();
            JpcapCaptor captor = JpcapCaptor.openDevice(devices[1], 65535, true, 1000);
            JpcapWriter writer = JpcapWriter.openDumpFile(captor, "myNetworkDump");
            captor.loopPacket(-1, new PacketPrinter(writer));

class PacketPrinter implements PacketReceiver {

    private HashMap<Long, ArrayList<Packet>> sessions;
    private BufferedWriter out;
    private JpcapWriter writer;

    Map<Long, TCPBodyData> bodies = new HashMap<Long, TCPBodyData>();

    public PacketPrinter(JpcapWriter writer) {
        this.writer = writer;
        this.sessions = new HashMap<Long, ArrayList<Packet>>();
    }

    public void receivePacket(Packet packet) {
        System.out.println(packet);
        if (packet instanceof TCPPacket) {
            TCPPacket tcppacl = (TCPPacket) packet;
            byte[] body = addBodyData(tcppacl);
            // System.out.println(new String(body));
        }
}
}
4

3 に答える 3

1

送信元ホスト、送信元ポート、宛先ホスト、宛先ポート、および連続したシーケンス番号によってパケットをグループ化することができます。セッションがいつ開始されるかを知るために、SYN が 1 に設定されたパケットをチェックできます。この時点で ISN (初期シーケンス番号) をキャプチャできます。ISN+1..ISN+n を持つ以降のすべてのパケットは同じ TCP ストリームになります。セッションがいつ終了するかを知るには、FIN パケットをチェックする必要があります。ウィキペディアのリンクは悪くありませんhttp://en.m.wikipedia.org/wiki/Transmission_Control_Protocolですが、より良く、より深く読むために、「TCP/IP Illustrated vol.1」をお勧めします。

于 2014-07-15T22:32:21.487 に答える
1

私はjPcapについてあまり知りません(そして、どこかで読んだことを覚えています-ここではむしろjNetPcapを使用する必要があります)がHashMap<String,TCPPacket>、会話を保存するためにtcp会話を使用StringしますString.join('.',remotehost_tcp_address,remote_host_tcp_port)。 -FIN+ACK-ACK シーケンスで削除します。

システムのネットワーク負荷が高い場合、コストのかかる操作になる可能性があることに注意してください。また、会話のタイムアウトを監視する必要がある場合もあります。

于 2014-06-24T13:45:33.123 に答える