Linux上的UDP和TCP的内核旁路 – 它涉及什么?

根据http://www.solacesystems.com/blog/kernel-bypass-revving-up-linux-networking :

名为OpenOnload的networking驱动程序使用内核旁路”技术在用户空间中一起运行应用程序和networking驱动程序,并绕过内核。 这允许连接的应用程序端以更低和更一致的等待时间每秒处理更多的消息。

[…]

如果你是一个开发人员或架构师,已经与内核切换进行了多年的内核旁路,可能会觉得自己是在作弊,但幸运的是,它完全在规则之内。

有什么function需要做这样的内核绕过?

好吧,所以如果不知道内核如何处理网络堆栈,问题并不是直截了当的。

在一般情况下,网络堆栈由很多层组成,其中最低的一个是实际的硬件,通常这个硬件通过驱动程序(每个网络接口一个)来支持,NIC通常提供非常简单的接口,认为接收并发送原始数据。

在这个物理连接之上,接收和发送数据的能力是很多的协议,它们也是分层的,在附近是ip协议,它基本上允许你指定信息的接收者,而在顶部你会发现TCP支持稳定的连接。

所以为了回答你的问题,你首先要弄清楚你需要替换哪一部分网络堆栈,以及你需要做什么。 从我对你的问题的理解看来,你似乎希望保持原有的网络堆栈,然后只是有时使用你自己的,在这种情况下,你应该真的只是实施策略模式,并且可以指出哪些数据包应该由网络堆栈的顶层处理。

取决于在linux中如何实现网络堆栈,如果不更改内核,您可能会也可能无法实现这一点。 在微内核体系结构中,网络堆栈的每个部分都是在自己的服务中实现的,这样做很简单,因为您只需将网络堆栈的较低部分分配给策略模式,并将该管道输入到所需的网络顶层。

TCP卸载引擎将“正常工作”,不需要特殊的应用程序编程。 它不会绕过整个内核,只是将一些TCP / IP堆栈从内核移到网卡,所以驱动程序略高一点。 内核API是一样的。

TCP卸载引擎由大多数现代千兆接口支持。

或者,如果您的意思是“在SolarFlare网络适配器的嵌入式处理器/ FPGA'应用程序载入引擎'上运行代码”,那么…这是针对卡的。 你基本上是为嵌入式系统编写代码,所以你需要说出你正在使用哪种类型的卡。

你可能想要发送和接收原始IP数据包?

基本上你需要在一个ip-packet中填写标题和数据。 这里有一些关于如何发送原始以太网数据包的例子: http : //austinmarton.wordpress.com/2011/09/14/sending-raw-ethernet-packets-from-a-specific-interface-in-c-在Linux的/

要自己处理TCP / IP,我认为你可能需要在一个定制的内核中禁用TCP驱动程序,然后编写你自己的用户空间服务器来读取原始IP。

这可能不是那么高效,但…