C++ 读取网络数据的最快方法?

C++ 读取网络数据的最快方法?,c++,c,linux,network-programming,linux-kernel,C++,C,Linux,Network Programming,Linux Kernel,我有哪些替代方法可以在尽可能快的时间内读取数据包 在用户空间中编写驱动程序? 我从来没有为网卡编写过驱动程序(尽管如果它没有编写整个操作系统那么困难,我会感兴趣?)。我是否可以获得已经存在的驱动程序代码,它必须存在于Linux中的某个地方,并将其“移植”到用户空间?Linux内核驱动程序和我的驱动程序是否会试图竞争相同的数据包 不是编写驱动程序,而是从C/C++应用程序访问堆栈后的网络数据? 我对这种方法不太了解,所以如果有人能在这里帮助我,我会感兴趣的 我对实现我自己的零拷贝技术感兴趣,以尽可

我有哪些替代方法可以在尽可能快的时间内读取数据包

在用户空间中编写驱动程序?

我从来没有为网卡编写过驱动程序(尽管如果它没有编写整个操作系统那么困难,我会感兴趣?)。我是否可以获得已经存在的驱动程序代码,它必须存在于Linux中的某个地方,并将其“移植”到用户空间?Linux内核驱动程序和我的驱动程序是否会试图竞争相同的数据包

不是编写驱动程序,而是从C/C++应用程序访问堆栈后的网络数据?

我对这种方法不太了解,所以如果有人能在这里帮助我,我会感兴趣的

我对实现我自己的零拷贝技术感兴趣,以尽可能快地获取数据包数据。这台计算机不需要使用普通的internet—它可以是两台计算机之间的专有网络连接(用于TCP和UDP)

编辑:


我的意思是延迟,而不是吞吐量

正如您所说,Linux中接收数据包的最低延迟是绕过Linux内核,这需要特殊的驱动程序。Mellanox、Solarflare、Myricom、Chelsio等公司的高端网络适配器提供内核旁路软件。例如,Mellanox声称,使用其ConnectX-3卡和VMA 6.0软件,您可以在不到2微秒的时间内收到数据包

本周,Mellanox发布了其VMA6.0的最新版本 消息传递加速器,包括增强的TCP和UDP 通过ConnectX-3 VPI适配卡提供加速支持。超低 UDP延迟低于1.4微秒,TCP套接字延迟低于1.7微秒 据报道,这种消息传递技术在几微秒内就超过了2秒 比竞争产品快两倍


我认为使用PCap应该足够快。他们还修改了linux版本,提高了性能-/

“快速”的目标是什么?如果是吞吐量,这是优化的一个分支。如果是为了响应时间,这是一个完全不同的原则。老实说,你最好只使用UDP——网络总是比协议选择更大的瓶颈。除了wallyk所说的,它必须是TCP还是UDP?它必须基于IP吗?它必须基于以太网吗?@JimGarrison这怎么可能改变答案?最快的是最快的如果你能在1米尔科上完成,那么1毫的答案不是最快的。我的问题是如何根据需求调整工作。如果要求是1ms,那么研究微秒级的方法是没有意义的。编写驱动程序的下一个层次是什么?一旦数据包通过Linux内核驱动程序代码传播完毕,我是否可以拦截这些数据包?如果我们仍然使用驱动程序,我是否可以“窃取”内核中当前的驱动程序代码并将其放在我的应用程序中?您可以在内核和用户空间之间共享缓冲区,另请参阅Intel的Jesse Brandenburg在低延迟套接字上的演示文稿是的,PF_环是一个现有的解决方案,它已经成熟。它满足了第一种方法“编写驱动程序”。最重要的是,它是免费的(在DNA中,你应该支付许可证,witch提供10G线速捕获)。