【问题标题】:Linux raw socket (layer2) - best strategyLinux 原始套接字 (layer2) - 最佳策略
【发布时间】: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 之外管理的套接字。

标签: linux sockets c


【解决方案1】:

如果你不想使用 BPF 和 libpcap,也许你可以使用 Linux Socket Filters 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)之前,您应该对不同的替代方案进行原型设计和测量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多