使用jPcap在Java中实时进行TCP会话重建

Alp*_*pay 5 java networking tcp jpcap

我正在侦听特定的网卡并使用jPcap库捕获TCP(仅TCP)数据包.但是,我需要拥有整个TCP会话,而不是单个数据包.

在Wireshark中,我可以选择"关注tcp流",这样我就可以从头到尾完成整个对话.我想在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));
Run Code Online (Sandbox Code Playgroud)
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));
        }
}
}
Run Code Online (Sandbox Code Playgroud)

Cap*_*Cap 1

我对 jPcap 不太了解(我记得在某处读过 -在这里你应该使用 jNetPcap),但我会HashMap<String,TCPPacket>根据存储对话使用 tcp 对话,String例如密钥String.join('.',remotehost_tcp_address,remote_host_tcp_port),然后等待 RST 或 FIN -FIN+ACK-ACK 序列将其删除。

请注意,如果您的系统经历过重的网络负载,那么这可能是一项成本高昂的操作,并且您可能还需要监视超时的对话。