7

Linux有一个功能,可以通过在内核和用户之间映射一个共享缓冲区来有效地捕获网络数据包。我正在尝试以不需要 root 访问权限的方式使用此接口(因为我没有它)。

通常 packet_mmap 用于直接查看网络上的所有数据包,这需要 root 访问权限。我的应用程序只需要使用标准的 linux UDP 套接字接口。我希望使用 packet_mmap 纯粹是为了提高效率——现在系统调用占用了我 50% 以上的 CPU 周期。

有没有办法配置 packet_mmap 以便可以从用户空间使用?

4

2 回答 2

4

虽然这并不能真正回答问题(因为它专门针对 packet_mmap),但鉴于您的参数:

  1. 接收 UDP 数据包
  2. 想减少系统调用,别无他法。
  3. 愿意使用 Linux 特有的功能,但没有 root 用户
  4. packet_mmap 的功能并不是真正需要或不需要的。

我建议您完全忘记 packet_mmap 并查看recvmmsg(注意拼写,而不是拼写错误)。

recvmmsg不需要特殊的权限,它非常直观(没有晦涩的东西,它的工作原理就像readv),它可以让您在一次调用中接收许多数据包,从而大大减少系统调用开销。

于 2013-03-01T13:40:21.687 回答
3

查看 Linux 内核 Git 存储库,似乎PF_INET套接字和PF_INET6套接字都不支持内存映射访问,所以如果通过

我的应用程序只需要使用标准的 linux UDP 套接字接口。我希望使用 packet_mmap 纯粹是为了提高效率——现在系统调用占用了我 50% 以上的 CPU 周期。

您的意思是您想对普通的 UDP 或 TCP 套接字使用内存映射访问,不幸的是,您不能。这同样适用于原始 IP 套接字。

PF_PACKET套接字确实支持内存映射访问,但它们需要提升的权限,无论您是否使用内存映射访问。它们不是插座的替代品PF_INETPF_INET6它们是一种读写链路层数据包的机制,所以如果你想在它们上面运行普通的互联网应用程序,祝你好运:

  1. 您必须自己重新实现 IP 和您正在使用的任何传输协议(UDP、TCP 等);
  2. 您将不得不以某种方式阻止内核的IP 和传输协议栈处理这些数据包;

真的不想尝试这样做。

(请注意,“提升权限”并不一定是指“root 权限”;CAP_NET_RAW权限应该足够了。但是,正如我所指出的,如果您尝试替换常规套接字访问,则不想使用PF_PACKET套接字。)

于 2013-03-01T19:21:39.513 回答