是否可以在没有root访问权限的情况下在linux上使用packet_mmap?

时间:2013-03-01 12:23:42

标签: c linux linux-kernel udp packet-capture

Linux has a feature,允许通过在内核和用户之间映射共享缓冲区来有效捕获网络数据包。我试图以不需要root访问权限的方式使用此接口(因为我没有它)。

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

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

2 个答案:

答案 0 :(得分:4)

虽然这并没有真正回答这个问题(因为它特别是关于packet_mmap),给定你的参数:

  1. 接收UDP数据包
  2. 想要减少系统调用,没有别的。
  3. 愿意使用特定于Linux的功能,但没有root用户
  4. 并不真正需要或不需要packet_mmap的功能。
  5. 我建议您完全忘记packet_mmap,而是查看recvmmsg(注意拼写,而不是拼写错误)。

    recvmmsg不需要特殊的权限,它非常直观(没有模糊的东西,它的工作方式就像readv),它可以让你在一次调用中收到很多数据包,大大减少了系统调用开销。

答案 1 :(得分:3)

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

  

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

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

PF_PACKET套接字执行支持内存映射访问,但无论您是否使用内存映射访问,它们都需要提升权限。他们PF_INETPF_INET6套接字的替代品;它们是一种读取和写入链路层数据包的机制,所以如果你想在它们上面运行正常的Internet应用程序,祝你好运:

  1. 你必须自己重新实现IP和你正在使用的任何传输协议(UDP,TCP等);
  2. 你必须以某种方式保持内核的 IP和传输协议栈处理这些数据包;
  3. 而你真的不想尝试这样做。

    (请注意,通过“提升权限”,我不一定是指“root权限”; CAP_NET_RAW权限就足够了。但是,正如我所说,如果您尝试更换常规套接字访问权限,则不要我不想使用PF_PACKET套接字。)