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

时间:2018-11-16 08:10:26

标签: c++ performance sockets packet-capture

这是主要问题。

  1. 我有10 Gb以太网接口,电流为6-7 Gbit / sec
  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 / sec。

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

〜150Mbit / sec对我来说太荒谬了。我需要尽可能多地提高性能,而我只能使用一个CPU。如果您希望我可以共享它的结果,我将尝试使用PF_INET。

1 个答案:

答案 0 :(得分:0)

这是答案。

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

谢谢。