6

假设我想避免 linux 内核在处理传入数据包时的开销,而是想直接从用户空间获取数据包。我用谷歌搜索了一下,似乎需要做的就是使用带有一些套接字选项的原始套接字。是这样吗?还是比这更复杂?如果是这样,我可以用谷歌搜索或参考什么来实现这样的东西?

4

1 回答 1

12

有许多技术可以通过内核绕过进行联网。

首先,如果您要向同一台机器上的另一个进程发送消息,您可以通过共享内存区域来执行此操作,而无需跳转到内核。

在不涉及内核的情况下通过网络传递数据包变得更加有趣,并且涉及可以直接访问用户内存的专用硬件。这个想法被称为 RDMA。

这是它可以工作的一种方式(这就是 InfiniBand 硬件所做的)。应用程序向 RDMA 硬件注册一个内存缓冲区。该缓冲区固定在物理内存中,因为将其换出显然会很糟糕(因为硬件将继续写入物理内存区域)。控制区域也映射到用户空间内存中。当应用程序准备好使用缓冲区发送或接收消息时,它会向控制区域写入命令。硬件从一端的注册缓冲区中获取数据,并将其放入另一端的另一个注册缓冲区中。

显然,这太低级了,因此有一些抽象可以使 RDMA 硬件的编程更容易。OFED 动词就是这样一种抽象。

InfiniBand 软件堆栈有一个额外的有趣之处:用于与现有应用程序兼容的套接字直接协议 (SDP)。它通过插入将标准套接字 API 调用转换为 IB 动词的 LD_PRELOAD 垫片来工作。

InfiniBand 正是我最熟悉的。从程序员的角度来看,RoCE/iWARP 硬件非常相似,但使用的传输方式与 InfiniBand 不同(TCP 在 iWarp 中使用卸载引擎,在 RoCE 中使用以太网)。RDMA 还有其他方法(例如,Quadrics)。

于 2012-07-30T21:50:07.347 回答