2012-07-30 71 views
2

假设我想避免处理传入数据包时Linux内核的开销,而是想直接从用户空间获取数据包。我搜索了一下,似乎所有需要发生的事情都是使用带有一些套接字选项的原始套接字。是这样吗?还是比这更多地参与?如果是这样,我可以谷歌或参考为了实现这样的事情?如何实施tcp(内核)旁路?

+0

什么是您试图避免的“开销”,具体是什么? – 2012-07-30 20:53:42

+0

内核处理网络数据包时从我的应用程序切换上下文。另外,我很好奇这是如何实现的。 – 2012-07-30 20:59:53

+0

@PalaceChan:就像现在说的那样,为了拦截数据包,你需要拥有root权限(并且与内核通信),使得所有数据包都能够遍历内核网络堆栈 – TOC 2012-07-30 21:17:28

回答

6

有许多内核旁路的网络技术。

首先,如果您要将消息发送到同一台计算机上的另一个进程,则可以通过共享内存区域执行此操作,而不会跳入内核。

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

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

显然,这个级别太低了,所以有抽象使编程RDMA硬件变得更容易。 OFED动词就是这样一种抽象。

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

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

+0

RDMA(是NIC的硬件特性)是否是唯一的“专有”方面?即例如IB动词似乎不是开源的,OFED也不是。 – 2012-07-30 22:06:04

+0

OFED堆栈是[open-source](http://git.openfabrics.org)(至少在Linux上,我没有使用过Windows版本)。其中一部分在内核中,其余部分由libibverbs和朋友提供。像Mellanox这样的供应商有自己的OFED版本,包括专有的调整。另外,在硬件中发生了很多魔术,其固件是封闭的。 – 2012-07-30 22:10:15

+0

硬件如何到达某些用户空间进程的内存?它会通过物理地址还是通过虚拟?如果虚拟 - 那么谁将IOMMU指向当前进程的页表? – osgx 2012-07-30 22:52:30