Linux raw socket(layer2) - 最佳策略

时间:2015-01-22 07:46:34

标签: linux sockets c

上下文:

我正在考虑处理从nic到应用程序的数据包的最佳方法。

我有4个进程在运行并接收来自以太网的数据包。

他们运行pf_packet套接字,以便接收第2层数据包。

问题是他们都必须过滤他们看到的数据包。

由于过滤是通过端口完成的,因此没有竞争条件。一个应用程序对一个独特的端口感兴趣。

问题:

有没有办法避免每个应用过滤所有数据包?拥有一个用于过滤器的核心并将数据包传送到正确的应用程序会产生上下文切换成本。

是否有可能将自定义端口对应的数据包放入已定义的rx队列?这样我的应用程序将确保这些数据包专门用于它。

最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

如果您不想使用BPF和libpcap,也许您可​​以使用Linux套接字过滤器https://www.kernel.org/doc/Documentation/networking/filter.txt 这会在将数据包插入数据包套接字之前过滤内核空间中的数据包。

对于某些语法示例,请使用BSD BPF手册页https://www.freebsd.org/cgi/man.cgi?query=bpf&sektion=4或google / duckduckgo

但是我也建议,如果你的应用程序对性能至关重要,那么在丢弃任何特定的应用程序之前(例如libpcap),你可以对其进行原型设计并测量不同的替代方案。