从c++接口读取原始数据的最快方法



这是主要问题。

  1. 我有10千兆以太网接口,电流为6-7 Gbit/秒
  2. 我需要实现一个防火墙,然后我需要捕获原始数据包来过滤一些数据包
  3. 简单地说,我开始实现作为一个原始套接字所需的代码如下。套接字绑定到特定接口。

    socketfd=socket(AF_PACKET,SOCK_RAW,htons(ETH_P_ALL));
    strncpy(ifopts.ifr_name,interfaceName,IFNAMSIZ-1);
    ioctl(socketfd,SIOCGIFINDEX,&ifopts);
    sll.sll_family=AF_INET;
    sll.sll_ifindex=ifopts.ifr_ifindex;
    sll.sll_protocol=htons(ETH_PALL);
    bind(socketfd,&sll,sizeof(sll));
    
  4. 以下是我的阅读方式,mtu大小为9000

    while(true)
    recvfrom(socketfd,buffer,9000,0,0,0);
    
  5. 在没有对数据包进行任何处理的情况下,我得到了大约150Mbit/秒。

这是我需要解决的问题。我意识到nload或ip-s链接显示了实际速率;但我无法达到6-7Gbit/秒左右的数字。

~150Mbit/sec的速度对我来说太荒谬了。我需要用一个CPU尽可能多地提高性能。我会尝试使用PF_INET,如果你愿意,我可以分享它的结果。

下面是答案。
  • 首先,捕获速度不仅取决于接口上的字节大小,数据包的数量也很重要。因此套接字编程也受到数据包数量的限制。我测量为每秒20万个数据包(pps(
  • 使用更好的网络驱动程序是提高pps的一种方法。PF_RING是可能的库和驱动程序。您可以使用试用版进行测试。我只是在我的网络上测试它,结果是1400万pps。那么这个速率几乎是10Gbit/sec。这就是我所经历的一切

谢谢大家。

最新更新