马俊功 高晓华
北京航空航天大学自动化科学与电气工程学院 北京 100191
随着计算机技术的飞速发展,网络已成为生活中的必备工具。网络需求纵深延展,网络规模持续扩大,使得保持网络高性能运转变得越来越难。网络瘫痪成为用户们不得不面对的问题。这就需要一种测试工具捕获与解析网络数据包,对网络的运行状况进行监测,快速定位和解决故障,从而保证网络高效有序的运行。
系统选用了Windows CE面向移动计算和嵌入式应用的32位高性能操作系统。它具有一个简洁、高效、完全抢先式的多任务内核,支持强大的图形GUI,具备嵌入式系统的模块化、可定制、完备性、实时性的优点。与其他常见的嵌入式操作系统相比,WinCE开发相对较容易,开发周期短,内核完善,因此本系统的操作系统选用的是WinCE5.0,它采用模块化设计,允许用户针对硬件设备进行定制。Platform Buider(PB)是微软公司提供的内核定制工具,利用PB并根据硬件平台的配置对WinCE操作系统进行定制,同时使用PB导出在该硬件平台上开发应用程序所需要的SDK,供嵌入式应用程序开发使用。
Winpcap是基于Win32平台的开放源代码网络数据包截获和分析的系统。该系统性能稳定而且效率极高,利用Winpcap提供的丰富且功能强大的网络数据包处理函数,将大大方便系统的开发,节省系统开发的时间和人力。
Winpcap包括三部分:虚拟设备驱动文件NPF,动态函数库Packet.dll、Winpcap.dll。NPF实现了抓包系统绕过操作系统的协议栈来访问在网络上传输的原始数据包,运行在操作系统核心内部,直接与网络接口驱动交互。packet.dll为Win32平台提供了一个公共的接口。它提供了一个底层API,这些API可以直接用来访问驱动的函数;模块Wpcap.dll是不依赖于操作系统的。它提供了更加高层、抽象的函数。Wpcap.dll的函数调用会自动调用Pactet.dll中的低级函数,并且可能被转换成若干个NPF系统调用。PacketCE3.0是目前基于WinCE的Winpcap的最高版本,但它只适用于WinCE3.0以下的版本,不能直接运行在操作系统WinCE5.0上,因此需要修改源代码。
系统的软件功能结构如图1所示,主要采用了功能模块化的设计方法,功能模块之间相互独立,方便了功能的修改及扩展,模块之间依靠消息机制来完成通信。接口模块设计的目的是将各个功能模块和界面显示模块分离,当系统移植后或界面更改后,只要修改接口模块中的变量及函数即可,方便了整个系统的移植、维护及升级。
各个功能模块的作用如下:
(1)自动测试模块
测试电缆的连通性,长度、线序和网络接口的可用性等。该模块实现了对物理硬件设备的监测,帮助用户诊断网络故障。
(2)连通性测试模块
测试网络连通性及路由信息,该模块实现了判断网络以及相关设备是否正常工作。当网络出现故障时,测定从源主机到目的主机的路径信息,确定故障出现的位置。
(3)过滤器模块
设置过滤条件,实现只捕获或查看符合设定条件的数据包,不仅节省了系统的内存。而且使问题的分析更具有针对性。
(4)数据包捕获模块
实现数据包的捕获,是协议解析和流量分析功能实现的基础,主要包括网卡信息的读取、打开,开始抓包功能及停止抓包功能。
(5)数据包协议解析模块
实现数据包协议解析,并以一定的格式将解码后的信息显示出来。主要以三种形式显示:概要信息显示:显示一个帧所包含的最高级协议的概略性介绍,以及捕获时间、来源与目的地址;详细信息显示:提供帧中各层次的详细说明;原信息内容显示:以十六进制形式显示捕获的原始数据。
图1 系统功能模块图
(6)数据包流量分析统计模块
实现整体流量的分析统计,本测试仪主要从不同类别协议的报文个数、不同主机的数据流量进行统计。通过流量分析的结果,用户可以得知多少的通信量属于哪个协议,占主要通信协议的主机是哪一台,大多数通信目的地是哪台主机等,从而了解了整个网络的运行情况。
(7)系统自身设置模块
实现系统自身参数的设置,比如IP地址的设置、时间日期设置、背景亮度设置等。
系统功能流程图如图2所示,开启系统后,由界面创建一个线程,该线程实现初始化及系统消息调用机制。该系统的消息机制的设计参考了Windows系统消息调用机制,用来实现模块间的通信,完成系统的功能调用。
在该线程中,首先各个任务模块依次完成初始化,在初始化完成后,由抓包模块完成网卡信息的获取,并将读取结果反馈给接口模块,进而反馈给界面模块,此时系统已读取到了网卡的基本信息,最后弹出主界面。
图2 系统整体功能流程图
由抓包模块完成打开网卡接口。然后可以设置过滤器,由界面模块将过滤条件发送给接口模块,再由接口模块发向包分析模块,在包分析模块中做相应的处理后,再将消息发向抓包模块,最后由抓包模块完成设置过滤器的功能。
点击界面中的抓包按钮,主界面首先将消息发送到接口模块,然后由接口模块发送到包分析模块,最后由包分析模块将消息传递给抓包模块,那么抓包模块开始抓包,并存储包信息,此时包协议解析模块便可以向抓包模块请求包信息,进而进行分析、解析、统计等。抓包或包分析、统计结果依次发送到接口模块,然后由接口模块将此结果发送到界面。
上述便是整个系统基本功能的运行流程。
PacketCE源码主要包含的C文件有Packet.c 、packet32.c、filter.c、read.c openclose.c,其中从OpenClose.c、Packet.c包含的函数可以判断,PacketCE是一个流驱动。分析PacketCE源码可知,在动态函数库被加载后,第一个调用的函数是DWORD PKT_Init(DWORD dwContext),它用来完成初始化硬件的工作,不一样的硬件平台,该函数的实现是不同的。分析它的内部实现,首先定义了NDIS_PROTOCOL_CHARACTERISTICS类型的结构体变量ProtocolChar,然后给该变量赋值,最后向系统注册该协议结构体。经分析知该结构体的类型为3.0,而本系统该结构体的类型是5.0,因此,不能成功注册。参考本系统5.0的结构,找出增加的变量,编写相应的函数,给这些量赋值,并修改版本号。重新编译静态库Packet.lib,wpcap.lib,最后将该驱动加载到WinCE操作系统上即可,在配置好环境后,应用程序可直接调用Winpcap的库函数。
在该系统中存在主线程、消息调用线程、抓包线程等多个线程,因此系统开发中多线程的互斥是一个关键的问题,某一时刻,可能主界面和其他功能模块同时向消息列表发送消息,那么系统会同时将这两个消息插入到同一个消息列链表中,此时便引起了资源的访问冲突问题,这里采用的解决方案是在每一个链表操作函数中引入了关键区域的建立和释放,这样防止了共享资源的访问冲突问题。
通过pacp_findalldevs()函数来实现网卡信息的获取,它返回一个pcap_if结构的链表,每个pcap_if结构含有一个网卡适配器的信息。创建过滤规则,系统将其编译成BPF代码,然后存在一个名为bpf_program的结构中,pcap_compile()将一个高层的布尔过滤表达式编译成一个能够被过滤引擎所解释的低层的字节码,最后利用pcap_setfilter()来加载,所有的符合要求的数据包将会复制给应用程序。使用pcap_loop()函数进行数据包的捕获。有一个回调参数packet_handle指向一个可以接收数据包的函数。每收到一个新的数据包就会去调用这个函数实现特定的功能。
在该系统中,在捕获到数据后,要将数据包存储在数据包链表中。如果在此时要查看或分析数据包信息,便出现了数据包存储与查看的冲突,本设计采取了建立两个数据包列表,及数据包列表操作标志位,保证了同一时刻,查看和存储的不是同一个数据包链表。
基于WinPcap的包捕获过程:首先获取网卡设备列表并选择要监听的一块网卡,将其设置为混杂模式,还要设置好过滤器等参数;然后把网卡上的数据包复制到内核缓冲区中;最后通过上层的调用,把内核缓冲区中的数据包拷贝到用户缓冲区中,再交给应用程序对数据进行加工提取出有用的信息。利用WinPcap驱动捕获的数据帧其实是经过传输层、网络层和数据链路层的封装而生成的以太网数据帧,因此可以需要对数据帧作进一步解析才能得到有用信息。协议分析依次要分析数据链路层、网络层、传输层、应用层。
具体的解决方法是根据数据包解析原理的分析,及各种协议数据包包头的结构,通过读取数据包的包头,解析出该协议,依据包头规定的结构,分析出该协议的各个字段,进而做一些统计、显示、存储等。以太网协议解析的实现过程主要是接收到数据帧后,首先判断其帧类型,如果数据帧中源MAC地址和目的MAC地址后面的两位十六进制数字大于0x0600,则该字段代表类型,即其封装格式为Ethernet II类型,否则该字段代表长度,其封装格式为Ethernet 802.3 SNAP类型。判断完帧类型后,记录其长度。接下来判断数据帧中携带数据包的类型,主要有IP数据包、ARP以及RARP数据包、ICMP数据包。如果数据帧中携带的是IP数据包,还要对IP数据包中的上层数据进行分析。IP数据包主要携带TCP数据包以及UDP数据包,TCP协议的上层协议主要为FTP协议以及HTTP协议。
该系统可以实现实时的监控网络的运行状况,捕获数据包,对数据包进行协议分析及数据统计。可用于网络管理、网络规划、网络维修等场合。本项目的设计方案在操作系统上选择模块化和方便剪裁的系统结构。在不损失功能的前提下,力求整体系统的简捷和紧凑,并且留有升级扩展的空间,因此是一种较优化的选择。
[1]谭思亮.监听与隐藏[M].北京:人民邮电出版社.2002.
[2]费绍敏,龚晓峰.基于Winpcap的网络监控系统的设计和实现[J].通信技术.2009.
[3]闫国英,郭宝增.WindowsCE.NET及其在嵌入式系统中的应用.微机发展.2005.
[4]胡晓元,史浩山.Winpcap包截获系统的分析及其应用[J].计算机工程.2005.
[5]张伟,潘艳辉.基于Winpcap的数据包的捕获及应用[J].计算机工程与设计.2008.
[6]徐勇.Windows设备驱动程序技术内幕[M].北京:清华大学出版社.2000.
[7]谢希仁.计算机网络(4版)[M].北京:电子工业出版社.2003.