当前位置:   article > 正文

高性能网络数据捕获:netsniff-ng源码分析

netsniff-ng

作者:Melo Chale  转载请注明出处!新浪微博:@melochale 腾讯微博:@melochale

1.简介

随着Internet的高速发展,网络传输的数据量越来越大,各种网络数据的类型也错综复杂,特别是在主干网络上尤为更甚。运营商在带宽增加的同时没有正比的增加相应的收益,所以他们需要对各种网络数据进行分析之后,在网关或者服务器上进行优化后再传输,提高带宽利用率。要对数据进行分析,首先要对网络数据进行捕获。现今对数据捕获的软件或者库也很多,比如linux平台的libpcap库,而本设计主要是非基于libpcap平台的开源软件netsniff-ng设计的,它使用了零拷贝技术高效的捕获网络数据,而根据需求,在此只讨论网络数据的接收部分,不考虑发送部分,其实基本原理是一样的。


2.netsniff-ng介绍

netsniff-ng是一个高性能的网络嗅探器,支持数据的捕获,重放,过滤等,是一个linux平台系统级的应用程序,说它是系统级的,是因为自己分析并构造协议栈来处理网络的原始数据。它的高效来源于它的零拷贝技术,通过这个技术,应用程序不再需要从内核空间拷贝数据到用户空间。具体信息可以查看它的官网。


3.高性能数据捕获的思想

网络数据接收流程原理(驱动层描述)

网络设备的核心处理模块是一个被称作DMADirectMemory Access)的控制器,DMA模块能够协助处理器处理数据收发。对于数据发送来说,它能够将组织好的数据自动发出,无需处理器干预;对于数据接收来说,它能够将收到的数据以一定的格式组织起来,通知处理器,并等待处理器来取。

DMA模块收发数据的单元被称为BDBufferDescription,缓存描述符,实际的操作系统中,比如LinuxBD表就是sk_buf数据结构)每个包都会被分成若干个帧,而每个帧则被保存在一个BD中。BD结构通常包含有以下字段:

  1. typedef struct {
  2. void *bufptr; /* 保存当前 BD 对应缓存的起始地址 */
  3. int length; /* 保存缓存中存储的数据包长度 */
  4. int sc; /* 保存当前 BD 的状态信息 */
  5. } BD_STRUCT;

所有的BD

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/368975
推荐阅读
相关标签
  

闽ICP备14008679号