下面是答案。
这是主要问题。
- 我有10千兆以太网接口,电流为6-7 Gbit/秒
- 我需要实现一个防火墙,然后我需要捕获原始数据包来过滤一些数据包
-
简单地说,我开始实现作为一个原始套接字所需的代码如下。套接字绑定到特定接口。
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));
-
以下是我的阅读方式,mtu大小为9000
while(true) recvfrom(socketfd,buffer,9000,0,0,0);
-
在没有对数据包进行任何处理的情况下,我得到了大约150Mbit/秒。
这是我需要解决的问题。我意识到nload或ip-s链接显示了实际速率;但我无法达到6-7Gbit/秒左右的数字。
~150Mbit/sec的速度对我来说太荒谬了。我需要用一个CPU尽可能多地提高性能。我会尝试使用PF_INET,如果你愿意,我可以分享它的结果。
- 首先,捕获速度不仅取决于接口上的字节大小,数据包的数量也很重要。因此套接字编程也受到数据包数量的限制。我测量为每秒20万个数据包(pps(
- 使用更好的网络驱动程序是提高pps的一种方法。PF_RING是可能的库和驱动程序。您可以使用试用版进行测试。我只是在我的网络上测试它,结果是1400万pps。那么这个速率几乎是10Gbit/sec。这就是我所经历的一切
谢谢大家。