1

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

我真正想做的是设置实时捕获(无过滤器),然后在捕获后有选择地过滤数据包。这似乎是不可能的(据我所知,bpf 是内置在捕获机制中的)。

如果这确实不可能,还有其他两种方法(我已经想到),我不确定什么会被认为更有效或“更好”:

  1. 使用自己的过滤器进行多次捕获
  2. 制作一个转储到 fifo 的捕获(无过滤器),并从这些 fifo 读取其他捕获(使用它们自己的过滤器)
4

1 回答 1

1

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

第三种方法是使用 Wireshark 的较低部分 libwireshark 进行过滤(和 wtap 进行捕获)。这涉及到相当多的代码开销,因为 libwireshark 并不完全适合 Wireshark 之外的第三方使用。
然而,这确实具有使用 Wireshark 的“显示过滤器”的能力,这些过滤器被编译为字节码并且相当有效。许多过滤器可能会编译一次,并且可能会一个接一个地查看同一帧。您可以“堆叠”过滤器,例如“ ip.tcp ”暗示“ ip ”。
如果您能够生成所有过滤器中最常见的元素并将其作为 BPF 过滤器放置在您的捕获设备上,这将变得非常有效。

于 2013-09-02T19:11:47.623 回答