NTZC零拷贝技术

  Network Traffic Zero Copy

用于捕获报文的零拷贝计数在网络上有很多的讨论,但是目前看来还没有一个可用的、开源的实现。最接近的两个实现:

1)      PF_RING(http://www.ntop.org/PF_RING.html): 仍然存在一次的拷贝

2)      NTA(http://www.ioremap.net/projects/nta ):由于年代较为久远问题多多。

 

NTZC基本的实现原理如下:

1)专用内核模块ZC将连续的若干内存页从内核空间mmap映射到用户空间,ZC模块自行管理分配的内存,并且作为DMA地址交给网卡的驱动收发包使用;

2)网卡驱动接到的报文,如果需要交给用户空间时,该报文的描述符,即报文内存指针的页起始地址和相对偏移位置会被内核放到特定的缓冲区中,等待用户空间读取(报文的内容不向用户空间拷贝,只是传递指针和位置);

3)用户空间和内核模块之间通过共享队列读取报文描述符,并且计算出对应的用户空间地址,即可访问报文;(内核空间和用户空间的内存地址需要进行转换);

4)在报文生命周期结束之后,用户空间负责释放报文描述符对应的内存;

5)用户空间发送报文也可采用类似的方法;

6)在NTZC中大量使用无锁多读多写队列来实现跨内核和用户空间的通信,包括报文描述符的传递和内存关联,无锁多读多写队列的实现极大的简化了系统设计,并且有效实现多网卡报文的汇聚。

在NTZC设计中,认为既然用户空间可以使用足够低的成本收费报文,因此取消了网卡驱动和Linux协议栈之间的交互,当然从NTZC关联的报文内存中拷贝一份出来交给标准协议栈处理也是很容易的事情。

由于有限考虑不对内核打补丁,因此没有修改sk_buff的内存管理机制,而是实现一个和sk_buff接口语义几乎一样,但是内存内存管理机制发生变化的报文数据结构su_buff,因此使得新网卡驱动的修改移植能足够的简单。(创建一个与新驱动sk_buff接口语义一致的su_buff即可)。

NTZC提供一个配套的用户空间API接口,用来帮助应用程序方便的访问零拷贝驱动。对应的收包示例程序也包含在内。

NTZC目前已经足够的稳定,对于基于Intel 82580的网卡支持良好,理论上NTZC零拷贝可以支持多种网卡的类型,但是目前只能保证在指定的网卡硬件上正常运行。

基于Intel 82580系列网卡和NTZC的配合使用,其报文捕获性能和多核支持能力已经具备相当优秀的性能。在一定程序上足够以标准网卡的成本实现“专业流量采集卡”的核心功能(报文的捕获功能,报文过滤功能还有待添加)。

用户空间了拷贝的实现固然能够提升X86上的网络流量处理性能,但是和所有专业、非专用采集卡一样,毕竟是一种以技巧解决问题的权宜之计。如果需要实现稳定可靠高性能的流量处理方案的话,我们更建议使用专业的高性能网络流量处理平台。

MCBox: http://semptian.net/projects/openwrt/wiki/MCBox

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值