假设我想避免处理传入数据包时Linux内核的开销,而是想直接从用户空间获取数据包。我搜索了一下,似乎所有需要发生的事情都是使用带有一些套接字选项的原始套接字。是这样吗?还是比这更多地参与?如果是这样,我可以谷歌或参考为了实现这样的事情?如何实施tcp(内核)旁路?
回答
有许多内核旁路的网络技术。
首先,如果您要将消息发送到同一台计算机上的另一个进程,则可以通过共享内存区域执行此操作,而不会跳入内核。
在不涉及内核的情况下通过网络传递数据包变得更有趣,并且涉及直接访问用户内存的专用硬件。这个想法被称为RDMA。
下面是它可以工作的一种方式(这是InfiniBand硬件的作用)。应用程序使用RDMA硬件注册一个内存缓冲区。该缓冲区被固定在物理内存中,因为将其交换出来显然是不好的(因为硬件将继续写入物理内存区域)。控制区域也映射到用户空间内存中。当应用程序准备好使用缓冲区来发送或接收消息时,它会向控制区域写入命令。硬件从一端的注册缓冲区获取数据,并将其放入另一端的另一个注册缓冲区。
显然,这个级别太低了,所以有抽象使编程RDMA硬件变得更容易。 OFED动词就是这样一种抽象。
InfiniBand软件堆栈有一个额外的有趣位:用于与现有应用程序兼容的套接字直接协议(SDP)。它通过插入将标准套接字API调用转换为IB动词的LD_PRELOAD Shim来工作。
InfiniBand就是我最熟悉的。 RoCE/iWARP硬件与程序员的角度非常相似,但使用的传输方式与InfiniBand不同(使用iWarp中的卸载引擎,RoCE中的以太网)。还有/还有其他的RDMA方法(例如Quadrics)。
RDMA(是NIC的硬件特性)是否是唯一的“专有”方面?即例如IB动词似乎不是开源的,OFED也不是。 – 2012-07-30 22:06:04
OFED堆栈是[open-source](http://git.openfabrics.org)(至少在Linux上,我没有使用过Windows版本)。其中一部分在内核中,其余部分由libibverbs和朋友提供。像Mellanox这样的供应商有自己的OFED版本,包括专有的调整。另外,在硬件中发生了很多魔术,其固件是封闭的。 – 2012-07-30 22:10:15
硬件如何到达某些用户空间进程的内存?它会通过物理地址还是通过虚拟?如果虚拟 - 那么谁将IOMMU指向当前进程的页表? – osgx 2012-07-30 22:52:30
- 1. TCP国实施
- 2. Linux内核ICMP实施问题
- 3. 实施高斯模糊 - 如何计算卷积矩阵(内核)
- 4. tcp:在哪里实施3way握手
- 5. 如何实施应用内购买?
- 6. 使用SRFI-18的多核实施方案实施?
- 7. _InterlockedIncrement内在实施
- 8. 如何添加python 3.6内核旁边3.5 jupyter
- 9. PushNotifications - 如何实施
- 10. 如何实施RingFiFoBuffer
- 11. 如何实施didReceiveMemoryWarning?
- 12. 如何实施spark.ui.filter
- 13. 如何实施getElementByClassName()
- 14. Asp net核心内容安全策略实施
- 15. 搜索linux内核的tcp滑动窗口协议实现
- 16. 其中是tcp_delack_min linux tcp内核参数?
- 17. C - Linux - 内核模块 - TCP标头
- 18. Linux内核中的TCP/IP堆栈
- 19. Linux内核TCP套接字修改
- 20. linux内核TCP重传定时器
- 21. 我如何侦听内核空间中的tcp端口(freebsd)?
- 22. 如何实现opencl内核管道
- 23. 实施内联扩展
- 24. 从tcp拥塞控制访问TCP头Linux内核模块
- 25. 如何正确实施SlidingMenu.OnOpenedListener?
- 26. 如何实施UITableView部分
- 27. 如何实施Sencha Picker
- 28. 如何实施shutterstock tiker?
- 29. 如何实施acra活动?
- 30. 如何实施<ctype.h>?
什么是您试图避免的“开销”,具体是什么? – 2012-07-30 20:53:42
内核处理网络数据包时从我的应用程序切换上下文。另外,我很好奇这是如何实现的。 – 2012-07-30 20:59:53
@PalaceChan:就像现在说的那样,为了拦截数据包,你需要拥有root权限(并且与内核通信),使得所有数据包都能够遍历内核网络堆栈 – TOC 2012-07-30 21:17:28