如何在 PCAP 上应用中止过滤器?

How to apply abort filter on PCAP?

我正在使用 pcap4j 读取 Java 中的数据包。我想在收到中止数据包时生成警报。现在我无法应用中止过滤器。我在下面附上了代码。

    PcapHandle handle;
    Pcap pcap;
    handle = 

  Pcaps.openOffline("D://nm_postpaid_testing.pcap",TimestampPrecision.NANO);

    //handle.setFilter("tcap.reason == 11", BpfCompileMode.OPTIMIZE);
    System.out.println("Starting output: ");

    PcapPacket packet = null;


    String filter = "pcap abort 11";
    handle.setFilter(filter, BpfCompileMode.OPTIMIZE);
    PacketListener listener = new PacketListener() {
        @Override
        public void gotPacket(PcapPacket pp) {

            System.out.println("/////////////START////////////////");
            System.out.println(Arrays.toString(pp.getRawData()));

            SctpDecoder sctpDecoder = new SctpDecoder();

            //sctpDecoder.decode(pp.getRawData(), "IP", "*", true, "DECODE:TCAP");

            System.out.println("///////////////END//////////////\n");

        }
    };

    handle.loop(4, listener);

捕获过滤器无效

捕获过滤器 pcap abort 11 无效(第 13 行)。您可以像这样用 dumpcap -d -f "<filter>" 测试它:

bash-5.0$ dumpcap -d -f "pcap abort 11"
Capturing on 'Wi-Fi: en0'
dumpcap: Invalid capture filter "pcap abort 11" for interface 'en0'.

That string isn't a valid capture filter (syntax error in filter expression: syntax error).
See the User's Guide for a description of the capture filter syntax.

如果有效,dumpcap 将向您显示过滤器的 BPF 指令。

您有一个 tcap.reason == 11(第 7 行),它是有效的,您可能希望在适用时重新使用它。

pcap abort 11 不是有效的 capture/bpf 过滤器。

我没有使用 pcap4j 的经验,但从 setFilter API documentation 看来它需要 capture/bpf 过滤器而不是显示过滤器。

显示和捕获过滤器之间的区别已解释 here

据我所知,没有 capture/bpf 过滤器可用于过滤 TCAP 中止消息。

中止的有效显示过滤器是 tcap.dialogueAbort_elementtcap.abort_sourcetcap.reason == 10 or tcap.reason == 11,但我不知道如何将它们与 pcap4j

一起使用

对于您的用例 pcap4j 的替代方法可能是使用 tshark or sharkd 解码捕获,这两个程序都支持显示过滤器并且 tshark 支持 JSON (-T json) 和XML (-T pdml) 种您可以在 Java.

中轻松处理的输出格式

pcap库(libpcap/WinPcap/Npcap)可以完成的过滤非常有限;它无法测试像 TCAP 中止这样复杂的事情。您必须通过编写自己的代码或以某种方式使用 Wireshark/TShark/sharkd 的代码来详细剖析数据包,以确定您拥有的数据包是否为 TCP 中止。