我有一个使用libpcap
作为获取数据包的机制的应用程序,我需要为应用程序的不同部分过滤掉不同的协议。我需要考虑优化,因为流将具有高流量(100-400 Mbps)。
我真正希望能够做的是设置实时捕获(无过滤器),然后在捕获后有选择地过滤数据包。看起来这似乎不可能(bpf内置于捕捉机制中)。
如果确实无法做到这一点,还有其他两种方式(我已经想到了),我不确定什么会被认为更有效或更好':
答案 0 :(得分:1)
fifo方法可能效率不高,因为它涉及从A到B复制大量和大量内存(例如400mbps缓冲 - 它们必须不会相互阻塞 - 到四个FIFO,每个都有不同的过滤器,决定抛出离开累计1600mbps的99.99%)。另一方面,如果实际存在要做的事情,则多次捕获仅触发用户空间中的操作。过滤(通常)在内核中完成。
第三种方法是使用Wireshark下部的libwireshark进行过滤(以及用于捕获的wtap)。这涉及相当多的代码开销,因为libwireshark并不完全适合Wireshark以外的第三方使用。
然而,这确实能够使用Wireshark的“显示过滤器”,它被编译为字节码并且相当有效。许多过滤器可以编译一次,并且可以一个接一个地查看相同的帧。您可以将“过滤”过滤器视为例如“ ip.tcp ”表示“ ip ”
如果您能够生成所有过滤器中最常见的元素并将其作为BPF过滤器放置在捕获设备上,这将变得非常有效。然后,显示过滤器仅查看至少其中一个可能感兴趣的数据。