赞
踩
随着Internet的高速发展,网络传输的数据量越来越大,各种网络数据的类型也错综复杂,特别是在主干网络上尤为更甚。运营商在带宽增加的同时没有正比的增加相应的收益,所以他们需要对各种网络数据进行分析之后,在网关或者服务器上进行优化后再传输,提高带宽利用率。要对数据进行分析,首先要对网络数据进行捕获。现今对数据捕获的软件或者库也很多,比如linux平台的libpcap库,而本设计主要是非基于libpcap平台的开源软件netsniff-ng设计的,它使用了零拷贝技术高效的捕获网络数据,而根据需求,在此只讨论网络数据的接收部分,不考虑发送部分,其实基本原理是一样的。
netsniff-ng是一个高性能的网络嗅探器,支持数据的捕获,重放,过滤等,是一个linux平台系统级的应用程序,说它是系统级的,是因为自己分析并构造协议栈来处理网络的原始数据。它的高效来源于它的零拷贝技术,通过这个技术,应用程序不再需要从内核空间拷贝数据到用户空间。具体信息可以查看它的官网。
网络设备的核心处理模块是一个被称作DMA(DirectMemory Access)的控制器,DMA模块能够协助处理器处理数据收发。对于数据发送来说,它能够将组织好的数据自动发出,无需处理器干预;对于数据接收来说,它能够将收到的数据以一定的格式组织起来,通知处理器,并等待处理器来取。
DMA模块收发数据的单元被称为BD(BufferDescription,缓存描述符,实际的操作系统中,比如Linux,BD表就是sk_buf数据结构)每个包都会被分成若干个帧,而每个帧则被保存在一个BD中。BD结构通常包含有以下字段:
- typedef struct {
- void *bufptr; /* 保存当前 BD 对应缓存的起始地址 */
- int length; /* 保存缓存中存储的数据包长度 */
- int sc; /* 保存当前 BD 的状态信息 */
- } BD_STRUCT;
所有的BD
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。