【发布时间】:2015-01-22 07:46:33
【问题描述】:
上下文:
我正在考虑处理从 nic 到应用程序的数据包的最佳方式。
我有 4 个进程正在运行并从以太网网卡接收数据包。
它们运行 pf_packet 套接字,因此它们接收第 2 层数据包。
问题是他们都必须过滤他们看到的数据包。
没有竞争条件,因为过滤是按端口完成的。一个应用对一个独特的端口感兴趣。
问题:
有没有办法避免每个应用过滤所有数据包?为过滤器设置一个核心并将数据包传送到正确的应用会产生上下文切换成本。
nic 是否可以将自定义端口对应的数据包放入已定义的 rx 队列中?这样我的应用程序就可以确保这些数据包是专供它使用的。
最好的方法是什么?
【问题讨论】:
-
您可以选择使用 libpcap 吗?与 pcap 一样,您可以轻松设置 BPF 过滤器以过滤各种内容,包括端口,假设您的意思是 UDP 或 TCP 端口。
-
第 3 层及更高层不正是这样做的吗?你有重新发明那个轮子的重要理由吗?
-
我花了一天的时间发现了 bpf 及其神秘的规则语法。会深入研究。我买不起任何图书馆,因为我正在做一项非常专业的工作。 +1
-
@Larry 原始的 bpf 接口是神秘的,但如果你使用 libpcap,你会得到一个高级编译器,它可以编译和安装过滤器字符串,如“udp 和端口 4567”到具有 2 个函数的 bpf 过滤器来电。如果您愿意,您可以只使用编译器部分,并将过滤器直接附加到在 libpcap 之外管理的套接字。