执行多个PCAP过滤器的最有效方法

时间:2013-09-02 18:48:43

标签: linux pcap

我有一个使用libpcap作为获取数据包的机制的应用程序,我需要为应用程序的不同部分过滤掉不同的协议。我需要考虑优化,因为流将具有高流量(100-400 Mbps)。

我真正希望能够做的是设置实时捕获(无过滤器),然后在捕获后有选择地过滤数据包。看起来这似乎不可能(bpf内置于捕捉机制中)。

如果确实无法做到这一点,还有其他两种方式(我已经想到了),我不确定什么会被认为更有效或更好':

  1. 使用各自的过滤器进行多次捕获
  2. 进行一次转储(无过滤器)转储到fifos,并从其中捕获其他捕获(使用自己的过滤器)

1 个答案:

答案 0 :(得分:1)

fifo方法可能效率不高,因为它涉及从A到B复制大量和大量内存(例如400mbps缓冲 - 它们必须不会相互阻塞 - 到四个FIFO,每个都有不同的过滤器,决定抛出离开累计1600mbps的99.99%)。另一方面,如果实际存在要做的事情,则多次捕获仅触发用户空间中的操作。过滤(通常)在内核中完成。

第三种方法是使用Wireshark下部的libwireshark进行过滤(以及用于捕获的wtap)。这涉及相当多的代码开销,因为libwireshark并不完全适合Wireshark以外的第三方使用。
然而,这确实能够使用Wireshark的“显示过滤器”,它被编译为字节码并且相当有效。许多过滤器可以编译一次,并且可以一个接一个地查看相同的帧。您可以将“过滤”过滤器视为例如“ ip.tcp ”表示“ ip ” 如果您能够生成所有过滤器中最常见的元素并将其作为BPF过滤器放置在捕获设备上,这将变得非常有效。然后,显示过滤器仅查看至少其中一个可能感兴趣的数据。