基于libpcap捕获数据包的开发
基于libcap、winpcap的网络编程

第五章基于libpcap的网络编程技术5. 1常见的包捕获机制简介包捕获就是利用以太网的介质共享的特性,通过将网络适配器设置为混杂模式的方法,接收到所有网络上的以太网帧。
包捕获的机制大致可以分为两类:一类是由操作系统内核提供的捕获机制。
另一类是由应用软件或系统开发包捕获驱动程序提供的捕获机制。
常见的包捕获机制如表5-1所示。
其中最主要的是下列4种:BPF ( Berkeley Packet Filter )DLPI ( Data Link Provider In terface )NIT ( Network In terface Tap ) SOCK-PACKET 类型套接口。
BPF由基于BSD的Unix系统内核所实现。
DLPI是Solaris (和其他System V UNIX ) 系统的内嵌子系统。
NIT是SUN OS4 系统的一部分,但在Solaris /SUN OS5 中被DLPI 所取代。
Linux核心则实现了SOCK-PACKET 的包捕获机制。
从性能上看,BPF比DLPI 和NIT 好得多,SOCK-PACKET 最弱。
表5-1常用的包捕获机制由于现在很多局域网为NT网,其网络传输方式大多采用以太网标准,所以涉及的编程也是在Windows 环境下实现的。
Windows 操作系统没有提供包捕获机制,只提供了数量很少并且功能有限的API调用。
在Windows 环境下由于其自身的封装性,很难对其底层进行编程。
本章将对BSD系列的libpcap进行深入地介绍。
5.2 Libpcap 与 BPF(1) libpcap 概述libpcap(Packet Capturelibrary),即数据包捕获函数库。
该库提供的 C 函数接口可用于捕获经过网络接口 (只要经过该接口,目标地址不一定为本机)的数据包。
它是由洛仑兹 伯克利试验室的研究人员 Steven McCanne 和Van Jacobson 于1993 年在Usenix'93 会议上正式提出的一种用于 Unix 内核数据包过滤体制。
网络数据包的获取与libpcap应用

载波监听
指在以太网中的每个站点都具有同等的权利, 指在以太网中的每个站点都具有同等的权利,在传输自己 的数据时,首先监听信道是否空闲,如果空闲, 的数据时,首先监听信道是否空闲,如果空闲,就传输自 己的数据,如果信道被占用,就等待信道空闲。 己的数据,如果信道被占用,就等待信道空闲。 冲突检测 为了防止发生两个站点同时监测到网络没有被使用时而产 生冲突。以太网采用广播机制 广播机制, 生冲突。以太网采用广播机制,所有与网络连接的工作站 都可以看到网络上传递的数据。 都可以看到网络上传递的数据。
数据包接收过程
二、以太网
以太网最初是由XEROX公司研制 并且在 公司研制,并且在 以太网最初是由 公司研制 并且在1980年由数据 年由数据 设备公司DEC(DIGIAL EQUIPMENT CORPOR ATION)、 设备公司 、 INTEL公司和 公司和XEROX公司共同使之规范成形。后来它被作 公司共同使之规范成形。 公司和 公司共同使之规范成形 802.3标准为电气与电子工程师协会 IEEE)所采纳。 标准为电气与电子工程师协会( 为802.3标准为电气与电子工程师协会(IEEE)所采纳。 以太网是最为流行的网络传输系统之一。 以太网是最为流行的网络传输系统之一。以太网的基本 特征是采用一种称为载波监听多路访问 冲突检测CSMA/CD 载波监听多路访问/冲突检测 特征是采用一种称为载波监听多路访问 冲突检测 (Carrier Sense Multiple Access/ Collision Detection)的 的 共享访问方案。 共享访问方案。
TCP/IP与以太网 TCP/IP与以太网
以太网和TCP/IP可以说是相辅相成的。 可以说是相辅相成的。 以太网和 可以说是相辅相成的 以太网在一二层提供物理上的连线,使用48位的 以太网在一二层提供物理上的连线,使用 位的MAC地址 地址 位的 TCP/IP工作在上层,使用 位的 地址 工作在上层, 位的IP地址 工作在上层 使用32位的 两者间使用ARP和RARP协议进行相互转换。 协议进行相互转换。 两者间使用 和 协议进行相互转换
Libpcap网络抓包(linux C)

1. 入门使用篇本篇讲述如何抓包最简单的libpcap抓包程序只要有以下几句就可以了char ebuf[PCAP_ERRBUF_SIZE];pcap_t *pd = pcap_open_live("eth0", 68, 0, 1000, ebuf);建立libpcap捕捉句柄,若出错,ebuf返回错误字串.ebuf可以为NULL(以后同)struct bpf_program fcode;pcap_compile(pd, &fcode, NULL, 1, 0);添写过滤规则串fcode,可以为空(即第三个参数,格式在后面讲到)pcap_setfilter(pd, &fcode);给pd 设置上过滤规则pcap_loop(pd, 10, eth_printer, NULL);主循环,开始抓包,共抓10个(由第二个参数指定),抓到包后就进入函数eth_printerpcap_close(pd);结束这个就是最简单的程序了,其中还有个不明,在pcap_loop参数eth_printer的类型是pcap_handler,pcap_handler定义如下: typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *,const u_char *);当然要包含#include "pcap.h"编译要加上-lpcap至于怎么得到libpcap,还有安装,我就不费话了本文版权所有:doggy(chaujy@) 欢迎转载2. 使用进阶篇刚才我们对程序的要求是能编译通过,能运行成功现在我们让这个程序实用点吧2.1 其它几个函数介绍这几个函数的特点是简单但无关紧要现在我们隆重退出char * pcap_lookupdev ( char * errbuf );这个函数就是查找本机上的网络接口设备,我机器上就返回"eth0",在pcap_open_live之前用,没什么意思吧,反正我是不爱用它int pcap_lookupnet(char *, bpf_u_int32 *, bpf_u_int32 *, char *);第一个参数就是pcap_lookupdev返回的接口名,二三参数都是32位无符号数, 分别是IP网段和掩码,最后那个参数还是ebufint pcap_datalink(pcap_t *);它返回你的网络类型,如DLT_EN10MB 就是10M以太网int pcap_snapshot(pcap_t *);返回最长抓多少字节,就是我们在pcap_open_live中第二个参数设置的int pcap_stats(pcap_t *, struct pcap_stat *);计数,共抓了多少过滤掉了多少,看看struct pcap_stat的定义就明白了struct pcap_stat {u_int ps_recv; /* number of packets received */u_int ps_drop; /* number of packets dropped */u_int ps_ifdrop; /* drops by interface XXX not yet supported */};int pcap_major_version(pcap_t *);int pcap_minor_version(pcap_t *);版本号,你有用么?我的eth_printer如下void eth_printer(u_char * user, const struct pcap_pkthdr * h, const u_char * p) {printf("I get one packet! ");}简单吧:*)2.2 现在的程序(C++)文件名p.cxx#ifdef __cplusplusextern "C" {#endif#include#ifdef __cplusplus}#endifvoid printer(u_char * user, const struct pcap_pkthdr * h, const u_char * p){printf("I get one packet! ");/* 哈哈,我都想喝一杯庆祝一下了! */}#define DEFAULT_SNAPLEN 68/* 别问我为什么是68,我从tcpdump看来的*/int main(){char ebuf[PCAP_ERRBUF_SIZE];char *device = pcap_lookupdev(ebuf);bpf_u_int32 localnet, netmask;pcap_lookupnet(device, &localnet, &netmask, ebuf);printf("%u.%u.%u.%u", localnet&0xff, localnet>>8&0xff,localnet>>16&0xff, localnet>>24&0xff); /*本地IP网段号*/printf(":%d.%d.%d.%d ", netmask&0xff, netmask>>8&0xff,netmask>>16&0xff, netmask>>24&0xff); /*本地IP掩码*/struct pcap_t *pd = pcap_open_live(device, DEFAUL T_SNAPLEN, 0, 1000, ebuf);if(pcap_datalink(pd) == DLT_EN10MB)printf("10Mb以太网");struct bpf_program fcode;pcap_compile(pd, &fcode, NULL, 1, 0);pcap_setfilter(pd, &fcode);pcap_loop(pd, 10, printer, NULL);struct pcap_stat stat;pcap_stats(pd, &stat);printf("recv %d, drop %d. ", stat.ps_recv, stat.ps_drop);pcap_close(pd);}#gcc p.cxx -lpcap#./a.out166.111.168.0:255.255.252.010Mb以太网I get one packet!I get one packet!I get one packet!I get one packet!I get one packet!I get one packet!I get one packet!I get one packet!I get one packet!I get one packet!recv 10, drop 0.#重要提示: libpcap 程序需要root权限2.3 出错处理象其它库一样,libpcap 也有自己的错误处理机制基本上每个函数都有返回值,出错时返回值<0,另外有如下函数void pcap_perror(pcap_t *, char *);char *pcap_strerror(int);char *pcap_geterr(pcap_t *);前两个和perror() strerror() 用法相同,最后一个也很简单在pcap_t 中有一个成员存了错误字串struct pcap {...char errbuf[PCAP_ERRBUF_SIZE];};所以......于是我们在刚才的程序中加上错误处理先加一个函数#includeint err_quit(const char *fmt, ...){va_list ap;va_start(ap, fmt);vfprintf(stderr, fmt, ap);va_end(ap);exit(-1);}之后处理每个函数的异常,在成功建立捕捉句柄pcap_t *pd前,使用ebuf参数char *device = pcap_lookupdev(ebuf);if(device == NULL)err_quit("%s", ebuf);有了句柄pd后if(pcap_compile(pd, &fcode, NULL, 1, 0) < 0)err_quit("%s", pcap_geterr(pd));注意不是每个函数都是出错返回<0pcap_datalink(pd)和pcap_snapshot(pd)等可不要这么处理2.4 参数初步研究前面使用各函数时,并没有具体说明每个函数的意义,现在来探讨一下pcap_t * pcap_open_live(char *device, int snaplen, int promisc,int to_ms, char *ebuf)device指定设备,snaplen指定最长抓多少字节,ebuf出错信息,前面都说过promisc指出是否设置为混杂模式(不懂?我也不懂,整个网都听还有什么安全性可言) to_ms设置超时时间,单位millisecondsint pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)cnt为要抓的包数,pcap_loop在正常时抓cnt个包后返回,异常时返回值<0user是要传入callback()的数据,例如我们把上面的程序修改几行file://pcap_loop(pd, 10, printer, NULL);pcap_loop(pd, 10, printer, (u_char*)pd);再在printer()内加pcap_stat stat;pcap_stats((pcap_t*)user, &stat);printf("recv %d, drop %d. ", stat.ps_recv, stat.ps_drop);再编译运行后输出为166.111.168.0:255.255.252.010Mb以太网recv 1, drop 0.recv 2, drop 0.recv 3, drop 0.recv 4, drop 0.recv 5, drop 0.recv 6, drop 0.recv 7, drop 0.recv 8, drop 0.recv 9, drop 0.recv 10, drop 0.recv 10, drop 0.int pcap_compile(pcap_t *p, struct bpf_program *program,char *buf, int optimize, bpf_u_int32 mask)该函数用于解析过滤规则串buf,填写bpf_program结构.optimize为1表示对过滤规则进行优化处理netmask指定子网掩码buf的格式比较复杂int pcap_setfilter(pcap_t *handle, struct bpf_program *filter)把pcap_compile()构造的filter设置到handle上。
libpcap 原理

libpcap 原理libpcap是一个在Unix和Linux系统中用于捕获网络数据包的库。
它提供了一组API,可以让开发人员编写程序来捕获和分析网络数据包。
libpcap使用底层的网络接口来捕获数据包,并提供了丰富的功能来处理和过滤数据包。
libpcap的原理是通过底层的网络接口来捕获数据包。
它可以打开网络接口设备,如网卡,以接收传入和传出的数据包。
一旦网络接口被打开,libpcap将监听网络接口上的所有数据包,并将它们传递给应用程序进行处理。
libpcap的捕获原理是基于数据包的抓取和过滤。
当网络接口捕获到一个数据包时,libpcap会将数据包的内容封装到一个数据结构中,并将其传递给应用程序。
应用程序可以使用libpcap提供的API来访问数据包的各个字段,如源IP地址、目的IP地址、协议类型等。
libpcap还提供了一系列的过滤功能,使应用程序能够选择性地捕获数据包。
过滤功能是通过一个过滤表达式来实现的,该表达式定义了一组过滤规则。
当一个数据包被捕获时,libpcap会将其与过滤规则进行匹配,只有匹配规则的数据包才会被传递给应用程序。
除了捕获数据包,libpcap还提供了一些其他功能,如统计网络接口的数据包流量、重新发送数据包等。
这些功能可以帮助开发人员更好地理解和分析网络流量。
libpcap的应用非常广泛。
它可以用于网络安全领域,如入侵检测系统、网络监控和流量分析等。
它还可以用于网络协议分析,如解析网络协议的数据包、重组网络流等。
此外,libpcap还可以用于网络应用开发,如网络协议的实现和测试等。
尽管libpcap在网络数据包捕获方面非常强大和灵活,但也存在一些局限性。
由于libpcap是在用户空间中运行的,因此它无法直接访问内核数据结构和网络设备的硬件功能。
这意味着libpcap无法捕获一些特定的数据包,如内核过滤、虚拟局域网(VLAN)标记等。
此外,由于libpcap是基于网络接口的捕获,因此在高速网络中可能会有数据包丢失的情况。
使用libpcao捕获数据报

使用libpcao捕获数据报摘要:随着网络技术的迅速发展和网络应用的普及,越来越多的信息资源在互联网上共享,网络的安全性和可靠性显得越发重要。
网络嗅探器已经被广发的应用与模拟网络通信以及测试网络性能等。
在网络信息的探测和收集应用中有很高的应用价值。
嗅探技术作为网络安全攻防中最基础的技术,既可以用于获取网络中传输的大量敏感信息,也可以用于网络管理。
通过获取网络数据包的流向和内容等信息,可以进行网络安全分析和网络威胁应对。
而基于libpcap的捕获数据报程序起着很大作用。
关键词:网络嗅探;libpcap ;数据报一、Libpcap简介libpcap是由洛仑兹伯克利国家实验室编写的Linux平台下的网络数据包捕获函数库,是一种与系统无关,用于访问数据链路层,是一个独立于系统接口的用户级捕包函数据库,为底层的网络数据提供了可移植框架,它的应用包括网络统计、安全监听、网络调试、性能测量、入侵检测、口令拦截等。
Libpcap可以在绝大多数类Unix平台下工作,绝大多数的现代操作系统都提供了对底层网络数据包捕获的机制,在捕获机制之上可以开发网络监控应用软件。
采用Libpcap 实施网络数据包捕获时,将要用到一个重要的函数pcap_ open_live0,它的函数原型是:pcap_t*pcap_open_live(const char* device,int snaplen,int promisc,int to_ms,char* ebuf)。
其中,如果device为NULL或any,则对所有接口捕获,snaplen 代表用户期望的捕获数据包最大长度,promisc代表设置接口为混杂模式,捕获所有到达接口的数据包,但只有在设备给定的情况下才有意义,to_ms代表函数超时返回的时间。
二、Libpcap进行数据捕获和分析的步骤使用libpcap进行数据报捕获和分析的步骤如下:(1)使用函数pcap_findalldevs()获取设备刘表;(2)使用函数pcap_lookupnet()获取网络地址和子网掩码;(3)使用函数pcap_open_live()打开指定的设备;(4)使用函数pacp_compile()编译过滤规则;(5)使用函数Pcap_setfilter()设置过滤规则;(6)使用函数Pcap_loop()来循环捕获数据报,并在该函数中调用数据报分析模块解析数据报;(7)使用函数pcap_close()关闭设备句柄;三、使用libpcap捕获数据报的关键代码使用libpcap关键是获取网络设备列表信息,获取网络地址和子网掩码,打开指定设备,过滤表达式,捕获数据报。
tcpdump原理之利用libpcap实现抓包

tcpdump原理之利用libpcap实现抓包tcpdump原理之利用libpcap实现(转载请标明出处,请勿用于商业用途)/linux_embedded/article/details/8826429Linux下赫赫有名的抓吧工具tcpdump,想必使用过的人都十分的清楚。
但是,其实现的原理却很少人提及过,今天就tcpdump的实现原理做简单的介绍。
tcpdump 首先利用libpcap工具,将linux网络栈中的数据包抓取上来,然后,tcpdump在按照用户的需求完成数据包的分析工作。
下面就如何通过libpcap实现数据包的抓取做简单的介绍。
开始:libpcap的使用方式首先,我们需要了解一下pcap 嗅探器使用的一般布局,下面分为几个部分简单介绍。
1.首先我们需要定义我们需要使用的网络接口。
在linux下,我们一般会定义eth0或ethx。
在BSD下,可能是xl1。
我们可以把网络接口定义为字符串,或者可以通过pcap获得可用的网络接口的名字。
2.初始化pcap。
现在,我们可以将我们将要监听的网络设备告诉pcap。
如果有需要的话,我们可以使pcap同时监听多个网络接口。
我们可以通过“文件句柄”来区分不同的网络接口,就像我们打开文件进行文件的读取、写入一样,我们必须定义区分我们的监听“回话”,否则我们没有办法区分不同的监听对象(网络设备)。
3.如果我们仅仅想监听特殊的网络数据(例如,我们想监听TCP 业务,或者我们只想监听端口号为23的业务)。
我们可以自己定义一个监听规则的集合,“编译”它,然后在应用它。
上面三个步骤,连接的十分紧密,那一个步骤都不能丢掉。
规则其实就是定义好的字符串,我们需要将其转化为pcap可以是别的格式(所以我们需要编译)。
“编译器”仅仅通过内置的函数就可以实现上述的格式转换。
然后我们可以告诉pcap执行规则完成数据包的过滤。
4.之后,我们会告诉pcap进入主要的循环执行状态。
基于libpcap捕获数据包的开发

在对数据进行捕获时, 主要有两种方法: 1. 主要借助原始套接字Socket , 套接字是网络应用编程接口, 应用程序可以使用它进行网络通信发送和接收网络层以上的原始数据包, 而对底层的细节是透明的. 2. 使用系统抓包库Libpcap 和Winpcap, 通过数据链路层获取以太帧, 可以从网卡捕获或者发送原始数据包, 同时能过滤及存储数据包.这种方式的捕获是工作在网络底层数据链路层,能拦截所有正在网络上传送的数据包,并且可以通过相应的处理,从而实时的分析数据包的内容,使用数据包捕获函数来获得底层数据。
2. 1 Libpcap 方法开发的过程采用Libpcap捕获网络数据包的开发过程. 主程序的流程如下图所示:捕获网络数据包过程按以下步骤进行, 程序开发过程中主要语句的实现:char * dev, errbuf [ PCAP- ERRBU FSIZE]; / / 定义接口设备名和缓冲区的大小pcap- t p; / / 捕获数据包句柄, 非常重要的数据结构int snaplen = 65535; / / 代表用户期望的捕获数据包最大长度int t imeout= 1000; / / 代表函数超时返回的时间( 1) 进行本地网络设置检测, 获得网络接口设备. 调用函数dev= pcap- lookupdev ( er rbuf ) . Linux中最常见的接口设备名eth0 和lo, 而eth0 对应了实际的网卡, 数据包的传输都要经过eth0.( 2) 设备找到后, 打开以准备捕获数据包. 调用的主函数是p = pcap- open- live ( dev, snaplen, 1,timeout , errbuf ) , 根据给定的接口设备名dev, 获得一个结构为pcap- t 的捕获句柄p, 函数中的1 代表设置接口为混杂模式. ( 3) 若用户设置了过滤条件, 则编译和安装过滤代码. 编译过滤规则调用函数pcap- compile( p,&f ilter , f ilter- app, 0, net ) , 函数将规则字符串转化为内核过滤程序. 根据过滤规则设置过滤器pcap- set filter( p, &filter) 传给BPF, 由BPF 过滤器捕获用户所需要的数据包.( 4) 反复捕获数据包. 调用pcap- loo p( p, cnt ,packet - print , NULL) 进入循环捕获, 对捕获的数据包处理放在回调函数( 如packet - print ( ) ) 中进行.( 5) 关闭设备. 调用pcap- close ( p) , 将打开设备时得到的结构为pcap- t 的捕获句柄, 作为参数传入.2. 2 对数据包处理的回调函数的开发过程在实现对捕获的数据包处理的回调函数packet- print ( ) 中, 具体分析的流程如图所示:函数中主要语句的实现:/ / 对以太头部进行分析, 判断所包含的数据包类型, 做进一步的处理/ / 对捕获的数据进行类型转换, 转化成以太数据包类型eth= ( st ruct ether - header * ) p;/ / 若以太帧的协议类型为TCP/ IPif ( eth-> ether - type = = nto hs ( ETHERTYPE-IP) ){ ⋯/ / 获取IP 头信息iph= ( st ruct ip * ) ( p + sizeof ( st ruct etherheader) ) ;⋯/ / 判断上层协议是否为T CP 协议if( iph-> ip- p= = 6){ ⋯/ / 获取TCP 头信息tcph= ( st ruct tcphdr * ) ( p + sizeof ( st ructether- header) + 4 * iph-> ip- hl ) ;⋯/ / T CP 包内容的长度tcplength = ntohs ( iph-> ip- len) -4 * iph->ip- hl-4* tcph-> doff ;⋯/ / T CP 包的数据内容data= ( u- char * ) ( p+ sizeof ( st ruct etherheader) + 4* iph-> ip- hl+ 4* tcph-> doff ) ;⋯/ / 申请一长度为tcplength 字符串变量tcpdata= ( u- char * ) malloc( tcpleng th) ;⋯/ / 把T CP 内容拷贝到tcpdata 变量中memcpy ( tcpdata, data, tcplength) ;⋯}⋯}if ( eth-> ether - type = = nto hs ( ETHERTYPE-ARP) )⋯由于在以太帧首部含有协议类型字段, 所以可进一步实现上层协议包的首部提取. 对IP 报头首部提取, 从中可获取源和目的地址; 对T CP 报文段首部提取, 从中可获取源和目的端口号; 若想获取数据包的更多内容, 可继续分析上层协议, 做进一步处理. 至此完成了捕获网络数据包工具的开发工作.文章编号:1004-9762(2007) 02- 0152-05Linux系统中基于PF_RING套接字的高性能包捕获技术顾瑞春, 谭跃生, 贾元春, 王静宇( 内蒙古科技大学网络中心内蒙古包头 014010)关键词:数据包捕获; 设备轮询;环形缓冲区; PF_RING套接字中图分类号:TP393文献标识号:A摘要:介绍一种新型的数据包捕获方式基于PF_RING套接字的数据包捕获技术. 旨在提高高速复杂网络传输环境中的数据包捕获率.使用环形缓冲区, 用来实现内核空间和用户空间的内存共享,用户空间可以直接对其进行读写操作,而且可以对该缓冲区的大小进行调整配置. 经过实验, 在100M甚至Gbit 网络环境中, 结合设备轮询机制,在普通的PC机上便可以显示出其突出的数据包捕效率. Thehighperformancepacket capturebasedonthePF_RINGsocket inLinuxGURui chun, TANYue sheng, JIAYuan chun,WANGJing yu( NetworkCenter,Inner MongoliaUniversity of Science andTechnology,Baotou 014010,China)Keywords: packet capture;dev_polling;ring buffer; PF_RINGsocketAbstract:Many networkmonitoring toolsarebasedonpacket capture, but theperformance of these popular tools isnot satisfactory. Herein, a newmethodbasedonPF_RINGSocket wasusedto improve the performanceof the packet capture under the heavy computer traffics.The ringbuffer inthekernel canbe accessedandconfiguredfreely by the applications of the user space.The experimental result shows that, combined withthedev_polling,thePF_RINGsocket canimprove the performance of the packet capture significantly,eveninthe 100Mor the Gbit network.1概述大多数的网络安全、审计、计费产品都是以数据包捕获技术作为其工作基础的. 随着网络技术的发展, 数据包捕获技术也经历了几个不同的阶段.在Linux2. 2版内核以前, 基本上使用Ipchains来实现系统对网络传输的一个基本的控制; 到了2.4版内核以后Netfilter 的出现, 显示出了很大的优势, 开发人员可以通过Netfiler 提供的各个钩子函数( hook) 来挂接自己编译过的程序, 来实现某些功能. Netfilter的出现使得数据包捕获技术有了新的飞跃. 随着网络带宽的不断增加, 网络传输速率的提高, 很多的数据包捕获工具已经渐渐显示出不足, 无法满足当前复杂的网络环境. 目前, 使用较为广泛的Sinffer, wireshark等数据包分析软件, 都是基于一个叫做LibPcap的函数库( Windows下的WinPcap[ 1]) 实现的, 这个API 提供了一整套的包捕获机制. 在Windows和Unix 系统下显示出了一定的优越性. LibPcap的主要特点如下[ 2]:(1) 可从以太网、虚拟接口等网络接口捕获数据包; ( 2) 平台无关性;( 3) 具有基于BPF的数据包过滤特性. 完善了系统的数据包过滤体系.在100M线速、数据包大于200K的网络环境2007年6月第26卷第2期内蒙古科技大学学报Journal of Inner Mongolia University of Science andTechnologyJune,2007Vol.26,No.2收稿日期: 2007-03-09基金项目: 内蒙古高校科研基金资助项目(NJ04021)作者简介: 顾瑞春(1982-), 男, 内蒙古武川人, 内蒙古科技大学硕士研究生, 主要从事计算机网络及信息安全研究.中, 其表现比较好, 几乎没有丢包现象. 但是, 一旦处于高速复杂网络环境中, 例如Gbit 线速、数据包长度小于100K的条件下, LibPcap便有些力不从心,随着数据包量的增加和包长度的减小, LibPcap的丢包率成上升趋势. 就是在Window环境下的基于WinPcap的网络监控系统也难以避免瓶颈现象[ 3].经过分析, 发现在复杂网络环境中, 丢包率上升的原因是在捕包过程中, CUP一直处于接收中断状态, 而没有把时间用于处理数据包的过程中来, 也就是进入了系统的中断活锁状态.为了解决这个问题, Unix系统采用了一种叫做设备轮询的机制[ 4], 这种机制的具体特点如下:( 1) 当网卡接收到一个数据包, 便产生一个中断信号给系统;( 2) 系统进行如下操作:关闭网卡中断;!激活轮询进程, 对该网卡进行轮询;∀打开网卡中断.在Linux系统中, 称这种技术为NAPI[ 5]技术.NAPI技术的使用, 确实在很大程度上提高了系统的数据包捕获效率, 克服了中断活锁现象[ 6]. 在高负载网络环境下, 设备轮询机制( dev_polling) 大幅度增强了数据包捕获能力和系统响应速度.2 PF_RING套接字在大数据包的网络环境下, 设备轮询机制表现出了较高的捕包能力, 但是在小包大流量的网络环境下, 设备轮询机制虽然比LibPcap的表现好了很多, 但依然难以达到让人满意的程度.表1, 2是在我们进行实验后得出的结论.表1数据包捕获率比较Table 1Percentageof thepacket capture数据包长度/KLinux2.6.1Linux 2.6.1+ LibpcapFreeBSD4.864 0.3% 1% 25%512 1.1% 6% 31%1024 4.3% 10.5% 42%从表1, 2中的数据来看, 在使用了设备轮询机制之后, 各个系统都有了显著的提高. 但是, 在Linux系统和FreeBSD系统之间, 丢包率有着很大的差距.如表1所示, 数据包大小为64K, Linux2. 6. 1内核中使用Libpcap机制的捕包率仅为1%, 而FreeBSD4. 8中的捕包率却高达25%. 表2中的各项也说明它们之间的丢包率有明显差距.经过进一步分析, 在数据包捕获的过程中, CPU的多数时间都被用在把网卡接收到的数据包经过内核的数据结构队列发送到用户空间的过程中. 也就是说是从网卡到内核, 再从内核到用户空间, 这两个步骤, 花去了大量CPU时间, 而没有其他时间用来进行数据包的进一步处理.表2数据包捕获率比较( 轮询)Table 2 Percentage of capturedpacketsusingkernel polling 数据包长度/KLinux2.6. 1+NAPILinux 2.6. 1+NAPI+LibpcapFreeBSD4. 8+DevPolling64 2.5% 14.9% 97.3%512 1.1% 11.7% 47.3%1024 34.3% 93.5% 56.1%基于轮询机制的不足, 在轮询机制的基础上, 提出一种新的包捕获套接字模型[ 7]:( 1) 提出一种基于环形缓冲区的新的套接字PF_RINGSocket;( 2) 每创建一个PF_RING套接字便分配一个环形缓冲区, 当这个套接字结束时释放这个缓冲区. 不同的套接字拥有不同的环形缓冲区; 如果把PFRING套接字绑定到某一网卡上, 这块网卡在这个套接字结束前, 处于只读状态, 当数据包到达网卡时,将其放入到环形缓冲区, 如果缓冲区已满, 则将其丢弃;( 3) 用户空间可以直接访问这个环形缓冲区中的数据;( 4) 当有新的数据包到来时, 可以直接覆盖掉已经被用户空间读取过的那个数据包的空间.用户程序可以对环形缓冲区的大小进行设置.在使用了PF RING之后, 系统的数据包捕获效率有显著提高. 具体实验数据见表3.PF RING套接字的基本模型如图1. 在应用层的各个应用程序可以建立自己的不同的套接字模型, 用来接收和发送数据, 每一个环形缓冲区可以实现读写功能. 在网卡接收到新的数据包之后, 就将其153 顾瑞春等:Linux系统中基于PF_RING套接字的高性能包捕获技术直接写入到环形缓冲区中, 以便应用程序直接对其进行读操作. 而如果应用程序需要向外发送数据包时, 也可以直接将数据包写入到环形缓冲区, 以便网卡驱动程序将该数据包发送到相应的接口上[ 8].表3使用PF RING套接字后的包捕获效率Table 3 Percentage of capturedpacketsusingPF RING 数据包长度/KLinux 2.6.1+ NAPILinux 2.6.1+ NAPI+ LibpcapLinux 2. 6.1+ NAPI+ PF RING64 2.5% 14.9% 73. 2%512 1.1% 11.7% 45. 1%1024 34.3% 93.5% 91. 8%图1 PF RING套接字结构Figur 1 The Architecture of PF RINGSocket 在数据包捕获的实例中, 我们只使用数据包从网卡经过内核环形缓冲区到达用户空间应用程序的过程; 但是, 如果这台机器将要对数据包进行转发,那么数据包从应用程序到达内核环形缓冲区, 然后再从网卡发送出去, 这个过程也是相当重要的, 其效率和数据包捕获是相同的, 只是读写顺序不同而己.PF RING套接字的主要优势有以下几点:( 1) 数据包并没有列入内核队列中, 而是直接拷贝到环形缓冲区;( 2) 用户空间可以直接访问环形缓冲区;(3) 即使系统不支持轮询机制, 使用PF RING套接字也是相当稳定的. 因为这里用于处理中断的时间相当短暂;( 4) 不用的应用程序可同时打开多个PF RING套接字.3 PF RING套接字的实现PF RING套接字是笔者为了减少网络层传输中的内存拷贝即避免频繁的系统调用而设计的一种新的套接字类型, 这种套接字采用模块方式动态加载. 其中的具体结构如下[ 8]:环形缓冲区簇结构:struct ring cluster{u short cluster id; / / 缓冲簇idu short num cluster elements;enumcluster typehashing mode;u short hashing id; / / 哈希表id##};环成员结构:struct ring element{struct list headlist; / / 链表头struct sock*sk;};环操作结构:struct ring opt{struct net device*ring netdev; / / 设备u short ring id; / / 环idu short cluster id##};采用模块方式加载, 模块初始化函数:staticint init ring init( void){ring table=NULL; / / 调用套接字注册函数sock register(&ring family ops) ; / / 注册环形句柄set ring handler( my ring handler) ;return0;};该函数调用sock register( ) 函数将PF RING套接字协议族注册到系统的全局套接字协议族数组net family中, 以便用户层调用sock( ) 函数创建PF RING套接字时, 系统能够从net family数组中找到相应的记录和create( ) .模块清理函数ring exit( )staticvoid exit ring exit( void){154 内蒙古科技大学学报 2007年6月第26卷第2期set skb ring handler( NULL) ; / / 清除环形句柄set buffer ring handler( NULL; / / 缓冲区句柄sock unregister( PF RING) ; / / 调用套接字清除函数ring proc term( ) ;};清除注册信息, 停止运行. 退出系统内核.4 PF RING套接字的使用如果需要使用PF RING套接字, 则需要在用户层调用sock( ) 函数, 并且传递PF RING标志、SOCK RAW以及ETH IP ALL3个参数, 这3个参数必须完全匹配. Sock( ) 函数执行成功则将PFRING套接字描述符返回给用户空间, 应用程序就可以利用这个描述符操作相应的设备轮询机制了.接下来的一个重要操作是调用bind( ) 函数, 切入内核以后调用的sys bind( ) 函数, 最终实际调用的是相应套接字协议族自己定义的bind方法, 而对于PF RING套接字协议族来说, 就是调用ringbind( ) 函数, 事实上, ring bind( ) 函数最终调用packet ring bind( ) 函数完成bind的工作. 这个函数的作用就是为套接字描述符创建一个环形共享缓冲区, 然后绑定到一个设备上.在进行了bind之后, 就可以利用PF RING套接字, 进行数据传输了. 由于用户空间可以直接访问内核空间的环形缓冲区, 效率优于∃零拷贝%技术. 在普通的网络接收函数中, 网卡驱动到内核传递数据的核心函数是netif rx( ) 函数, 在NAPI中, 使用netif receive skb( ) 函数. 无论是否采用设备轮询, 都可以采用PF RING套接字方式传输数据, 实现方法就是在2个关键函数的起始位置插入PF RING套接字处理函数的调用. 在PF RING的处理程序中,定义了一个处理函数skb ring handler( ) , 每当有网络数据通过netif rx( ) 以及netif receive skb( ) 向上层协议传递的时候, 都会首先经过这个函数的处理. 这个函数的处理过程如图2所示.( 1) 在ring套接字列表中查找是否有某些ring套接字准备在当前设备上接收数据, 如果有, 则将当前skb加入这个套接字的环形缓冲区中, 如果没有任何套接字准备从当前设备接收数据, 则释放skb然后直接返回;图2 PF RING工作流程Fig. 2 The workflowchart of PF RINGSocket( 2) 查看当前缓冲区中是否有空闲空间, 有则将其加入;( 3) 查看当前缓冲区中是否有skb已经被用户空间拷贝过, 有的话, 则直接将其覆盖;( 4) 如果当前环形缓冲区已满, 且全部处于等待处理过程中, 则直接将该skb丢弃.5结论基于现有数据包捕获工具的效率低、稳定性差的现状, 为了提高高速( Gbit 甚至更高) 网络环境下数据包的捕获效率, 本文提出一种基于环形缓冲区的数据包捕获方法. 实验结果表明, PF RING套接字确实能显著提高系统的数据包捕获性能. 但是, 受到网卡物理性能和是否支持设备轮询的局限, 这种方法并非能够在任何条件下完全发挥其优越性. 这值得我们在今后的实验中进一步研究和探讨.参考文献:[1] 赵海雁, 陈立潮, 叶树华, 基于Windows的网络监听技术在局域网中的实现[ J] . 计算机工程, 2004, 30( 22):117- 124[2] DeryL. Improving the passive packet capture:Beyonddevice polling [EB/OL]. http: // luca. ntop. org/Ring. pdf, 2004-11.[3] 李雪莹, 刘宝旭, 许榕生. 基于WinPcap的网络监控系统性能优化[J]. 计算机工程,2004,30(1):89,47.[4] Rizzo L. Device polling support for free BSD[ EB/OL].155 顾瑞春等:Linux系统中基于PF_RING套接字的高性能包捕获技术http:/ /info.iet. unipi.it/~ luigi/polling/,2001- 11.[ 5] 徐林,张德运, 孙钦东, 等.基于NAPI 的数据包捕获技术研究[ J] .计算机工程与应用, 2004,26:138139,159.[ 6] Degioanni L. Profiling andoptimizationof software basednetwork analysis [ A] . Proceedings of the 15th IEEESBACPAD2003Symposium[C] . SanPaulo,Brazil: 2003.[7] WoodP. Libpcap mmap, Los Alomos National Labs[ EB/OL].http: // public. lanl. gov/ cpw,200604.[8] Corbet J, Rubini AandGreg Kroah Hartman. Linux DeviceDrivers[M].USA:O& Reilly,2005.知识窗干熄焦值得推广的节能减排技术(一)干熄焦是干法熄灭炽热焦炭的简称, 英文缩写为CDQ. 干法就是不用水熄红焦, 其原理是用冷惰性气体在专有的容器内与炽热的红焦进行热交换. 焦炭冷却后, 循环的惰性气体将焦炭热量带出并进行回收. 此技术是冶金行业重点推广的重大节能项目之一, 对钢铁企业有较大的节能和环保效益.干熄焦技术工艺流程主要是: 从焦炉推出的红焦温度为950∋~ 1050∋, 通过运载车送往干熄焦容器内. 干熄焦容器上密封的设备, 由循环风机鼓入冷惰性气体, 与红焦直接进行热交换, 可将其冷却到250∋以下. 冷却后的焦炭送往焦炭库. 从干熄焦容器内出来的惰性气体温度为850∋左右, 经过一次除尘( 气体含尘量要小于6g/ m3) 进入余热锅炉换热. 换热后的惰性气体温度可降到200∋以下. 从余热锅炉出来的惰性气体要进行二次除尘( 气体含尘量要小于1g/ m3) , 再由循环风机送入干熄焦容器内进行循环使用.节能、环保、高效是干熄焦的主要优势.能量回收是干熄焦技术的一个主要功能. 该技术可回收80%的红焦显热. 经统计分析, 采用该技术每熄红焦1吨, 可回收3. 9MPa、450∋的蒸汽0. 45吨~0. 6吨, 比湿法熄焦节水0. 5吨. 干熄焦的能源. 几乎可占钢铁企业可回收的二次能源总量的一半左右. 宝钢采用干熄焦技术, 可使焦化工序能耗降低68千克标煤/ 吨.干熄焦技术不仅节能效果明显, 还能改善焦化厂生态环境. 采用湿法熄焦, 熄焦的蒸汽含有大量酚,化物, 硫化物和粉尘, 会扩散到大气中. 这些污染物占炼焦过程对外排放水污染物的三分之一. 采用干法熄焦, 基本上解决了这个问题, 对环境没有污染. 此外, 动力部门要产生蒸汽和电力, 需要通过燃煤锅炉来实现. 燃煤1吨可产生5吨~ 6吨蒸汽, 每度电要消耗标煤0. 1229千克( 理论值) , 同时要排放CO2、SO2、NOX和粉尘等污染物质. 在干熄焦过程中产生的蒸汽和电力, 可供动力部门使用, 从而减少了燃煤量, 产生间接的环保效应.干熄焦还可以改善焦炭质量, 同湿法熄焦相比, 使焦炭M40提高了3%~8%, M10降低了0. 3%~ 0.8%, 且焦炭的热反应性( CSR、CIR) 均有所改善. 焦炭M40提高1%, 炼铁焦比则下降5千克/ 吨, 产量则提高4%. 因此, 干熄焦技术对节约生产成本、提高生产效率大大有利. 宝钢、马钢等企业应用该技术, 均取得了明显的经济效益.摘录自(中国冶金报)2007-05- 19( 6)156 内蒙古科技大学学报 2007年6月第26卷第2期。
基于libpcap的C编程

Pcap程序设计开始:pcap应用程序的格式我们所要理解的第一件事情是一个基于pcap的嗅探器程序的总体布局。
流程如下:1.我们从决定用哪一个接口进行嗅探开始。
在Linux中,这可能是eth0,而在BSD系统中则可能是xl1等等。
我们也可以用一个字符串来定义这个设备,或者采用pcap提供的接口名来工作。
2.初始化pcap。
在这里我们要告诉pcap对什么设备进行嗅探。
假如愿意的话,我们还可以嗅探多个设备。
怎样区分它们呢?使用文件句柄。
就像打开一个文件进行读写一样,必须命名我们的嗅探“会话”,以此使它们各自区别开来。
3.如果我们只想嗅探特定的传输(如TCP/IP包,发往端口23的包等等),我们必须创建一个规则集合,编译并且使用它。
这个过程分为三个相互紧密关联的阶段。
规则集合被置于一个字符串内,并且被转换成能被pcap读的格式(因此编译它)。
编译实际上就是在我们的程序里调用一个不被外部程序使用的函数。
接下来我们要告诉pcap使用它来过滤出我们想要的那一个会话。
4.最后,我们告诉pcap进入它的主体执行循环。
在这个阶段内pcap一直工作到它接收了所有我们想要的包为止。
每当它收到一个包就调用另一个已经定义好的函数,这个函数可以做我们想要的任何工作,它可以剖析所部获的包并给用户打印出结果,它可以将结果保存为一个文件,或者什么也不作。
5.在嗅探到所需的数据后,我们要关闭会话并结束。
这是实际上一个很简单的过程。
一共五个步骤,其中一个(第3个)是可选的。
我们为什么不看一看是怎样实现每一个步骤呢?设置设备这是很简单的。
有两种方法设置想要嗅探的设备。
第一种,我们可以简单的让用户告诉我们。
考察下面的程序:#include <stdio.h>#include <pcap.h>int main(int argc, char *argv[]){char *dev = argv[1];printf("Device: %s", dev);return(0);}用户通过传递给程序的第一个参数来指定设备。
基于Libpcap_的网络入侵分析工具设计

第14期2023年7月无线互联科技Wireless Internet TechnologyNo.14July,2023基金项目:安徽省质量工程项目;项目编号:2022Sfjk043㊂滁州职业技术学院校级自科重点研究项目;项目编号:YJZ -2020-09,ZKZ -2022-06㊂滁州职业技术学院校级自科一般研究项目;项目编号:YJY -2021-06㊂作者简介:魏光杏(1976 ),男,安徽池州人,副教授,硕士;研究方向:计算机应用技术,网络安全㊂基于Libpcap 的网络入侵分析工具设计魏光杏,李㊀华,鲁顶芝(滁州职业技术学院信息工程学院,安徽滁州239000)摘要:随着互联网的飞速发展,网络应用逐渐深入社会的各个领域,给人们的生活带来了极大的方便,如何保障网络安全问题也越来越受到人们的关注㊂文章通过对系统的需求和系统实现的可行性分析,并结合网络数据包捕获原理和IP 数据报结构等知识,提出基于Libpcap 库设计一款网络入侵分析工具㊂经试验验证,分析工具对数据包的捕获分析取得了较好的效果,较好满足了对中小型网络分析的需求,为下一步网络入侵防范提供了依据㊂关键词:网络管理;流量统计;Libpcap 中图分类号:TP309.5㊀㊀文献标志码:A 0㊀引言㊀㊀随着互联网行业的快速发展,互联网在人们的日常生活㊁学习㊁工作㊁娱乐等方面的影响越来越大,这就使得网络的安全管理问题变得尤为重要㊂当前学者们研究并开发出不少关于网络安全及入侵分析的工具[1],功能也比较强大,能够用来捕获多种数据包并且可以显示包的详细信息㊂Libpcap 是一个功能强大的函数库,以此为基础,学者们设计开发了较多网络分析工具㊂Libpcap 最主要的优点是可以给系统提供独立的用户级别网络数据包捕获接口[2]㊂其工作原理可以解释为当有数据包到达接口,就会通过网络分接口将数据发给过滤器,最后过滤器会按照制定好的过滤策略对捕获到的数据包进行匹配,成功匹配的数据会同时写入内核和用户缓冲区,反之就直接抛弃[3]㊂本文采用基于Libpcap 自带的强大函数库设计了一款简洁㊁方便的网络抓包分析工具,经过大量实验验证,取得了较好的应用效果,大大减少了病毒入侵网络的概率㊂1㊀入侵分析工具需求分析㊀㊀近些年,随着网络基础设施的不断完善,网络的普及率和用户数量逐年升高,不断增加的网络数据给运营商的管理带来了挑战㊂此外,来自网络世界的恶意攻击,给用户和运营商带来了很多损失,这些都让网络管理员头疼不已[4]㊂因此,能够对网络数据进行分析,识别网络世界的攻击,具有非常重要的意义㊂而且,网络管理员还能根据分析的结果,了解当前网络环境中的用户情况,以此来优化网络的管理[5]㊂例如,根据协议分析的结果,了解用户主要使用哪些应用,哪些应用使用率高㊂从而对部分应用限制带宽,防止发生网络拥塞现象,优化网络的运行环境㊂网络管理员还可以通过分析工具识别出网络入侵攻击,并尽早做出应对的策略,减少损失㊂这就要求一边对日常网络进行监视,一边能随时对数据包进行捕获分析㊂因此,入侵分析工具需要具备数据的捕获㊁分析㊁识别和显示的功能,如图1所示,具体需求如下㊂(1)为了应对有多个网卡的网络设备,该系统需要能够查找到网络设备上的所有网卡,便于选择网卡,对选择的网卡进行捕获分析㊂(2)能够对捕获到的数据进行分析,得到数据的五元组信息㊂(3)能够通过与特征值对比,识别出应用层的协议㊂(4)能够对识别出的应用层协议和计算出的数据流量进行统计㊂(5)拥有交互性良好的UI 界面,能够将五元组信息和协议分析的结果等展示出来㊂便于操作和管理㊂图1㊀系统功能2㊀系统设计2.1㊀系统的总体设计㊀㊀为了完成对数据的分析识别功能,并结合模块化的设计思想,本网络入侵分析工具设计成4个模块:数据采集模块㊁数据分析识别模块㊁通信模块和信息显示模块㊂其中,数据采集模块是整个工具的基础,该模块不断捕获流过网络设备的数据流;信息识别模块则是整个设计的核心,能够通过对比特征值,对捕获的数据包进行应用层协议的识别;通信模块主要将数据识别模块获得的结果不断传递到信息显示模块中,并捕获数据包的五元组信息;显示模块通过UI界面向用户展示分析的结果㊂2.2㊀数据采集模块设计㊀㊀此模块是整个设计的基础,主要将数据捕获并存储到文件中㊂设计的关键是顺利捕获到数据㊂根据有关需求分析可知,采用Libpcap的库函数完成数据捕获㊂Libpcap主要由两部分组成,分别是网络分接口和过滤规则㊂前者负责收集驱动中的数据,后者负责决定是否接收该数据包㊂Libpcap的数据包捕获大致分为3个部分:面向底层的数据包捕获㊁面向中间内核层的数据包过滤以及面向应用层的用户接口㊂Libpcap的数据包获得流程大致如下:网络接口层的网络分接口会从驱动程序中获取数据的备份,随后上交给内核,如果设置了过滤规则,就根据过滤规则进行过滤,随后将经过过滤的数据发送给内核缓冲区,最后发送给上层的应用程序;如果没有设置过滤规则,则将所有数据包直接上传到内核缓冲区,之后全部上交给用户缓冲区㊂Libpcap的捕获原理如图2所示㊂而交互界面则是基于QT设计,利用QT中的自带组件设计界面较方便,并且QT含有的信号槽机制便于各个模块之间的通信㊂图2㊀Libpcap捕获原理2.3㊀数据分析识别模块设计㊀㊀此模块是对捕获到的数据进行分析,再对分析后的数据进行识别㊂设计难点是如何识别出数据包协议㊁数据包的业务以及DOS攻击等㊂对数据包协议的识别是对传输层协议的识别,先要将数据包解封装,基于端口去识别对应的网络协议[6]㊂TCP/IP协议数据包一般由应用层㊁传输层㊁网络层㊁数据链路层㊁物理层封装而成,因此要对数据进一步分析,需要从底层将数据包一步步拆封装㊂当数据到达时,先会交给数据链路层,数据链路层会与数据包的目的Mac地址匹配,如果成功就将Mac帧头解开,交给上层的网络层,网络层会查看数据的目的IP地址与自己是否相同,如果相同,去掉IP头交给传输层,传输层解开对应的头部后上传给应用层,最后当数据解封装后,再对信息进行识别㊂2.4㊀通信模块设计㊀㊀根据前面的分析可知,当入侵数据量很大时,会在数据捕获和信息显示两模块之间产生较大时延,因此,如何降低数据捕获和信息显示两模块之间的时延也是需要考虑的问题之一㊂本模块设计中采用多线程开发技术,节省系统资源,降低时延㊂采用QT的信号与槽机制来完成对象之间的通信,信号和槽机制可以减少指针的使用,使程序更加简洁㊂在数据采集的对象中使用了QT中的信号函数,又在显示模块中使用了QT中的槽函数去接收信号㊂通过连接函数将两个函数连接起来,只要用户点击捕获选项,捕获线程会触发信号函数将信息发送出去,与其相关联的槽函数会接收到信息,并做出相应的处理㊂2.5㊀数据信息显示模块设计㊀㊀系统设计的最终目的是提供给用户使用,因此需要拥有一个界面化窗口以实现用户可视化管理㊂本设计的信息显示模块以UI可视化界面向用户直观地展示捕获的数据包的相关信息㊂在信息显示模块中,会展示数据包的多种信息,包括数据包的五元组信息㊁数据流量的统计㊁协议识别的结果以及数据包应用层业务的统计结果等㊂通过展示数据包的多种信息,可以从多个角度反映网络的运行情况㊂信息显示模块的功能包括网卡选择功能㊁开始捕获功能㊁停止捕获功能㊂网卡选择功能是将查找出的所有网络设备罗列出来,以供选择特定网卡进行数据包捕获,开始捕获功能是控制系统进行捕获,停止捕获功能是停止数据包捕获,并对捕获的数据包进行协议识别和结果统计㊂3㊀入侵分析工具的测试及结果分析㊀㊀运行入侵分析工具软件后,弹出主界面㊂主界面导航栏有选择网卡㊁开始捕获㊁停止3个选项㊂选择网卡选项是将网络设备上所有的网卡信息罗列出来,以供用户选择想要捕获的网卡㊂开始捕获选项,是控制捕获进程的选项,点击该选项,捕获进程就会被开启,随即开始捕获数据,并且在开启捕获进程的同时,捕获模块的信号函数也会被调用,完成捕获模块和显示模块之间的通信㊂停止选项,点击后会立刻停止捕获进程,开启分析识别进程,对捕获的数据进行协议识别㊁流量统计等操作㊂界面的左边会显示捕获的数据的时间㊁数据包标识㊁来源IP地址㊁目标IP地址㊁协议㊁发送长度等基本信息,右边使用图形化展示流量统计㊁业务统计㊁数据类型统计3块详细信息,状态栏中有相关操作的信息提示㊂入侵分析工具的测试是在Linux系统下使用netstress模拟DDOS网络攻击目标主机㊂从测试过程看,当运行入侵分析工具软件时,用户根据需求选择系统中罗列的网卡进行检测及捕获数据㊂入侵分析工具对捕获的数据进行筛选,对不满足规则的数据进行隔离并实时跟踪,对隔离较多同一数据发出警报㊂另外,入侵分析工具系统会对同一目的地址的数据进行统计,若在极短时间内数量超过设定的最大值,入侵分析工具会自动判定为有木马攻击,并在状态栏给出警报提示,实现了对数据的实时检测与响应,起到了主动防御作用㊂4㊀结语㊀㊀伴随着互联网的快速发展,能够迅速抓取分析数据包以及识别网络攻击成为网络日常管理的重要组成部分㊂网络管理员可以通过网络分析工具,及时了解当前所处网络环境的状态,及时发现问题,做出应对措施,降低损失㊂本文采用基于Libpcap自带的强大函数库设计了一款简洁㊁方便的网络抓包分析工具,经实验验证,该工具较好地实现了数据包抓包分析的功能,基本满足了小型网络分析的需求,效果较好,为下一步的网络入侵防御提供了依据㊂参考文献[1]周延森.基于零拷贝数据包捕获机制的研究与改进[J].计算机安全,2012(9):55-60.[2]陈晨.嵌入式Linux系统下QT图形化界面开发[D].成都:电子科技大学,2016.[3]柯采.基于ARP欺骗的网络监听分析与研究[J].电子设计工程,2020(13):124-127,132.[4]李慧芹,吕静贤,王慧,等.网络监听技术下的网络安全平台设计[J].机电工程技术,2022(8):153-155,244.[5]秦媛媛.大数据技术在网络安全分析中的应用[J].无线互联科技,2022(9):119-121.[6]田春平,刘芸.基于数据挖掘技术的网络入侵分析与检测[J].数字通信世界,2019(5):65-67.(编辑㊀沈㊀强)Design of network intrusion analysis tool based on LibpcapWei Guangxing Li Hua Lu DingzhiSchool of Information Engineering Chuzhou Polytechnic Chuzhou239000 ChinaAbstract With the rapid development of the Internet network applications have gradually penetrated into various fields of society bringing great convenience to people s lives.How to ensure network security is also receiving increasing attention.The paper proposes a network intrusion analysis tool based on Libpcap library by analyzing the system requirements and feasibility of system implementation combined with knowledge of network packet capture principles and IP datagram structure.After experimental verification the analysis tool designed in this paper has achieved good results in capturing and analyzing data packets meeting the needs of small and medium-sized network analysis and providing a basis for the next step of network intrusion prevention.Key words network management traffic statistics Libpcap。
libpcap开源库解析

基于Linux平台的libpcap源码分析和优化目录1..... libpcap简介 (1)2..... libpcap捕包过程 (2)2.1 数据包基本捕包流程 (2)2.2 libpcap捕包过程 (4)2.3 libpcap 1.3.0源码对照 (6)2.3.1 创建环形队列 (6)2.3.2 捕获数据包 (6)3..... libpcap捕包优化分析 (7)3.1处理流程单一: (7)3.2高中断服务负荷: (8)3.3内核态到用户态上下文选择: (8)3.4数据拷贝和内存分配消耗: (8)4..... 延伸拓展 (8)4.1 libpcap多线程捕包 (8)4.2 Linux并行运算 (9)4.3 零拷贝发包 (9)5..... 参考资料: (9)1. libpcap简介libpcap是unix/linux平台下的网络数据包捕获函数包,大多数网络监控软件都以它为基础。
Libpcap可以在绝大多数类unix平台下工作.Libpcap提供了系统独立的用户级别网络数据包捕获接口,并充分考虑到应用程序的可移植性。
Libpcap可以在绝大多数类unix平台下工作。
在windows平台下,一个与libpcap 很类似的函数包winpcap 提供捕获功能,其官方网站是http://winpcap.polito.it/。
2. libpcap捕包过程2.1 数据包基本捕包流程具体的Linux数据包处理流程如图1 所示。
数据包从网卡经过内核最终到达用户空间的应用程序,其中经过三次处理:中断服务、软中断和应用程序,使用三个缓存:DMA、包队列和插口。
在网卡驱动中存在运行时内存分配,从内核到用户态时存在一次内存拷贝。
通过对图1 进行分析可知,以下几个方面的问题可能会限制系统数据包的捕获处理能力:1)处理流程单一:整个处理流程串行化,其处理能力受限于整个流程的任何一处“短板”。
在多核架构系统中这样的处理方式无法发挥并行优势,存在极大的资源浪费。
网络数据包的协议分析程序的设计开发论文

网络数据包的协议分析程序的设计开发摘要本文设计与实现了一个基于Linux下Libpcap库函数的网络数据包协议分析程序。
程序的主要功能包括网络数据包捕获和常用网络协议分析。
程序由输入/输出模块、规则匹配模块、数据捕获模块、协议分析模块组成。
其中数据捕获模块和协议分析模块是本程序最关键、最主要的模块。
本文的主要内容如下:首先介绍了网络数据包协议分析程序的背景和概念。
其次进行了程序的总体设计:确定了程序的功能,给出了程序的结构图和层次图,描述了程序的工作流程,对实现程序的关键技术做出了分析。
接着,介绍完数据包捕获的相关背景和Libpcap函数库后,阐述了如何利用Libpcap函数库实现网络数据包捕获模块。
然后对协议分析流程进行了详细的讲解,分析了常用网络协议。
最后进行了程序的测试与运行:测试了程序能否按照预期的效果正确执行,印证了预期结果。
关键词:Libpcap;Linux;数据包捕获;应用层;协议识别The Design and Development of Network Packet ProtocolAnalyzing ProgramAbstractThe thesis is an attempt to introduce an implementation of network protocol analyzing program which is based on Libpcap, a famous network packet capture library on Linux. It has a rich feature set which includes capturing network packets and analyzing popular network protocols on Internet. The program is made up of an input/output module, a rules matching module, a packet capturing module and a protocol analyzing module. And the last two modules are key modules.The research work was described as followed. firstly, we introduce the background and concepts about network protocol analyzing programs; and we make an integrated design on the program, define functions of it, figure out its structure and hierarchical graphs, describe the workflow of it, and analyze the key techniques used in it; Secondly, after elaborating on the background of packet capture and the Libpcap library, we state a approach to implement a packet capture module with Libpcap; Thirdly, we explain the workflow about protocol analysis, and analyze common network protocols; Finally, we test our program to see whether it works as expected, fortunately, it does.Key words: Libpcap; Linux; Network packet capturing; Application layer; Protocol identification目录论文总页数:23页1 引言 (1)1.1课题背景 (1)1.2网络数据包协议分析程序简介 (2)1.3国内外研究现状 (2)2 网络数据包协议分析程序的总体设计 (3)2.1网络数据包协议分析程序的功能分析 (3)2.2系统的组成结构和工作流程 (3)2.2.1系统的结构框图 (3)2.2.2系统的结构和功能 (4)2.2.3程序的工作流程 (5)2.3系统实现的关键技术分析 (6)3 网络数据包捕获模块的实现 (7)3.1网络数据包捕获简介 (7)3.2基于L IBPCAP的网络数据包捕获的实现 (8)3.2.1Libpcap安装 (8)3.2.2Libpcap中基本的数据结构和函数 (8)3.3数据捕获模块的实现 (11)4 协议分析模块的实现 (11)4.1网络协议分析的总体流程 (12)4.2对TCP/IP模型中各层协议的分析 (14)4.2.1以太网首部的分析与提取 (14)4.2.2IP首部的分析与提取 (15)4.2.3TCP/UDP首部的分析与提取 (16)4.2.4应用层协议的识别与分析 (18)5 程序运行与测试 (20)5.1测试环境 (20)5.1.1硬件环境 (20)5.1.2程序运行环境 (20)5.2测试步骤 (20)5.3测试结果评价 (20)结论 (20)参考文献 (21)致谢 (22)声明 (23)1引言1.1课题背景随着计算机网络的不断发展,全球信息化已成为当今社会发展的趋势。
libpccap工作原理

libpccap工作原理libpcap是一个用于捕获网络数据包的开源库。
它提供了一个通用的接口,可以在各种操作系统上进行网络数据包的捕获和分析。
libpcap可以用于网络协议分析、网络安全监控、网络性能调优等领域。
libpcap的工作原理是通过操作系统提供的网络设备驱动程序来捕获网络数据包。
在Linux系统中,libpcap使用的是pf_packet接口,而在Windows系统中,libpcap使用的是WinPcap驱动。
这些驱动程序允许libpcap直接访问网络设备,从而捕获和处理网络数据包。
libpcap的工作流程如下:1. 打开网络设备:libpcap首先需要打开一个网络设备来进行数据包的捕获。
用户可以通过指定设备名称或者使用默认设备来打开网络设备。
2. 设置过滤规则:libpcap允许用户设置过滤规则来选择需要捕获的数据包。
过滤规则可以根据源IP地址、目的IP地址、端口号等条件进行过滤。
通过设置过滤规则,用户可以只捕获满足条件的数据包,从而减少对系统资源的消耗。
3. 开始捕获数据包:一旦网络设备打开并设置好过滤规则,libpcap 就可以开始捕获数据包了。
它会通过驱动程序从网络设备中读取数据包,并将其保存在内存中的缓冲区中。
4. 处理数据包:libpcap可以通过回调函数来处理捕获到的数据包。
用户可以自定义回调函数来对数据包进行分析、统计或者其他操作。
回调函数会在每次捕获到数据包时被调用,用户可以在回调函数中获取数据包的内容并进行相应的处理。
5. 关闭网络设备:当用户不再需要捕获数据包时,可以调用libpcap提供的函数来关闭网络设备。
关闭网络设备会释放相关的资源,避免资源的浪费。
总结起来,libpcap的工作原理是通过操作系统提供的网络设备驱动程序来捕获网络数据包。
它可以根据用户设置的过滤规则来选择需要捕获的数据包,并通过回调函数来处理捕获到的数据包。
libpcap的灵活性和通用性使其成为网络数据包分析和监控的重要工具。
Libpcap详细教程

Libpcap是Packet Capture library的英文缩写,即数据包捕获函数库,该库提供的C函数接口用于捕获经过指定网络接口(通过将网卡设置为混杂模式,可以捕获所有经过该网络接口的数据包)的数据包。
著名的TCPDUMP就是在Libpcap的基础上开发而成的,Libpcap提供的接口函数主要实现和封装了与数据包的采集、构造、发送等有关的功能。
Libpcap面向上层应用,提供了用户级别的网络数据包捕获接口,在系统部署时充分考虑到应用程序的可以移植性。
Libpcap主要有如下功能:(1)数据包捕获捕获流经本网卡的所有原始数据包,甚至对交换设备中的数据包也能够进行捕获,本功能是嗅探器的基础。
(2)自定义数据包发送构造任意格式的原始数据包,并发送到目标网络,本功能是新协议验证、甚至攻击验证的基础。
(3)流量采集与统计对所采集到的网络中的流量信息进行按照新规则分类,按指标进行统计,并输出到指定终端。
利用这项功能可以分析目标网络的流量特性。
(4)规则过滤Libpcap自带规则过滤功能,并提供脚本编程接口,能够按照用户编程的方式对已经采集到的数据包进行过滤,以便提高分析的性能。
Libpcap的应用范围:由于拥有强大的功能,当前基于Libpcap的应用比较广泛,有很多Unix上的流量相关的网络系统都是基于Libpcap的,它的一些典型应用如下:(1)网络协议分析器Libpcap应用最多的就是网络协议分析器,也可以称之为网络嗅探。
(2)网络流量发生器网络流量发生器也是Libpcap的一大应用,它是基于Libpcap的数据构造与发送功能,可以有针对性的构造各种形式的数据包,并执行发送工作,这样的组合便构成了网络流量的产生工具。
(3)网络入侵检测系统网络入侵检测系统(IDS)是发现网络入侵行为的关键,利用Libpcap所提供的数据包捕获功能,可以进一步开发出IDS。
(4)网络扫描器这是基于Libpacp的数据包构造与发送功能。
基于Libpcap的网络数据包捕获器的设计与实现

基于Libpcap的网络数据包捕获器的设计与实现【摘要】目前Windows环境下的数据包捕获器已有很多,但Linux 环境下的数据包捕获器还未成熟。
这里利用Libpcap这一数据包捕获开发包工具,在网卡为混杂模式时对数据包进行捕获,通过使用BPF 过滤机制,过滤掉网络上不需要的数据包,而只捕获用户感兴趣的数据包,并对数据包进行分析。
【关键词】网络协议Libpcap数据包捕获一、引言现如今,随着Linux操作系统的推广,Linux下的相关监控、维护需求也逐渐增多,本捕获器正是利用了这一优势。
数据包捕获开发包Libpcap(The Packet Capture Library)是一个平台独立的网络数据包捕获开发包。
它是一个高层的编程接口,隐藏了操作系统的细节,可以捕获网络上的所有数据包,包括到达其他主机的数据包。
Libpcap 中使用了BPF过滤机制,这部分是基于内核的过滤模块,它使得Libpcap具有捕获特定数据包的功能。
二、系统结构设计总体思想:根据以太网协议类型字段ethernet _type,判断数据包协议类型是ARP、IP还是RARP,若为IP协议数据包,则继续分析其类型字段,判断数据包协议是TCP、UDP还是ICMP。
若为TCP、UDP,即可根据其端口号判断在其基础上的应用层协议。
若为ICMP可根据其类型进一步分析ICMP数据包。
本网络数据包捕获器可对以太网协议数据包、ARP协议数据包、RARP协议数据包、IP协议数据包、ICMP协议数据包、TCP协议数据包、UDP协议数据包进行抓捕并分析,应用层协议数据包的分析可在后续开发中追加。
函数回调关系如图1所示。
三、实现本网络捕获器主要通过Libpcap实现,利用Qt制作一个界面。
在文字“请输入命令”下面的输入框中输入所要捕捉的数据包类型(如./ip),点击“运行”。
即可对IP数据包进行捕获、分析。
如图2所示。
四、结束语网络数据包捕获器是对网络进行后续分析、诊断、安全防范的基础,对网络进行更深层次的探究、分析具有重要意义。
libCap实现抓包程序

libpcap , 以及基于libpcap实现一个简单的抓包程序安装libpcap是一个c库,用于网络抓包和过滤,源于tcpdump项目,是从最开始tcpdump中剥离出来的一个库,tcpdump中抓包,过滤,capture file的读写的代码被提取出来成了libpcap。
现在也是由tcpdump项目的开发者维护。
从tcpdump的官网上下载下来后,包里面有一个INSTALL.txt文件,也就是三步的内容,./configure; make; make install;在这个过程中我安装了flex(一个lexical analyzer generator)和yacc才成功了写的一个简单程序pcap实际上是从链路层抓包的,所以可以从中提出取出从链路层开始的包信息,官网里(这里)有详细的基于pcap的编程文档。
这个文档中有提到基于libpcap编程的基本步骤,如何应用过滤条件,如何拿到一个包后回调,以及在回调函数中(下面的call_back)怎样提取包的详细信息,因为是得到这个链路层包的实际内容的(以字串的形式),所以是可以提取出从链路层开始,网络程ip, 传输层如tcp的所有信息的,基本上不同的基于libpcap的软件也就是这里不同了,怎样提取和展示包的信息。
基于这个文档我写了一个简单的程序1 #include<stdio.h>2 #include<pcap.h>3 #include<string>45using namespace std;67static const unsigned int ETHER_ADDR_LEN = 6;8void call_back(u_char * args, const struct pcap_pkthdr * header, const u_char * packet);9string generate_mac_address(char macChars[ETHER_ADDR_LEN]);1011int main(){12 pcap_t * handle; //Sesion handle13char dev[] = "eth2"; //device to sniff on14char errbuf[PCAP_ERRBUF_SIZE]; //error string15char filter_exp[] = ""; //filter expression16 bpf_u_int32 mask; //The netmask of our sniffing device17 bpf_u_int32 net; //The IP of our sniffing device1819struct bpf_program fp; //the compiled filter expression2021//查询device的mask和ip22if (pcap_lookupnet(dev, &net, &mask, errbuf) == -1){23 fprintf(stderr, "Can't get netmask for device %s\n", dev);24 net = 0;25 mask = 0;26 }2728//obtaining packet capture descriptor29 handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf); 30if(handle == NULL){31 fprintf(stderr, "Can't open device %s\n", dev); 32return2;33 }3435//before apply filter exp, compile it36if(pcap_compile(handle, &fp, filter_exp, 0, net) == -1){37 fprintf(stderr, "can't parse filter %s: %s\n",filter_exp, pcap_geterr(handle));38return2;39 }40//apply filter to this session41if(pcap_setfilter(handle, &fp) == -1){42 fprintf(stderr, "can't install filter %s: %s\n", filter_exp, pcap_geterr(handle));43return2;44 }4546//now the device is prepared to sniff under the filter condition47struct pcap_pkthdr header; //packet header struct48const u_char * packet; //actual packet4950//5表示积累5个包pcap_loop才返回,但每个包都会调一次call_back51while(!pcap_loop(handle, 5, call_back, NULL)){52 printf("-------\n"); //每8行才会输出一次这个53 }54 pcap_close(handle);55 }5657struct sniff_ethernet {58char ether_dhost[ETHER_ADDR_LEN]; /*Destination host address */59char ether_shost[ETHER_ADDR_LEN]; /*Source hostaddress */60 u_short ether_type; /*IP? ARP? RARP? etc */61 };6263//call_back function的统一原型64void call_back(u_char * args, const struct pcap_pkthdr * header, const u_char * packet){65static int count = 0;66struct sniff_ethernet * ethernet; //ethernet header67 ethernet = (struct sniff_ethernet*)(packet);6869//把6字节的字符串转换成mac地址的表示形式70std::string source_mac_address = generate_mac_address(ethernet->ether_shost);71std::string dst_mac_address = generate_mac_address(ethernet->ether_dhost);7273 printf("wy: call_back called %d, %s->%s, packet length:%d\n", count++, source_mac_address.c_str(), dst_mac_address.c_str(), header->len);74 }7576//由字节为单位字符串生成mac地址,16进制数的字串77string generate_mac_address(char macChars[ETHER_ADDR_LEN]){78string macAddr;79char temp[2];80for(int i = 0; i < ETHER_ADDR_LEN; i++){81//把一个字节转化成16进制表示形式82 sprintf(temp, "%x", macChars[i]);83if(i != 0){84 macAddr.append(":");85 }86 macAddr.append(temp, 2);87 }88return macAddr;89 }这个程序上面有比较详细的注释,就是把通用的基于libpcap编程的流程走了一遍,最后打印出每个包链路层from和to的MAC地址,以及每个包的长度.对于call_back的第二个参数struct pcap_pkthdr, 这是pcap.h中定义的一个结构体,包含了这个包的一些信息,捕获时间,包长度, 可以看到程序中的包长度就是从中提取的,定义如下1 struct pcap_pkthdr {2 struct timeval ts; /* time stamp */3 bpf_u_int32 caplen; /* length of portion present */4 bpf_u_int32 len; /* length this packet (off wire) */5 };上面的参数char * packet实际上是整个包在内存在的地址,为了从这当中提取出信息,必须要自己定义相应的数据结构从这个纯字符串中去提,可以看到我照着文档中去定义了一个struct sniff_ethernet,这个是需要自己定义的,pcap.h中是没有的,然后可以看到我如何写了一个函数generate_mac_address把这个6字节的字符串转换成mac地址标准的表达形式。
libpcap编程-编写自己的网络嗅探程序

* 函数 const u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h) 将利用由 pcap_open_live 返回的接口描述符 pcap_t,一个指向 pcap_pkthdr 类型的结构体 进行处理后返回第一个到达网络接口的数据包。
******Libpcap*****************************************************************
Libpcap 是一个提供了针对网络数据包捕获系统的高层接口的开源函数库。它是在 1994
年由麦克坎尼(McCanne),莱乐士(Leres)和杰科宾森(Jacobson)创建的。当时他们是美国加洲 柏克利大学劳恩斯国家实验室的研究生,而 Libpcap 正是他们研究和改善 TCP 和英特网网关 功能的一部分成果。Libpcap 作者的主要愿望是开创一个独立平台的应用程序接口(API)以 此消除程序中针对不同操作系统所包含的数据包捕获代码模块,因为通常每一个操作系统商 都会实现他们自己的捕获机制。(也就是解决了移植性的问题,这有利于提高程序员开发的效 率--译者注)
int snaplen, int promisc, int to_ms, char *errbuf) 便可以做到。该函数返回一个 pcap_t 类型的接口描述符,此描述符稍候将会被 libpcap 的其 他函数用到。(与此类似的比如文件描述符--译者注)如果函数调用失败,就返回 NULL. 函数 pcap_open_live()的第一个参数是一个指向包含我们想要打开的网络设备名称的 字符串指针,显然该参数可由 pcap_lookupdev()获得。第二个参数是我们要捕获的数据包的 最大字节数。给这个参数设定一个较小的值在某些情况下也会起到一定作用,比如:我们只 想抓获包头或者是在内存资源紧张的嵌入式系统中的程序编写。通常最大的以太帧大小是 1518 字节。但是其它的链接类型,比如 FDDI 或者是 802.11 有跟大的上限值。65535 这个数 值对于容纳任何网络的任何数据包应该是足够的。 参数 to_ms 定义了在把捕获的数据从内核空间复制到用户空间之前内核应该等待多少个 毫秒。反复地改变缓冲区的内容将严重地消耗昂贵的计算时间。如果我们是在一个繁忙的网 络传输环境中捕获数据包,那么最好是让内核在内核空间和用户空间之间拷贝数据之前先将 数据包聚集,然后一起拷贝。当我们把 to_ms 的值是赋为零时,这将导致读操作将永远进行下 去直到足够的数据包到达网络接口(在拷贝数据之前驱动程序要从网络接口读入数据)。 Libpcap 文档对该参数没有提供任何建议值,不过我们可以通过参考其他的嗅探器程序来获 取一些灵感。Tcpdump 用的是数值 1000,dsniff 用的是数值 512,此外 ettercap 在 linux 或 OpenBSD 操作系统下用数值 0,其他操作系统下用数值 10。
第5章 基于Libpcap的网络编程技术

10
常州大学信息学院
网络编程
Network tap是一个回调函数 (callback function),它实时监视 共享网络中的所有数据包,从网络设 备驱动程序中搜集数据拷贝并转发给 包过滤器。 Packet Filter Filter决定是否接收该数 据包,以及接收该数据包的哪些部分。
11
常州大学信息学院
5
常州大学信息学院
网络编程
包过滤机制实际上是针对数据包的布 尔值操作函数,如果函数最终返回 true, 则通过过滤,反之则被丢弃。形式上包过 滤由一个或多个谓词判断的并操作(AND) 和或操作(OR)构成,每一个谓词判断基 本上对应了数据包的协议类型或某个特定 值,例如,只需要 TCP 类型且目的端口为 110 的数据包。
23
常州大学信息学院
网络编程
int pcap_setfilter(pcap_t *p, struct bpf_program *fp) 该函数用于设置由pcap_compile()函数 解析完毕的过滤规则。 fp参数是bpf_program结构指针,通 常取自pcap_compile()函数调用。出错时返 回-1;成功时返回0。
Libpcap 程序的第一步通常是在系统中找 到合适的网络接口设备。在Linux 中最常见的 接口设备名 eth0 和 lo。 Libpcap 调用 pcap_lookupdev() 函数获 得可用网络接口的设备名。 char *pcap_lookupdev(char *errbuf), 该函数用于返回可被pcap_open_live()或 pcap_lookupnet()函数调用的网络设备名(一 个字符串指针)。如果函数出错,则返回 NULL,同时errbuf中存放相关的错误消息。
基于Winpcaplibpcap自主开发SnifferAnalyzer

基于Winpcap/libpcap自主开发Sniffer/Analyzer——《网络攻防技术与实践》项目实践姓名:王新平学号:10948257 1 基本描述1.1 Libpcap/WinpcapLibpcap(Winpcap是其windows版本)可以提供与平台无关的接口,而且操作简单,它是基于改进的BPF(Berkeley Packet Filter),该软件来自Berkeley的Lawrence National Laboratory研究院。
Winpcap是Libpcap的windows版本,linux用户使用Libpcap,Windows用户使用Winpcap。
使用Winpcap包过程比较规范,在密码学协议分析中,我们常用它来实现协议攻击。
基于Libpcap/Winpcap库的基本使用流程比较规范,一般为:step1:使用pcap_lookupdev获取设备;step2:使用pcap_lookupnet获取网络地址和子网掩码;step3:使用pcap_open_live打开设备;step4:使用pcap_complile编译过滤规则;step5:使用pcap_setfilter设置过滤规则;step6:使用pcap_loop循环捕获数据包,在其中调用相应处理函数;step7:使用pcap_close关闭设备句柄。
1.2 Sniffer/Analyzersniffer,即网络嗅探器,可以监听网络流。
Sniffer程序是一种利用以太网的特性把网络适配卡(NIC,一般为以太网卡)置为杂乱(promiscuous)模式状态的工具,一旦网卡设置为这种模式,它就能接收传输在网络上的每一个信息包。
Sniffer是一种常用的收集数据的方法。
它的一般用处主要是分析网络的流量,以便找出网络中潜在的问题。
Sniffer程序被广泛应用于网络维护和管理方面,网络管理员可以深入了解网络当前的运行状况,是网络管理员的好帮手。
libpcap接收数据包(三)

libpcap接收数据包(三)本文以应用程序的api调用为主线,分析libpcap和pfring源码,当然还有内核PF_RING的源码在以后也会分析,以后可能我会分析从网卡驱动一直分析到应用层,争取把这些都讲清楚。
Linux开源就是好,呵呵,闲话少说,继续分析,首先分析pcap_next函数吧,搞过winp cap的都知道这个是数据包的函数,一次只读一个数据包。
constu_char * pcap_next(pcap_t *p, struct pcap_pkthdr *h){struct oneshot_userdata s;const u_char *pkt;s.hdr = h;s.pkt =&pkt;s.pd = p;if (pcap_dispatch(p,1, p->oneshot_callback, (u_char *)&s) < = 0)return (0);return (pkt);}一看这个函数这么短,大家肯定很开心,呵呵,首先要关注的当然是结构体oneshot_userdata,搜了下,发现在pcap-int.h中定义如下:/** User data structure forthe one-shot callback used for pcap _next()* and pcap_next_ex().*/structoneshot_userdata {struct pcap_pkthdr *hdr;const u_char **pkt;pcap_t *pd;};紧接着就是调用pcap_dispatch函数,这个函数呆会也要讲解的,和pcap_loop 一样,也是用来读取数据包的。
下面看看p->oneshot _callback,这个回调函数在哪里定义的呢?还是整个文件搜索。
发现在我们以前分析过的函数pcap_create_common函数中的initialize_ ops中定义了,所有开始的初始化定义的回调函数是有用的,定义如下:p->oneshot_callback = pcap_oneshot;这就告诉我们,这个回调函数实际上调用的是pcap_oneshot函数;再继续找pcap_oneshot函数吧,定义如下:pcap_oneshot(u_char*user, const struct pcap_pkthdr *h, con st u_ch ar *pkt){struct oneshot_userdata *sp = (structoneshot_userdata *)us er;*sp->hdr = *h;*sp->pkt =pkt;}从这里可以看到pcap_oneshot就是pcap_dispatch调用的函数,而user就是pcap_dispatch最后一个参数传过来的。
libpcap抓包原理

libpcap抓包原理Libpcap抓包原理最近看的开源代码是有关网络监控的,它使用Libpcap进行抓包,然后处理。
为了更好的理解代码的实现过程,我关注了Libpcap的抓包原理,至于详细的实现暂时还没有研究。
1libpcap的工作原理1.1组成部分libpcap主要由两部份组成:网络分接头(Network Tap)和数据过滤器(Packet Filter)。
网络分接头从网络设备驱动程序中收集数据拷贝,过滤器决定是否接收该数据包。
1.2过滤算法Libpcap利用BSD Packet Filter(BPF)算法对网卡接收到的链路层数据包进行过滤。
BPF算法的基本思想是在有BPF监听的网络中,网卡驱动将接收到的数据包复制一份交给BPF过滤器,过滤器根据用户定义的规则决定是否接收此数据包以及需要拷贝该数据包的那些内容,然后将过滤后的数据给与过滤器相关联的上层应用程序。
1.3包捕获机制libpcap的包捕获机制就是在数据链路层加一个旁路处理。
当一个数据包到达网络接口时,libpcap 首先利用已经创建的Socket从链路层驱动程序中获得该数据包的拷贝,再通过Tap函数将数据包发给BPF 过滤器。
BPF过滤器根据用户已经定义好的过滤规则对数据包进行逐一匹配,匹配成功则放入内核缓冲区,并传递给用户缓冲区,匹配失败则直接丢弃。
如果没有设置过滤规则,所有数据包都将放入内核缓冲区,并传递给用户层缓冲区。
1.4功能其功能是通过网卡抓取网络以太网中的数据包。
这个库为不同的平台提供了一致的c函数编程接口。
libpcap 结构简单,使用方便;它提供了20多个api封装函数,我们利用这些api函数即可完成本网络探测器所需的网络数据包监听功能。
2Libpcap开发库的应用网络统计软件入侵检测系统网络调试数据包过滤,支持过滤机制BPF1.3Libpcap开发库使用说明基于pcap的嗅探器程序的总体架构,其流程如下:1)选择嗅探接口:在Linux中,这可能是eth0,而在BSD系统中则可能是xl1等等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在对数据进行捕获时, 主要有两种方法: 1. 主要借助原始套接字Socket , 套接字是网络应用编程接口, 应用程序可以使用它进行网络通信发送和接收网络层以上的原始数据包, 而对底层的细节是透明的. 2. 使用系统抓包库Libpcap 和Winpcap, 通过数据链路层获取以太帧, 可以从网卡捕获或者发送原始数据包, 同时能过滤及存储数据包.这种方式的捕获是工作在网络底层数据链路层,能拦截所有正在网络上传送的数据包,并且可以通过相应的处理,从而实时的分析数据包的内容,使用数据包捕获函数来获得底层数据。
2. 1 Libpcap 方法开发的过程采用Libpcap捕获网络数据包的开发过程. 主程序的流程如下图所示:捕获网络数据包过程按以下步骤进行, 程序开发过程中主要语句的实现:char * dev, errbuf [ PCAP- ERRBU FSIZE]; / / 定义接口设备名和缓冲区的大小pcap- t p; / / 捕获数据包句柄, 非常重要的数据结构int snaplen = 65535; / / 代表用户期望的捕获数据包最大长度int t imeout= 1000; / / 代表函数超时返回的时间( 1) 进行本地网络设置检测, 获得网络接口设备. 调用函数dev= pcap- lookupdev ( er rbuf ) . Linux中最常见的接口设备名eth0 和lo, 而eth0 对应了实际的网卡, 数据包的传输都要经过eth0.( 2) 设备找到后, 打开以准备捕获数据包. 调用的主函数是p = pcap- open- live ( dev, snaplen, 1,timeout , errbuf ) , 根据给定的接口设备名dev, 获得一个结构为pcap- t 的捕获句柄p, 函数中的1 代表设置接口为混杂模式. ( 3) 若用户设置了过滤条件, 则编译和安装过滤代码. 编译过滤规则调用函数pcap- compile( p,&f ilter , f ilter- app, 0, net ) , 函数将规则字符串转化为内核过滤程序. 根据过滤规则设置过滤器pcap- set filter( p, &filter) 传给BPF, 由BPF 过滤器捕获用户所需要的数据包.( 4) 反复捕获数据包. 调用pcap- loo p( p, cnt ,packet - print , NULL) 进入循环捕获, 对捕获的数据包处理放在回调函数( 如packet - print ( ) ) 中进行.( 5) 关闭设备. 调用pcap- close ( p) , 将打开设备时得到的结构为pcap- t 的捕获句柄, 作为参数传入.2. 2 对数据包处理的回调函数的开发过程在实现对捕获的数据包处理的回调函数packet- print ( ) 中, 具体分析的流程如图所示:函数中主要语句的实现:/ / 对以太头部进行分析, 判断所包含的数据包类型, 做进一步的处理/ / 对捕获的数据进行类型转换, 转化成以太数据包类型eth= ( st ruct ether - header * ) p;/ / 若以太帧的协议类型为TCP/ IPif ( eth-> ether - type = = nto hs ( ETHERTYPE-IP) ){ ⋯/ / 获取IP 头信息iph= ( st ruct ip * ) ( p + sizeof ( st ruct etherheader) ) ;⋯/ / 判断上层协议是否为T CP 协议if( iph-> ip- p= = 6){ ⋯/ / 获取TCP 头信息tcph= ( st ruct tcphdr * ) ( p + sizeof ( st ructether- header) + 4 * iph-> ip- hl ) ;⋯/ / T CP 包内容的长度tcplength = ntohs ( iph-> ip- len) -4 * iph->ip- hl-4* tcph-> doff ;⋯/ / T CP 包的数据内容data= ( u- char * ) ( p+ sizeof ( st ruct etherheader) + 4* iph-> ip- hl+ 4* tcph-> doff ) ;⋯/ / 申请一长度为tcplength 字符串变量tcpdata= ( u- char * ) malloc( tcpleng th) ;⋯/ / 把T CP 内容拷贝到tcpdata 变量中memcpy ( tcpdata, data, tcplength) ;⋯}⋯}if ( eth-> ether - type = = nto hs ( ETHERTYPE-ARP) )⋯由于在以太帧首部含有协议类型字段, 所以可进一步实现上层协议包的首部提取. 对IP 报头首部提取, 从中可获取源和目的地址; 对T CP 报文段首部提取, 从中可获取源和目的端口号; 若想获取数据包的更多内容, 可继续分析上层协议, 做进一步处理. 至此完成了捕获网络数据包工具的开发工作.文章编号:1004-9762(2007) 02- 0152-05Linux系统中基于PF_RING套接字的高性能包捕获技术顾瑞春, 谭跃生, 贾元春, 王静宇( 内蒙古科技大学网络中心内蒙古包头 014010)关键词:数据包捕获; 设备轮询;环形缓冲区; PF_RING套接字中图分类号:TP393文献标识号:A摘要:介绍一种新型的数据包捕获方式基于PF_RING套接字的数据包捕获技术. 旨在提高高速复杂网络传输环境中的数据包捕获率.使用环形缓冲区, 用来实现内核空间和用户空间的内存共享,用户空间可以直接对其进行读写操作,而且可以对该缓冲区的大小进行调整配置. 经过实验, 在100M甚至Gbit 网络环境中, 结合设备轮询机制,在普通的PC机上便可以显示出其突出的数据包捕效率. Thehighperformancepacket capturebasedonthePF_RINGsocket inLinuxGURui chun, TANYue sheng, JIAYuan chun,WANGJing yu( NetworkCenter,Inner MongoliaUniversity of Science andTechnology,Baotou 014010,China)Keywords: packet capture;dev_polling;ring buffer; PF_RINGsocketAbstract:Many networkmonitoring toolsarebasedonpacket capture, but theperformance of these popular tools isnot satisfactory. Herein, a newmethodbasedonPF_RINGSocket wasusedto improve the performanceof the packet capture under the heavy computer traffics.The ringbuffer inthekernel canbe accessedandconfiguredfreely by the applications of the user space.The experimental result shows that, combined withthedev_polling,thePF_RINGsocket canimprove the performance of the packet capture significantly,eveninthe 100Mor the Gbit network.1概述大多数的网络安全、审计、计费产品都是以数据包捕获技术作为其工作基础的. 随着网络技术的发展, 数据包捕获技术也经历了几个不同的阶段.在Linux2. 2版内核以前, 基本上使用Ipchains来实现系统对网络传输的一个基本的控制; 到了2.4版内核以后Netfilter 的出现, 显示出了很大的优势, 开发人员可以通过Netfiler 提供的各个钩子函数( hook) 来挂接自己编译过的程序, 来实现某些功能. Netfilter的出现使得数据包捕获技术有了新的飞跃. 随着网络带宽的不断增加, 网络传输速率的提高, 很多的数据包捕获工具已经渐渐显示出不足, 无法满足当前复杂的网络环境. 目前, 使用较为广泛的Sinffer, wireshark等数据包分析软件, 都是基于一个叫做LibPcap的函数库( Windows下的WinPcap[ 1]) 实现的, 这个API 提供了一整套的包捕获机制. 在Windows和Unix 系统下显示出了一定的优越性. LibPcap的主要特点如下[ 2]:(1) 可从以太网、虚拟接口等网络接口捕获数据包; ( 2) 平台无关性;( 3) 具有基于BPF的数据包过滤特性. 完善了系统的数据包过滤体系.在100M线速、数据包大于200K的网络环境2007年6月第26卷第2期内蒙古科技大学学报Journal of Inner Mongolia University of Science andTechnologyJune,2007Vol.26,No.2收稿日期: 2007-03-09基金项目: 内蒙古高校科研基金资助项目(NJ04021)作者简介: 顾瑞春(1982-), 男, 内蒙古武川人, 内蒙古科技大学硕士研究生, 主要从事计算机网络及信息安全研究.中, 其表现比较好, 几乎没有丢包现象. 但是, 一旦处于高速复杂网络环境中, 例如Gbit 线速、数据包长度小于100K的条件下, LibPcap便有些力不从心,随着数据包量的增加和包长度的减小, LibPcap的丢包率成上升趋势. 就是在Window环境下的基于WinPcap的网络监控系统也难以避免瓶颈现象[ 3].经过分析, 发现在复杂网络环境中, 丢包率上升的原因是在捕包过程中, CUP一直处于接收中断状态, 而没有把时间用于处理数据包的过程中来, 也就是进入了系统的中断活锁状态.为了解决这个问题, Unix系统采用了一种叫做设备轮询的机制[ 4], 这种机制的具体特点如下:( 1) 当网卡接收到一个数据包, 便产生一个中断信号给系统;( 2) 系统进行如下操作:关闭网卡中断;!激活轮询进程, 对该网卡进行轮询;∀打开网卡中断.在Linux系统中, 称这种技术为NAPI[ 5]技术.NAPI技术的使用, 确实在很大程度上提高了系统的数据包捕获效率, 克服了中断活锁现象[ 6]. 在高负载网络环境下, 设备轮询机制( dev_polling) 大幅度增强了数据包捕获能力和系统响应速度.2 PF_RING套接字在大数据包的网络环境下, 设备轮询机制表现出了较高的捕包能力, 但是在小包大流量的网络环境下, 设备轮询机制虽然比LibPcap的表现好了很多, 但依然难以达到让人满意的程度.表1, 2是在我们进行实验后得出的结论.表1数据包捕获率比较Table 1Percentageof thepacket capture数据包长度/KLinux2.6.1Linux 2.6.1+ LibpcapFreeBSD4.864 0.3% 1% 25%512 1.1% 6% 31%1024 4.3% 10.5% 42%从表1, 2中的数据来看, 在使用了设备轮询机制之后, 各个系统都有了显著的提高. 但是, 在Linux系统和FreeBSD系统之间, 丢包率有着很大的差距.如表1所示, 数据包大小为64K, Linux2. 6. 1内核中使用Libpcap机制的捕包率仅为1%, 而FreeBSD4. 8中的捕包率却高达25%. 表2中的各项也说明它们之间的丢包率有明显差距.经过进一步分析, 在数据包捕获的过程中, CPU的多数时间都被用在把网卡接收到的数据包经过内核的数据结构队列发送到用户空间的过程中. 也就是说是从网卡到内核, 再从内核到用户空间, 这两个步骤, 花去了大量CPU时间, 而没有其他时间用来进行数据包的进一步处理.表2数据包捕获率比较( 轮询)Table 2 Percentage of capturedpacketsusingkernel polling 数据包长度/KLinux2.6. 1+NAPILinux 2.6. 1+NAPI+LibpcapFreeBSD4. 8+DevPolling64 2.5% 14.9% 97.3%512 1.1% 11.7% 47.3%1024 34.3% 93.5% 56.1%基于轮询机制的不足, 在轮询机制的基础上, 提出一种新的包捕获套接字模型[ 7]:( 1) 提出一种基于环形缓冲区的新的套接字PF_RINGSocket;( 2) 每创建一个PF_RING套接字便分配一个环形缓冲区, 当这个套接字结束时释放这个缓冲区. 不同的套接字拥有不同的环形缓冲区; 如果把PFRING套接字绑定到某一网卡上, 这块网卡在这个套接字结束前, 处于只读状态, 当数据包到达网卡时,将其放入到环形缓冲区, 如果缓冲区已满, 则将其丢弃;( 3) 用户空间可以直接访问这个环形缓冲区中的数据;( 4) 当有新的数据包到来时, 可以直接覆盖掉已经被用户空间读取过的那个数据包的空间.用户程序可以对环形缓冲区的大小进行设置.在使用了PF RING之后, 系统的数据包捕获效率有显著提高. 具体实验数据见表3.PF RING套接字的基本模型如图1. 在应用层的各个应用程序可以建立自己的不同的套接字模型, 用来接收和发送数据, 每一个环形缓冲区可以实现读写功能. 在网卡接收到新的数据包之后, 就将其153 顾瑞春等:Linux系统中基于PF_RING套接字的高性能包捕获技术直接写入到环形缓冲区中, 以便应用程序直接对其进行读操作. 而如果应用程序需要向外发送数据包时, 也可以直接将数据包写入到环形缓冲区, 以便网卡驱动程序将该数据包发送到相应的接口上[ 8].表3使用PF RING套接字后的包捕获效率Table 3 Percentage of capturedpacketsusingPF RING 数据包长度/KLinux 2.6.1+ NAPILinux 2.6.1+ NAPI+ LibpcapLinux 2. 6.1+ NAPI+ PF RING64 2.5% 14.9% 73. 2%512 1.1% 11.7% 45. 1%1024 34.3% 93.5% 91. 8%图1 PF RING套接字结构Figur 1 The Architecture of PF RINGSocket 在数据包捕获的实例中, 我们只使用数据包从网卡经过内核环形缓冲区到达用户空间应用程序的过程; 但是, 如果这台机器将要对数据包进行转发,那么数据包从应用程序到达内核环形缓冲区, 然后再从网卡发送出去, 这个过程也是相当重要的, 其效率和数据包捕获是相同的, 只是读写顺序不同而己.PF RING套接字的主要优势有以下几点:( 1) 数据包并没有列入内核队列中, 而是直接拷贝到环形缓冲区;( 2) 用户空间可以直接访问环形缓冲区;(3) 即使系统不支持轮询机制, 使用PF RING套接字也是相当稳定的. 因为这里用于处理中断的时间相当短暂;( 4) 不用的应用程序可同时打开多个PF RING套接字.3 PF RING套接字的实现PF RING套接字是笔者为了减少网络层传输中的内存拷贝即避免频繁的系统调用而设计的一种新的套接字类型, 这种套接字采用模块方式动态加载. 其中的具体结构如下[ 8]:环形缓冲区簇结构:struct ring cluster{u short cluster id; / / 缓冲簇idu short num cluster elements;enumcluster typehashing mode;u short hashing id; / / 哈希表id##};环成员结构:struct ring element{struct list headlist; / / 链表头struct sock*sk;};环操作结构:struct ring opt{struct net device*ring netdev; / / 设备u short ring id; / / 环idu short cluster id##};采用模块方式加载, 模块初始化函数:staticint init ring init( void){ring table=NULL; / / 调用套接字注册函数sock register(&ring family ops) ; / / 注册环形句柄set ring handler( my ring handler) ;return0;};该函数调用sock register( ) 函数将PF RING套接字协议族注册到系统的全局套接字协议族数组net family中, 以便用户层调用sock( ) 函数创建PF RING套接字时, 系统能够从net family数组中找到相应的记录和create( ) .模块清理函数ring exit( )staticvoid exit ring exit( void){154 内蒙古科技大学学报 2007年6月第26卷第2期set skb ring handler( NULL) ; / / 清除环形句柄set buffer ring handler( NULL; / / 缓冲区句柄sock unregister( PF RING) ; / / 调用套接字清除函数ring proc term( ) ;};清除注册信息, 停止运行. 退出系统内核.4 PF RING套接字的使用如果需要使用PF RING套接字, 则需要在用户层调用sock( ) 函数, 并且传递PF RING标志、SOCK RAW以及ETH IP ALL3个参数, 这3个参数必须完全匹配. Sock( ) 函数执行成功则将PFRING套接字描述符返回给用户空间, 应用程序就可以利用这个描述符操作相应的设备轮询机制了.接下来的一个重要操作是调用bind( ) 函数, 切入内核以后调用的sys bind( ) 函数, 最终实际调用的是相应套接字协议族自己定义的bind方法, 而对于PF RING套接字协议族来说, 就是调用ringbind( ) 函数, 事实上, ring bind( ) 函数最终调用packet ring bind( ) 函数完成bind的工作. 这个函数的作用就是为套接字描述符创建一个环形共享缓冲区, 然后绑定到一个设备上.在进行了bind之后, 就可以利用PF RING套接字, 进行数据传输了. 由于用户空间可以直接访问内核空间的环形缓冲区, 效率优于∃零拷贝%技术. 在普通的网络接收函数中, 网卡驱动到内核传递数据的核心函数是netif rx( ) 函数, 在NAPI中, 使用netif receive skb( ) 函数. 无论是否采用设备轮询, 都可以采用PF RING套接字方式传输数据, 实现方法就是在2个关键函数的起始位置插入PF RING套接字处理函数的调用. 在PF RING的处理程序中,定义了一个处理函数skb ring handler( ) , 每当有网络数据通过netif rx( ) 以及netif receive skb( ) 向上层协议传递的时候, 都会首先经过这个函数的处理. 这个函数的处理过程如图2所示.( 1) 在ring套接字列表中查找是否有某些ring套接字准备在当前设备上接收数据, 如果有, 则将当前skb加入这个套接字的环形缓冲区中, 如果没有任何套接字准备从当前设备接收数据, 则释放skb然后直接返回;图2 PF RING工作流程Fig. 2 The workflowchart of PF RINGSocket( 2) 查看当前缓冲区中是否有空闲空间, 有则将其加入;( 3) 查看当前缓冲区中是否有skb已经被用户空间拷贝过, 有的话, 则直接将其覆盖;( 4) 如果当前环形缓冲区已满, 且全部处于等待处理过程中, 则直接将该skb丢弃.5结论基于现有数据包捕获工具的效率低、稳定性差的现状, 为了提高高速( Gbit 甚至更高) 网络环境下数据包的捕获效率, 本文提出一种基于环形缓冲区的数据包捕获方法. 实验结果表明, PF RING套接字确实能显著提高系统的数据包捕获性能. 但是, 受到网卡物理性能和是否支持设备轮询的局限, 这种方法并非能够在任何条件下完全发挥其优越性. 这值得我们在今后的实验中进一步研究和探讨.参考文献:[1] 赵海雁, 陈立潮, 叶树华, 基于Windows的网络监听技术在局域网中的实现[ J] . 计算机工程, 2004, 30( 22):117- 124[2] DeryL. Improving the passive packet capture:Beyonddevice polling [EB/OL]. http: // luca. ntop. org/Ring. pdf, 2004-11.[3] 李雪莹, 刘宝旭, 许榕生. 基于WinPcap的网络监控系统性能优化[J]. 计算机工程,2004,30(1):89,47.[4] Rizzo L. Device polling support for free BSD[ EB/OL].155 顾瑞春等:Linux系统中基于PF_RING套接字的高性能包捕获技术http:/ /info.iet. unipi.it/~ luigi/polling/,2001- 11.[ 5] 徐林,张德运, 孙钦东, 等.基于NAPI 的数据包捕获技术研究[ J] .计算机工程与应用, 2004,26:138139,159.[ 6] Degioanni L. Profiling andoptimizationof software basednetwork analysis [ A] . Proceedings of the 15th IEEESBACPAD2003Symposium[C] . SanPaulo,Brazil: 2003.[7] WoodP. Libpcap mmap, Los Alomos National Labs[ EB/OL].http: // public. lanl. gov/ cpw,200604.[8] Corbet J, Rubini AandGreg Kroah Hartman. Linux DeviceDrivers[M].USA:O& Reilly,2005.知识窗干熄焦值得推广的节能减排技术(一)干熄焦是干法熄灭炽热焦炭的简称, 英文缩写为CDQ. 干法就是不用水熄红焦, 其原理是用冷惰性气体在专有的容器内与炽热的红焦进行热交换. 焦炭冷却后, 循环的惰性气体将焦炭热量带出并进行回收. 此技术是冶金行业重点推广的重大节能项目之一, 对钢铁企业有较大的节能和环保效益.干熄焦技术工艺流程主要是: 从焦炉推出的红焦温度为950∋~ 1050∋, 通过运载车送往干熄焦容器内. 干熄焦容器上密封的设备, 由循环风机鼓入冷惰性气体, 与红焦直接进行热交换, 可将其冷却到250∋以下. 冷却后的焦炭送往焦炭库. 从干熄焦容器内出来的惰性气体温度为850∋左右, 经过一次除尘( 气体含尘量要小于6g/ m3) 进入余热锅炉换热. 换热后的惰性气体温度可降到200∋以下. 从余热锅炉出来的惰性气体要进行二次除尘( 气体含尘量要小于1g/ m3) , 再由循环风机送入干熄焦容器内进行循环使用.节能、环保、高效是干熄焦的主要优势.能量回收是干熄焦技术的一个主要功能. 该技术可回收80%的红焦显热. 经统计分析, 采用该技术每熄红焦1吨, 可回收3. 9MPa、450∋的蒸汽0. 45吨~0. 6吨, 比湿法熄焦节水0. 5吨. 干熄焦的能源. 几乎可占钢铁企业可回收的二次能源总量的一半左右. 宝钢采用干熄焦技术, 可使焦化工序能耗降低68千克标煤/ 吨.干熄焦技术不仅节能效果明显, 还能改善焦化厂生态环境. 采用湿法熄焦, 熄焦的蒸汽含有大量酚,化物, 硫化物和粉尘, 会扩散到大气中. 这些污染物占炼焦过程对外排放水污染物的三分之一. 采用干法熄焦, 基本上解决了这个问题, 对环境没有污染. 此外, 动力部门要产生蒸汽和电力, 需要通过燃煤锅炉来实现. 燃煤1吨可产生5吨~ 6吨蒸汽, 每度电要消耗标煤0. 1229千克( 理论值) , 同时要排放CO2、SO2、NOX和粉尘等污染物质. 在干熄焦过程中产生的蒸汽和电力, 可供动力部门使用, 从而减少了燃煤量, 产生间接的环保效应.干熄焦还可以改善焦炭质量, 同湿法熄焦相比, 使焦炭M40提高了3%~8%, M10降低了0. 3%~ 0.8%, 且焦炭的热反应性( CSR、CIR) 均有所改善. 焦炭M40提高1%, 炼铁焦比则下降5千克/ 吨, 产量则提高4%. 因此, 干熄焦技术对节约生产成本、提高生产效率大大有利. 宝钢、马钢等企业应用该技术, 均取得了明显的经济效益.摘录自(中国冶金报)2007-05- 19( 6)156 内蒙古科技大学学报 2007年6月第26卷第2期。