
刘云,宋茂强
北京邮电大学软件学院,北京 (100876)
E-mail:archily@tom.com
摘要:包捕获是设计网络软件的基本技术,本文对WinPcap数据包捕获原理和体系结构进行了详细分析,并给出一个基于WinPcap的数据包采集与实时解析的应用实例。
关键词:WinPcap,数据包,包捕获,实时,数据采集
中图分类号: TP39
1 引言
随着网络技术的迅猛发展,各种网络数据分析和网络管理软件得到了广泛应用。数据包的捕获与解析是了解网络中流动的数据包的种类和这些数据包的具体信息以及网络安全与否的有效手段。目前,多数Unix系统都提供了截获数据包的内核模块。而在Windows平台下,系统虽提供了具有包截获功能的API,但只能截获IP数据包。要想截获数据链路层数据包,
开发人员还需要自己开发一个额外的驱动程序或者组件程序来访问内核网卡驱动程序。WinPcap是基于Win32平台的开放源代码网络数据包截获和分析的系统。该系统性能稳定而且效率极高,利用它提供的丰富且功能强大的网络数据包处理函数,可以满足对数据包处理有严格要求的多数应用程序的开发。
2 WinPcap体系结构
WinPcap的主要思想来源于Unix系统中最著名的BSD包截获架构[3],WinPcap的基本结构如图1所示。它由内核级的网络组包过滤器(Netgroup Packet Filter,NPF)、用户级的动态链接库Packet.dll和Wpcap.dll等3个模块组成。
(1)网络组包过滤器。它是运行于操作系统内核中的驱动程序,它直接与网卡驱动程序进行交互,获取在网络上传输的原始数据包。NPF与操作系统有关,WinPcap开发组针对不同的Windows操作系统提供了不同版本的NPF。在Win95/98/ME系统中,它以VXD文件形式存在,在WindowsNT和Windows 2000系统中,它以SYS文件形式存在。该模块提供了抓取数据包以及发送数据包的基本功能,此外还提供了一些高级功能,如数据包过滤系统和检测引擎。
(2)低级动态链接库。Packet.dll用于在Win32平台上为数据包驱动程序提供一个公共的接口。不同的Windows版本在用户态和内核态之间提供互不相同的接口,而Packet.dll可以屏蔽这些接口区别,提供一个与系统无关的API。基于Packet.dll开发的数据包截获程序可以运行于不同的Win32平台而不必重新进行编译。Packet.dll可以执行如获取适配器名称、动态驱动器加载以及获得主机掩码及以太网冲突次数等低级操作。
(3)高级动态链接库。Wpcap.dll模块与Unix系统下的BSD截获架构提供的Libpcap库完全兼容。它提供了一组功能强大且跨平台的函数,利用这些函数,可以不去关心适配器和操作系统的类型。Wpcap.dll含有诸如产生过滤器、定义用户级缓冲以及包注入等高级功能。编程人员既可以使用包含在Packet.dll中的低级函数直接进入内核级调用,也可以使用由Wpcap.dll提供的高级函数调用,这样功能更强,使用也更为方便。Wpcap.dll的函数调用会自动调用Packet.dll中的低级函数,并且可能被转换成若干个NPF系统调用。
图 1 WinPcap的体系结构
WinPcap通过这3个模块提供了以下功能:
a)捕获原始数据包,包括在共享网络上各主机发送/ 接收的以及相互之间交换的数据包;
b)在数据包发往应用程序之前,按照自定义的规则将某些特殊的数据包过滤掉;
c)在网络上发送原始的数据包;
d)收集网络通信过程中的统计信息。
3 数据采集与实时解析系统简介
本数据采集与实时解析系统是在Windows XP 操作系统平台上,利用VC++ 6.0 开发工具实现的[2],其中利用了WinPcap API接口捕获原始数据包。
3.1系统功能
a)读取本机所有网络接口信息供用户进行网络接口的选择;
b)从数据链路层抓取网络上流经本网卡的所有数据包;
c)依照数据包对应的协议类型分析出该数据包的协议类型、源目的MAC地址、源目的IP
地址,数据包长度等相关信息;
d)实时地将数据包的解析信息显示给用户。
3.2系统框架
本系统通过调用WinPcap驱动程序库的库函数并将网卡设置成混杂模式以从数据链路层上采集流经本机网卡的所有网络数据包,然后对每个数据包按照对应的网络协议进行分析,取出其包含的网络信息,然后实时地反馈给用户界面或记录在Access数据库中。
由于考虑到网络中数据包流量大,速率高,为了避免系统在进行分析结果的显示和写数据库时前端抓包部分的丢包,以及需要保证数据包解析结果显示的实时性,系统采用多线程的结构设计。系统各部分的工作分别由三个线程来协作完成,即数据包采集线程、数据包解析线程和UI界面线程,其中,数据包采集线程和解析线程共享全局数据包缓冲队列完成数据交互和同步,在功能实现上,系统划分为数据包采集模块、数据包解析模块、界面显示模块等,系统框架图如图2所示。
图2 系统框架图
3.3系统模块设计
3.3.1 数据包采集模块
该模块负责实现从网卡上捕获流经本网卡的网络数据包,模块的所有功能通过一个工作线程,即数据包采集线程Revc_Thread负责[1],在线程中通过调用WinPcap库函数pcap_findalldevs()、pcap_open_live()及pcap_next_ex()来分别完成本机网卡信息的获取、选择网卡并将网卡设置为混杂模式以及循环抓取下一个有效的封包数据等几项工作。
对于每个捕获到的底层数据包,系统通过一个PacketInfo结构体来进行保存,该结构体定义如下:
typedef struct PacketInfo_T
{
packetType //该数据包的协议类型;
CString
*p_packetData;
//保存数据包的内存区的指针;
u_char
}PacketInfo;
然后,数据包采集线程将封装好的PacketInfo结构体对象放入与数据包解析线程共享的全局数据包缓冲队列中,缓冲队列可以有效地减少在大流量、高速率网络中采集数据的丢包率。缓冲区的设计按照先进先出(FIFO)的方式,为了使其高效易用,本系统的缓冲区采用C++标准模板库中的list来实现,该模板类提供了数据包的表尾插入和表头取出的功能,缓冲区的定义如下:
list< PacketInfo > msgBufferList; //数据包缓冲队列;
在向缓冲区中添加数据包时,系统采用MFC的临界区变量CCriticalSection来对采集和解析两个线程进行同步;
3.3.2 数据包解析模块
解析模块的主要功能是从数据包缓冲队列中取出已经取得的数据包并解析,这部分工作封装在另一个工作线程,即数据包解析线程Parser_Thread中。由于数据包是从数据链路层取得,为以太网帧,解析线程先读取以太网帧头,获得其中包含的该数据包的源、目的MAC 地址,然后剥去以太网帧头,得到网络层的IP数据包,解析线程分析IP头中描述的所使用协议的字节,获取该数据包的协议类型,如:该字节的值为1表示ICMP包,6表示TCP 包,17表示UDP包等;然后,读取对应协议头中描述的数据包的源、目的IP地址,进而剥去对应的协议头,获得数据包的数据部分长度,从而完成对数据包的各信息的分析。
系统中通过一个全局结构体变量来存储一个数据包的上述各方面信息,然后由UI界面更新这个数据包消息,怎样使UI界面的更新符合数据包的解析速率又保证更新的数据有效,系统采用消息机制,通过向UI界面发送一个界面更新消息,来将当前解析的数据更新到UI 界面上:
#define WM_UPDATEDATA WM_USER+100
::PostMessage(hWnd, WM_UPDATEDATA, 0, 0);
3.3.3 界面显示模块
该模块主要完成对当前数据包解析好的信息的更新显示,系统采用一个滚动列表框来完成每个新到达的数据包的信息的添加显示,该部分工作在消息WM_UPDATEDATA的响应函数中完成,由UI界面自带的消息循环,对数据包解析模块发送过来的每个WM_UPDATEDATA消息进行处理,保证了与解析速率同步的界面更新。
4 结语
本文介绍了数据包采集与解析原理及WinPcap库,并详细介绍了本数据采集与实时解析系统的设计思路和实现方法。本系统选择Windows XP为系统平台,利用VC++6.0开发环境,并采用多线程的架构,良好地满足了系统数据信息显示的实时性,并有效预防数据采集部分因数据包流量大,速率高所可能产生的丢包现象。
我们在常见的100M以太网中对程序进行测试,实现了实时地显示解析数据的设计要求,高效稳定的数据包捕获显示了WinPcap库的强大。基于WinPcap库设计的该系统简单高效,性能可靠。
参考文献
[1] JIM BEVERIDGE, ROBERT WIENER著. 侯捷译. Win32多线程程序设计[M]..武汉:华中科技大
学出版社, 2002.
[2] 侯捷著.深入浅出MFC(第二版)M] .武汉:华中科技大学出版社, 2001.
[3] The NetGroup at Politecnico di Torino . WinPcap Documentation 3.01alpha[EB/OL]. http://w
inpcap.polito.it, 2003.Design of the system for data collecting and real-time
parsing based on WinPcap
Liu Yun,Song Maoqiang
School of Software Engineering of Beijing University of Posts and Telecommunications,Beijing
(100876)
Abstract
Packet capture is the basic technology for design of network software,The paper closely analyzes the principle of the packet capture and the structure of the WinPcap system,and then shows an application example of the system for data collecting and real-time parsing based on WinPcap.
Keywords:winpcap,packet,packet capture,real-time,data collection
作者简介:
刘云,1982年生,男,陕西延安人,硕士,主要研究方向为计算机通信软件;
宋茂强,1957年生,男,四川宜宾人,教授,硕士生导师,主要研究方向为计算机通信软件。
