有没有人完成了坐在数据包捕获接口(如 jpcap)之上的工作,并实现了 UDPSocket (对于 UDP 数据报)和 InputStream (对于 TCP 流)?

我想考虑到 jpcap 中的回调 API,这不会太难,但是有人已经这样做了吗?这样做有什么问题吗(例如,我是否必须自己弄清楚如何重新组装 TCP 流?)

有帮助吗?

解决方案

我还没有做过这个特别的事情,但我确实做了很多工作来解析 C/C++ 中捕获的数据包。我不知道是否存在用于这些的 Java 库。

本质上,您需要从 IP 开始,沿着协议栈向上发展。pcap 数据以链路级标头开始,但我认为除了忽略非 IP 数据包之外,您并不关心其中的太多内容。

IP 最棘手的事情是重新组装碎片数据报。这是通过使用标志字段中的更多片段位和片段偏移字段来完成的,并结合标识字段来区分来自不同数据报的片段。然后使用协议字段来标识 TCP 和 UDP 数据包,并使用标头长度字段来查找相应标头的开始。

对于 TCP 和 UDP,下一步是解复用,分离出捕获的数据包流中的各种连接。两种协议都通过源和目标 IP 地址以及源和目标端口的 4 元组来识别连接(嗯,UDP 本身没有连接,但我没有更好的词方便),因此连接将是与所有 4 个值匹配的数据包序列。

一旦完成,对于 UDP,你就差不多完成了,除非你想检查校验和。UDP 标头中的长度字段告诉您数据包的长度;减去 8 个字节作为标头,这就是您的数据。

TCP 有点复杂,因为您确实必须重新组装流,这是使用标头中的序列号与长度相结合来完成的。这两者的总和告诉您流中的下一个序列号。请记住,您正在跟踪两个方向的流量。

(这比编写实际的 TCP 实现要容易得多,因为您必须实现 Nagle 算法和其他细节。)

网上有很多关于标头格式的信息;对于初学者来说,谷歌“IP header”。像 Wireshark 这样的网络分析仪对于这项工作是必不可少的,因为它会向您展示捕获的数据应该是什么样子。事实上,由于 Wireshark 是开源的,您可能可以通过查看它的工作方式来了解很多信息

其他提示

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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top