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

use*_*112 5 c linux performance kernel openonload

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

[...] 一个名为 OpenOnload 的网络驱动程序,它使用“内核绕过”技术在用户空间中一起运行应用程序和网络驱动程序,并且绕过内核。这允许连接的应用程序端以更低且更一致的延迟每秒处理更多消息。

[...]

如果您是一名开发人员或架构师,多年来一直在与上下文切换作斗争,那么内核绕过可能会让人感觉像是在作弊,但幸运的是,这完全符合规则。

执行这种内核绕过所需的功能是什么?

Ske*_*een 2

好吧,如果不知道内核如何处理网络堆栈,这个问题就无法直接回答。

一般来说,网络堆栈由很多层组成,最底层是实际硬件,通常该硬件由驱动程序支持(每个网络接口一个),网卡通常提供非常简单的接口,认为接收并发送原始数据。

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

因此,为了回答您的问题,您首先要弄清楚需要替换网络堆栈的哪一部分以及需要做什么。根据我对你的问题的理解,你似乎想要保留原始的网络堆栈,然后有时使用你自己的网络堆栈,在这种情况下,你应该真正实现策略模式,并使得可以声明哪些数据包应该由网络堆栈的哪个顶层处理。

根据 Linux 中网络堆栈的实现方式,您可能无法在不更改内核的情况下实现这一目标。在微内核架构中,网络堆栈的每个部分都是在自己的服务中实现的,这将是微不足道的,因为您只需将网络堆栈的较低部分通过管道传输到策略模式,并让此管道将输入传输到所需的网络顶层。