原始套接字与发送性能时的Libpcap

时间:2017-12-21 11:34:06

标签: c sockets network-programming libpcap raw-sockets

我目前正在尝试获得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头的原始802.11帧/数据包,有没有更快的方法呢?

查看pcap的pcap_inject源代码(功能相同但返回值不同),它似乎没有使用原始套接字发送数据包?毫无头绪。

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

1 个答案:

答案 0 :(得分:1)

正如Gill Hamilton所说,答案取决于很多事情。如果你在一个系统上看到超级收益,你可能不会在另一个系统上看到它们,即使它们都是&#34;运行Linux&#34;。 您最好自己测试代码。话虽如此,这里有一些来自我的团队发现的信息:

注1:所有的增益都是针对那些不只是将帧/数据包写入套接字的代码,而是对它们进行分析并对其进行处理,因此很可能我们的大部分或大部分增益都在那里而不是读/写。

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

注2:所有这些收益都是在编译自定义c代码时使用最大优化和最严格的编译参数,但不一定是c libpcap代码(在上述某些系统中使所有警告错误都成为libpcap代码)不编译,谁想调试?),所以差异可能不那么显着。我们需要挤出每一盎司的性能,以便使用不超过5.0V和1.5A的复杂数据包处理,因此我们最终将采用可能是FPGA的定制ASIC。话虽如此,它有很多工作要让它在没有错误的情况下工作,我们很可能会实现以太网/ IP / TCP / UPD堆栈的重要部分,所以我不会推荐它。

最后注意:MIPS 24K系统上的CPU使用率约为自定义代码的1/10,但我再说,绝大部分的收益来自处理。