网络数据包的协议分析程序的设计开发毕业设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

网络数据包的协议分析程序的设计开发
摘要
本文设计与实现了一个基于Linux下Libpcap库函数的网络数据包协议分析程序。

程序的主要功能包括网络数据包捕获和常用网络协议分析。

程序由输入/输出模块、规则匹配模块、数据捕获模块、协议分析模块组成。

其中数据捕获模块和协议分析模块是本程序最关键、最主要的模块。

本文的主要内容如下:首先介绍了网络数据包协议分析程序的背景和概念。

其次进行了程序的总体设计:确定了程序的功能,给出了程序的结构图和层次图,描述了程序的工作流程,对实现程序的关键技术做出了分析。

接着,介绍完数据包捕获的相关背景和Libpcap函数库后,阐述了如何利用Libpcap函数库实现网络数据包捕获模块。

然后对协议分析流程进行了详细的讲解,分析了常用网络协议。

最后进行了程序的测试与运行:测试了程序能否按照预期的效果正确执行,印证了预期结果。

关键词:Libpcap;Linux;数据包捕获;应用层;协议识别
The Design and Development of Network Packet Protocol
Analyzing Program
Abstract
The 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)
结论........................................................................................................ 错误!未定义书签。

参考文献........................................................................................................ 错误!未定义书签。

致谢........................................................................................................ 错误!未定义书签。

声明........................................................................................................ 错误!未定义书签。

1引言
1.1课题背景
随着计算机网络的不断发展,全球信息化已成为当今社会发展的趋势。

但由于计算机网络自身所特具有的特点,比如联结形式多样性和网络的开放性、互连性等特征,所以导致网络易受黑客还有一些病毒的攻击。

所以网上信息的安全和保密是一个至关重要的问题。

对于军用的自动化指挥网络和银行等传输敏感数据的计算机网络系统而言,其网上信息的安全和保密尤为重要。

因此,网络必须有足够强的安全措施,否则该网络将是个无用、甚至会危及国家安全的网络。

在计算机网络的世界里,存在着很多潜在的威胁,因此网络的安全措施应能全方位地应对各种不同的威胁,这样才可以真正的做到网络服务于社会,体现网络的先进性。

计算机网络所面临的威胁大体可分为两种:一是对网络中信息的威胁;二是对网络中设备的威胁。

影响计算机网络的因素很多,有些因素可能是有意的,也可能是无意的;可能是人为的,也可能是非人为的;可能是外来黑客对网络系统资源的非法使有,归结起来,针对网络安全的威胁主要有三种:
(1)人为的无意失误:如操作员安全配置不当造成的安全漏洞,用户安全意识不强,用户口令选择不慎,用户将自己的帐号随意转借他人或与别人共享等都会对网络安全带来威胁。

(2)人为的恶意攻击:这是计算机网络所面临的最大威胁,敌手的攻击和计算机犯罪就属于这一类。

此类攻击又可以分为以下两种:一种是主动攻击,它以各种方式有选择地破坏信息的有效性和完整性;另一类是被动攻击,它是在不影响网络正常工作的情况下,进行截获、窃取、破译以获得重要机密信息。

这两种攻击均可对计算机网络造成极大的危害,并导致机密数据的泄漏。

(3)网络软件的漏洞和“后门”:网络软件不可能是百分之百的无缺陷和无漏洞的,然而,这些漏洞和缺陷恰恰是黑客进行攻击的首选目标,曾经出现过黑客攻入网络内部的事件,这些事件的大部分就是因为安全措施不完善所招致的苦果。

另外,软件的“后门”都是软件公司的设计编程人员为了自便而设置的,一般不为外人所知,但一旦“后门”洞开,其造成的后果将不堪设想。

为了及早发现并制止网络上的各种攻击,我们需要通过对网络上的数据进行分析来发现并找出问题,提前预防。

这也是本论文的一个重要目的。

网络安全管理员运用网络封包截获技术,抓取网络中有用的数据包,然后通过对数据包内容进行分析,确定哪些是有害的或者含有攻击企图的包,以此来达到对网络攻击的预防。

同时许多防火墙也是基于包过滤技术的。

本文将介绍网络数据包协议分析程序的工作原理以及它的实现。

1.2网络数据包协议分析程序简介
网络数据包协议分析程序是一种用于收集网络中有用数据的程序,这些数据可以是用户的帐号和密码,也可以是一些商用机密数据等。

它是利用计算机的网络接口截获目的地为其他计算机的数据报文的一种工具。

网络数据包协议分析程序的正当用处主要是分析网络的流量,以便找出所关心的网络中潜在的问题。

例如,假设网络的某一段运行得不是很好,报文的发送比较慢,而我们又不知道问题出在什么地方,此时就可以用网络数据包协议分析程序来作出精确的问题判断。

在合理的网络中,网络数据包协议分析程序的存在对系统管理员是至关重要的,系统管理员通过网络数据包协议分析程序可以诊断出大量的不可见模糊问题,这些问题涉及两台乃至多台计算机之间的异常通讯,有些甚至牵涉到各种的协议,借助于网络数据包协议分析程序系统管理员可以方便的确定出多少的通讯量属于哪个网络协议、占主要通讯协议的主机是哪一台、大多数通讯目的地是哪台主机、报文发送占用多少时间、或着相互主机的报文传送间隔时间等等,这些信息为管理员判断网络问题、管理网络区域提供了非常宝贵的信息。

1.3国内外研究现状
现在国内外已经有很多成熟并且功能强大的网络数据包协议分析软件。

比较著名的网络数据包协议分析软件有:开源软件:Wireshark、TcpDump。

商用软件:EtherPeek下面对这几种软件进行简要的介绍:
Wireshark: Wireshark是一个开放源码的网络分析系统,也是是目前最好的开放源码的网络协议分析器,支持Linux和Windows平台。

Wireshark起初由Gerald Combs开发,随后由一个松散的Wireshark团队组织进行维护开发。

它目前所提供的强大的协议分析功能完全可以媲美商业的网络分析系统,自从1998年发布最早的0.2版本至今,大量的志愿者为Wireshark添加新的协议解析器,如今Wireshark已经支持五百多种协议解析。

很难想象如此多的人开发的代码可以很好的融入系统中;并且在系统中加入一个新的协议解析器很简单,一个不了解系统的结构的新手也可以根据留出的接口进行自己的协议开发。

这都归功于Wireshark良好的设计结构。

事实上由于网络上各种协议种类繁多,各种新的协议层出不穷。

一个好的协议分析器必需有很好的可扩展性和结构。

这样才能适应网络发展的需要不断加入新的协议解析器。

TcpDump:顾名思义,TcpDump可以将网络中传送的数据包的“头”完全截获下来提供分析。

它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

用尽量简单的话来定义TcpDump,就是:dump the traffic on a network,根据使用者的定义对网络上
的数据包进行截获的包分析工具。

TcpDump以其强大的功能,灵活的截取策略,成为每个高级的系统管理员分析网络,排查问题等所必备的工具之一。

EtherPeek:这个工具软件开始只是一个网络分析器型的数据包监测软件,经过这些年的发展已经成为一个真正的网络管理工具并具有网站监视和分析等新的功能,被美国联邦调查局用来追踪逃犯、贩卖毒品的人、电脑黑客和一些被怀疑为外国间谍的人。

是一个直观,功能强大的以太网网络和协议分析器。

支持Macintosh和Windows平台。

EtherPeek把查找和修复多平台上的复杂网络任务变得简单化。

EtherPeek采用工业标准,非常容易使用,提供解码、过滤和诊断网络的功能。

以友好图形界面出名,EtherPeek提供非常详细且多样化的网络使用信息,网络结点的会话和数据包内容。

在有问题的局域网络中使用EtherPeek 执行一个自定的诊断测试,监控网络的通信和事件,跟踪非法的网络活动,测试和调试网络软硬件。

2网络数据包协议分析程序的总体设计
2.1网络数据包协议分析程序的功能分析
对于网络数据包协议分析程序进行功能分析的第一步是要确立程序所要实现的目标,也就是程序最终要解决的问题。

本程序所要实现的目标就是在共享式以太网中捕获根据过滤规则设置的流经本地网卡的数据包,并且对数据包中的信息进行分析。

网络数据包协议分析程序必须完成对常用协议的识别和分析:要求至少实现TCP/IP协议簇几个基本协议的分析(ARP、RARP、TCP、UDP),以及应用层的常用协议分析。

为了减少设计的复杂度,程序采用字符界面。

对网络数据包的捕获、规则过滤和对数据包的分析是本程序的主要功能。

2.2系统的组成结构和工作流程
2.2.1系统的结构框图
基于以上分析,本文设计了网络数据包协议分析程序,图2-1是程序的结构框图。

应用程序接口
数据包处理
数据包捕获
Fedora Core Linux 4
图2-1网络数据包协议分析程序结构框图
下面对该程序的整体结构进行一下描述:该程序的运行环境是Fedora Core 4 linux。

Fedora Core是linux的一个发行版,他的前身是Redhat linux。

本程序通过调用安装在linux上的Libpcap函数库抓取经过本地网卡的数据包,从而完成数据包的捕获。

然后将捕获后的数据包交给上层的数据处理模块,进行协议分析。

最后将分析后的数据显示在用户界面上。

2.2.2系统的结构和功能
网络数据包的协议分析程序是一个基于Libpcap开发库,应用与共享以太网的网络分析程序如图2-2所示,系统主要包括4大模块:
网络数据报协议
分析程序
输入数据捕获规则匹配数据处理
协议分析输出
图2-2网络数据包的协议分析程序的层次图
1、数据输入模块。

该模块主要功能是接收用户输入用于捕获数据包的信息。

其中包括选择用于捕获的网络接口和需要过滤的内容。

2、数据捕获模块。

该模块的主要功能是捕获流经本地网卡的所有数据。


原理是通过把网卡设置为混杂模式,使得网卡对所有流经它的数据包都交给上层程序处理。

3、规则匹配模块,该模块的主要功能是根据用户的需求对需要捕获的数据包进行过滤设置。

因为不是所有经过本地网卡的数据报都对我们分析网络有用,而且如果将所有经过网卡的数据捕获会增加系统的开销。

因此我们设置了一个规则匹配模块,当所捕获的信息与我们设置的规则相符时我们就把它交给数据处理模块,否则就丢弃。

4、数据处理模块。

该模块的主要功能是对捕获的数据进行分析显示处理。

主要是调用协议分析模块和显示模块。

4.1 协议分析模块。

该模块的主要功能是对捕获的数据包进行协议分析。

把数据包捕获下来后,我们需要对其分析才能知道网络中存在的安全问题。

该模块主要是对TCP/IP各层的协议进行分析。

4.2 显示模块。

该模块的主要功能是将分析的结果显示给用户。

对数据包进行协议分析后要把结果显示给用户本程序才结束。

因为数据包中包含的信息太多,如果全部显示给用户有所不便,所以我们挑选其中比较重要的信息输出给用户。

2.2.3程序的工作流程
图2-3为本程序的流程图,下面其进行简要的叙述:
1、程序开始时首先查找计算机上所有可用的网卡,并让用户选择用于捕获数据包的网卡。

2、用户输入用于捕获数据包的网卡和过滤规则。

只过滤用户所关心的信息。

3、程序判断该网卡所在的网络是否为以太网,不是则中止,是则继续。

因为本程序只能在共享以太网中进行数据捕获。

4、编译用户设置的过滤规则。

5、开始进行捕获,并分析数据,将数据显示给用户。

当用户停止时就结束程序,否则继续捕获。

图2-3 网络数据包的协议分析程序的流程图
2.3系统实现的关键技术分析
前面给出了网络数据包协议分析程序的总体结构、功能模块和工作流程。

要实现程序预定的功能,就必须解决实现程序的关键技术。

网络数据包协议分析程序要实现的关键技术包括:数据包捕获技术、对TCP/IP各层基本协议进行分析的技术、协议识别技术。

1、数据包捕获技术:本程序要对网络中的数据进行分析,首先就要将网络中的数据包捕获下来。

因此实现数据包捕获是本程序设计的基础也是首先要解决的技术问题。

要实现共享以太网中的数据捕获,各个平台有不同的技术。

在Linux 有一个专门为程序员编写数据包捕获程序而开发的库:Libpcap。

Libpcap是用户态的数据包截获API,具有独立性和可移植性,支持BPF过滤机制等。

通过调用Libpcap库函数可以轻易的实现共享以太网中数据包的截获,而且实时性相当的强,因为Libpcap是处于用户态所以减少了系统的开销。

Libpcap是一个基于BPF
的开放源码的捕包函数库。

现有的大部分Linux捕包系统都是基于这套函数库或者是在它基础上做一些针对性的改进。

2、对TCP/IP各层基本协议分析的技术:要对TCP/IP各层的基本协议进行分析,主要是要对所要分析的协议有充分的了解,特别是对各种协议的报头格式要有深入的了解。

对各种协议进行分析时主要是将报头中的重要信息显示给用户,还有可能对数据包的正文信息解码。

3、协议识别技术:由于OSI的7层协议模型,协议数据是从上到下封装后发送的。

对于协议的识别需要从下至上进行。

例如,首先对网络层的协议识别后进行脱去网络层协议头。

将里面的数据交给传输层分析,这样一直进行下去直到应用层。

应用层以下的各种协议一般都可以通过下一层的协议中的关键信息来识别。

但是应用层的协议种类相当多,无法从下层协议中识别。

对于应用层协议识别的方法目前有几种技术:基于特征串的应用层协议识别、Venus Fast Protocol Recognition、以及端口识别。

在本程序中我们采用的是端口识别技术。

端口识别的原理是常用协议使用固定端口来进行通信。

端口识别的优点是:简单、容易实现。

缺点是:一些不常用协议不能被识别,常用协议修改端口后也无法识别。

3网络数据包捕获模块的实现
3.1网络数据包捕获简介
网络数据包截获一般指通过截获整个网络的所有信息流量,根据信息源主机,目标主机,服务协议端口等信息简单过滤掉不关心的数据,再将用户感兴趣的数据发送给更高层的应用程序进行分析。

一方面要,网络截取模块要能保证截取到所有网络上的数据包,尤其是检测到被分片的数据包(这可能蕴涵着攻击)。

另方面,数据截取模块截取数据包的效率也是很重要的。

它直接影响整个入侵检测系统的运行速度。

从广义的角度上看,一个包捕获机制包含三个主要部分:最底层是针对特定操作系统的包捕获机制,最高层是针对用户程序的接口,第三部分是包过滤机制。

不同的操作系统实现的底层包捕获机制可能是不一样的,但从形式上看大同小异。

数据包常规的传输路径依次为网卡、设备驱动层、数据链路层、IP层、传输层、最后到达应用程序。

而数据包捕获机制是在数据链路层增加一个旁路处理,对发送和接收到的数据包做过滤/缓冲等相关处理,最后直接传递到应用程序。

值得注意的是,包捕获机制并不影响操作系统对数据包的网络栈处理。

对用户程序而言,包捕获机制提供了一个统一的接口,使用户程序只需要简单的调用若干函数就能获得所期望的数据包。

这样一来,针对特定操作系统的捕获机制对用户透明,使用户程序有比较好的可移植性。

包过滤机制是对所捕获到的数据包根据用户的要求进行筛选,最终只把满足过滤条件的数据包传递给用户程序。

3.2基于Libpcap的网络数据包捕获的实现
3.2.1 Libpcap安装
Libpcap提供了系统独立的用户级别网络数据包捕获接口,并充分考虑到应用程序的可移植性。

Libpcap可以在绝大多数类unix平台下工作。

在windows平台下,一个与Libpcap很类似的函数包winpcap提供捕获功能,其官方网站是http://winpcap.polito.it/ Libpcap软件包可从/下载,解压后依此执行下列三条命令即可安装。

./configure
make
make install
但如果希望Libpcap能在linux上正常工作,则必须使内核支持“packet”协议,也即在编译内核时打开配置选项CONFIG_PACKET(选项缺省为打开)。

3.2.2Libpcap中基本的数据结构和函数
主要函数:
int pcap_findalldevs(pcap_if_t *alldevsp, char *errbuf)
功能:枚举系统所有网络设备的信息
参数:alldevsp:是一个pcap_if_t结构体的指针,如果函数pcap_findalldevs函数执行成功,将获得一个可用网卡的列表,而里面存储的就是第一个元素的指针。

Errbuf:存储错误信息的字符串。

返回值:int,如果返回0则执行成功,错误返回-1。

pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf)
功能:设置一个抓包描述符
参数:其第一个参数是我们在上一节中指定的设备,snaplen是整形的,它定义了将被pcap捕获的最大字节数。

当promisc设为true时将置指定接口为混杂模式(然而,当它置为false时接口仍处于混杂模式的特殊情况也是有可能的)。

to_ms是读取时的超时值,单位是毫秒(如果为0则一直嗅探直到错误发生,为-1则不确定)。

最后,ebuf是一个我们可以存入任何错误信息的字符串(就像上面的errbuf)。

int pcap_compile(pcap_t *p, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 netmask)
功能:编译过滤规则
参数:第一个参数是会话句柄(pcap_t *handle在前一节的示例中)。

接下
来的是我们存储被编译的过滤器版本的地址的引用。

再接下来的则是表达式本身,存储在规定的字符串格式里。

再下边是一个定义表达式是否被优化的整形量(0为false,1为true,标准规定)。

最后,我们必须指定应用此过滤器的网络掩码。

函数返回-1为失败,其他的任何值都表明是成功的。

int pcap_setfilter(pcap_t *p, struct bpf_program *fp)
功能:设置过滤规则。

参数:这非常直观,第一个参数是会话句柄,第二个参数是被编译表达式版本的引用(可推测出它与pcap_compile()的第二个参数相同)。

int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
功能:循环抓包直到用户中止。

参数:第一个参数是会话句柄,接下来是一个整型,它告诉pcap_loop()在返回前应捕获多少个数据包(若为负值则表示应该一直工作直至错误发生)。

第三个参数是回调函数的名称(正像其标识符所指,无括号)。

最后一个参数在有些应用里有用,但更多时候则置为NULL。

数据结构:
struct pcap_if{
struct pcap_if *next;
char *name;
char *description;
struct pcap_addr *addresses;
u_int flags;
};
pcap_if *next; 如果非空,指向链的下一个元素。

如果为空是链的最后一个元素。

char *name; 指向一个字符串,该字符串是传给pcap_open_live()函数的设备名;
char *description; 如果非空,指向一个对设备的人性化的描述字符串。

pcap_addr *addresses; 指向网卡地址链中的第一个元素。

u_int flags; PCAP_IF_网卡的标志。

现在唯一可用的标识是PCAP_IF_LOOKBACK,它被用来标识网卡是不是lookback网卡。

struct pcap_pkthdr {
struct timeval ts;/*time stamp*/
bpf_u_int32 caplen; /*length of portion present*/
bpf_u_int32 len; /*length this packet(off wire)*/
};
timeval ts; 数据报时间戳;
bpf_u_int32 caplen; 当前分片的长度;
dpf_u_int32 len; 这个数据报的长度;
细节描述:在dump文件中的每个数据报都有这样一个报头。

它用来处理不同数据报网卡的不同报头问题。

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 */ };
u_int ps_recv; 接受数据报的数目;
u_int ps_drop; 被驱动程序丢弃的数据报的数目;
u_int ps_ifdrop; 被网卡丢弃的数据报的数目;
struct pcap_addr{
pcap_addr * next;
sockaddr * addr;
sockaddr * netmask;
sockaddr *broadaddr;
sockaddr *dstaddr;
};
pcap_addr * next; 如果非空,指向链表中一个元素的指针;空表示链表中的最后一个元素。

sockaddr * addr; 指向包含一个地址的sockaddr的结构的指针。

sockaddr * netmask; 如果非空,指向包含相对于addr指向的地址的一个网络掩码的结构。

sockaddr * broadaddr; 如果非空,指向包含相对于addr指向的地址的一个广播地址,如果网络不支持广播可能为空。

sockaddr * dstaddr; 如果非空,指向一个相对于addr指向的源地址的目的地址,如果网络不支持点对点通讯,则为空。

3.3数据捕获模块的实现
第一步调用pcap_findalldevs查找出所有可用的网卡,显示出来,并接收用户选择网卡。

第二步用户输入用于捕获数据包的网卡后,调用pcap_open_live生成一个抓包描述符。

第三步通过调用pcap_datalink检查该网卡所在网络是不是以太网,如果不是则中止程序。

第四步接收用户输入的过滤条件,调用pcap_compile和pcap_setfilter生成过滤规则。

第五步调用pcap_loop进行循环捕获数据包,直到用户中止。

具体流程入下图所示:
图3-1数据捕获模块流程图
4协议分析模块的实现
虽然到此为止已经可以顺利完成数据包的监听工作,但这并不意味着己经大功告成了,因为从前面的数据包监听的原理中可以知道,数据包捕获程序工作在网络底层,将网卡设置为混杂模式以后,从网络底层捕获到的数据包会直接往上发给应用程序进行处理,而不再像普通的数据包那样经过操作系统的层层过滤。

相关文档
最新文档