gpt4 book ai didi

c - Raw Sockets 与 Libpcap 在发送性能方面的对比

转载 作者:太空宇宙 更新时间:2023-11-03 23:40:13 25 4
gpt4 key购买 nike

我目前正在尝试为 802.11 帧获得最佳发送性能,我使用的是 libpcap,但我想知道是否可以使用原始套接字(或任何其他可能的方法)加快速度。

考虑 libpcap 的这个简单示例代码,其中包含之前已创建的设备句柄:

char ourPacket[60][50] = { {0x01, 0x02, ... , 0x50}, ... , {0x01, 0x02, ... , 0x50} };

for( ; ; )
{
for(int i; i = 0; i < 60; ++i)
{
pcap_sendpacket(deviceHandle, ourPacket[i], 50);
}
}

此代码段在每个单独的 CPU 核心的线程上完成。对于包含存储在数组中的 Radiotap header 的原始 802.11 帧/数据包,有没有更快的方法来执行此操作?

看pcap的pcap_inject源码(函数相同,返回值不同),好像不是用raw sockets发包?没有线索。

我不关心捕获性能,因为很多其他问题已经回答了这个问题。原始套接字甚至用于发送第 2 层数据包/帧吗?

最佳答案

正如 Gill Hamilton 所说,答案取决于很多因素。如果您在一个系统上看到 super yield ,您可能不会在另一个系统上看到它们,即使两个系统都“运行 Linux”。 您最好自己测试代码。话虽如此,以下是我的团队发现的一些信息:

注意 1:所有的 yield 都来自于不仅将帧/数据包写入套接字,而且分析并处理它们的代码,因此我们的大部分或大部分 yield 很可能是在那里而不是读/写。

我们正在编写一个直接的原始套接字实现来发送/接收以太网帧和 IP 数据包。我们看到我们最微不足道的研发系统的性能提高了大约 250%-450%,该系统是一个 MIPS 24K 5V 片上系统,带有 MT7530 集成以太网 NIC/交换机,几乎不能处理持续的 80 Mbit .在带有 Intel Celeron J1900 和 I211 千兆位 Controller 的非常适中但功能更强大的测试系统上,它与 c libpcap 相比下降到大约 50%-100%。事实上,与 Python dpkt/scapy 实现相比,我们只看到了大约 80%-150%。我们只看到可能在通用 i5 Linux 双千兆位系统上比 c libpcap 实现有大约 20% 的增益。因此,根据我们的非严格测试,我们发现代码的性能提升差异高达 20 倍,具体取决于系统。

注意 2:所有这些 yield 都是在编译自定义 c 代码期间使用最大优化和最严格的编译参数时获得的,但不一定适用于 c libpcap 代码(在上述某些系统上产生所有警告错误会使 libpcap 代码不编译,谁想调试它?),所以差异可能不那么显着。我们需要挤出最后一盎司的性能,以使用不超过 5.0V 和 1.5A 的电压实现一些复杂的数据包处理,因此我们最终将使用定制的 ASIC,它可能是 FPGA。话虽这么说,要使其无错误地工作需要做很多工作,而且我们可能会实现以太网/IP/TCP/UPD 堆栈的重要部分,所以我不推荐它。

最后一点:MIPS 24K 系统上的 CPU 使用率大约是自定义代码的 1/10,但我要重申,绝大部分 yield 来自处理。

关于c - Raw Sockets 与 Libpcap 在发送性能方面的对比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47924084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com