IP数据包的捕获与分析设计报告.docx
《IP数据包的捕获与分析设计报告.docx》由会员分享,可在线阅读,更多相关《IP数据包的捕获与分析设计报告.docx(24页珍藏版)》请在冰豆网上搜索。
CENTRALSOUTHUNIVERSITY
计算机网络课程设计报告
题目IP数据包的捕获与分析
学生姓名胡壮
班级学号计科1106班0909112924
指导教师穆帅
设计时间2014年1月
目录
第一章绪论 3
1.1课题研究的意义 3
1.2捕获数据包的常用方法 3
第二章系统需求分析 4
2.1课程设计题目与要求 4
2.2IP数据包格式 6
2.3程序流程图 7
2.4实验环境 9
第三章系统总体框架 9
3.1套接字模块 9
3.2IP数据包的捕获模块 9
3.3IP数据包分析模块 9
3.4输出模块 9
第四章详细设计与实现 10
4.1数据结构的定义 10
4.2初始化工作 11
4.3套接字的创建和设置 12
4.4数据包的捕获与分析 13
4.5信息的输出 14
第五章程序运行结果与分析 15
5.1程序运行结果截图 15
5.2程序中有待改进的地方 16
第六章总结 17
参考文献 17
附录 18
第一章绪论
现如今,计算机网络已经彻彻底底地改变了人们的生活。
大量的数据都是经过计算机网络传输的,而TCP/IP协议是计算机网络中最重要的协议之一。
计算机网络中绝大多数数据都是以IP数据包的形式发送和接受的。
所以IP数据包的捕获是很多计算机安全技术的基础。
1.1课题研究的意义
计算机之间进行通信时,交互的所有信息都封装在数据包中。
因此,通过采集网络数据并对其进行相应的分析,可以清楚地了解到进行通信的计算机的通信目的。
首先,分析采集到的数据包,可以确定网络是否受到攻击入侵;其次,也可以使用采集到的数据包来分析网络应用程序可能出现的问题的原因;此外,通过网络数据采集和统计可以清楚的了解整个网络在各个时段内的网络负载情况,从而判断网络使用得是否合理。
除了以上谈到的几个方面以外,数据包采集分析还有其他很多用途.在研究IPv4网络的同时,我们还对IPv6协议进行了初步的研究并通过对数据报的分析,了解了在不同网络环境下IPv6数据包的封装格式以及在网络中的传输路径。
目前,在同一子网范围内,可以通过邻居计算机发现协议自动配置主机的本地一链路IPv6地址,并获取子网内其他主机的通信地址,通过该地址可以实现子网内的主机间纯IPv6环境下的通信。
但由于现在整个因特网并不支持IM协议,因此IPv6数据包要在网间传输,必须通过基于双协议栈的IPv4隧道(Tunnel)技术,将EM数据报封装在IPv4包头中,并通过指定的支持IM协议的路由在Internet中传送到目的地,再由目的主机进行数据报解析。
获取IPv6数据报中的信息。
1.2捕获数据包的常用方法
目前常用的捕获数据包的方法有原始套接字、LibPcap、WinPcap和JPcap等方法。
它们各有特点,实现起来有难有易,如何选择取决于具体需求与程序员的喜好。
下面分别对它们作简单介绍。
套接字是网络应用编程接口。
应用程序可以使用它进行网络通信而不需要知道底层发生的细节。
有时需要自己生成一些定制的数据包或者功能并希望绕开Socket提供的功能,原始套接字(RawSocket)满足了这样的要求。
原始套接字能够生成自己的数据报文,包括报头和数据报本身的内容。
通过原始套接字,可以更加自如地控制Windows下的多种协议,而且能够对网络底层的传输机制进行控制。
LibPcap是一种与系统无关,采用分组捕获机制的分组捕获函数库,用于访问数据链路层,它在不同的平台上采用统一的编程接口,使用LibPcap编写的程序可自由的跨平台使用。
同时LibPcap是一个独立于系统接口的用户级的抓包库,它为底层网络监听提供了可移植框架。
它的应用包括网络统计集合、安全监听、网络调试等。
WinPcap是一个基于Win32的捕获数据包和网络分析的体系结构,它包括一个内核级的包过滤器,一个底层的动态链接库(Packet.dll),一个高层并且与系统无关的库(WPcap.dll,基于LibPcap0.6.2版本)。
WinPcap是集成于Windows95,98,ME,NT,2000和XP操作系统的设备驱动程序,它可以从网卡捕获或者发送原始数据,同时能够过滤并且存储数据包。
JPcap是一个能够捕获、发送网络数据包的Java类库包。
这个包用到了LibPcap和原始套接字API。
JPcap支持Ethernet,IPv4,IPv6,ARP/RARP,TCP,UDP,ICMPv4协议。
JPcap是一个Java类集合,它为网络数据包的捕获提供接口和系统支持。
其最初版本是2000年6月发布的JPcap0.01版,此后几经修改,到2003年4月发布了最新的JPcap0.4版。
第二章系统需求分析
2.1课程设计题目与要求
本次实验的要求在网络环境,使用VC++编写程序实现捕获网络中的IP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。
程序的具体要求如下:
l)以命令行形式运行:
ipparselogfile,其中ipparse是程序名,而logfile则代表记录结果的日志文件。
2)在标准输出和日志文件中写入捕获的IP包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容。
3)当程序接收到键盘输入Ctrl+C时退出。
2.2IP数据包格式
只有先了解IP数据包的格式,才能对IP数据包进行解析,下图是IP数据包的格式:
IP数据包由首部和数据两部分组成。
首部的前一部分是固定长度,共20字节,是所有IP数据报必须具有的。
在首部的固定部分的后面是一些可选字段,其长度是可变的,可选字段之后是数据部分。
其中,首部固定部分中的各字段的长度及意义如下:
(1)版本 占4位,指IP协议的版本。
通信双方使用的IP协议版本必须一致。
目前广泛使用的IP协议版本号为4(即IPv4)。
关于IPv6,目前还处于草案阶段。
(2)首部长度 占4位,可表示的最大十进制数值是15。
请注意,这个字段所表示数的单位是32位字长(1个32位字长是4字节),因此,当IP的首部长度为1111时(即十进制的15),首部长度就达到60字节。
当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。
因此数据部分永远在4字节的整数倍开始,这样在实现IP协议时较为方便。
首部长度限制为60字节的缺点是有时可能不够用。
但这样做是希望用户尽量减少开销。
最常用的首部长度就是20字节(即首部长度为0101),这时不使用任何选项。
(3)区分服务 占8位,用来获得更好的服务。
这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。
1998年IETF把这个字段改名为区分服务DS(DifferentiatedServices)。
只有在使用区分服务时,这个字段才起作用。
(4)总长度 总长度指首部和数据之和的长度,单位为字节。
总长度字段为16位,因此数据报的最大长度为2^16-1=65535字节。
在IP层下面的每一种数据链路层都有自己的帧格式,其中包括帧格式中的数据字段的最大长度,这称为最大传送单元MTU(MaximumTransferUnit)。
当一个数据报封装成链路层的帧时,此数据报的总长度(即首部加上数据部分)一定不能超过下面的数据链路层的MTU值。
(5)标识(identification) 占16位。
IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。
但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。
当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。
相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。
(6)标志(flag) 占3位,但目前只有2位有意义。
标志字段中的最低位记为MF(MoreFragment)。
MF=1即表示后面“还有分片”的数据报。
MF=0表示这已是若干数据报片中的最后一个。
标志字段中间的一位记为DF(Don’tFragment),意思是“不能分片”。
只有当DF=0时才允许分片。
(7)片偏移 占13位。
片偏移指出:
较长的分组在分片后,某片在原分组中的相对位置。
也就是说,相对用户数据字段的起点,该片从何处开始。
片偏移以8个字节为偏移单位。
这就是说,每个分片的长度一定是8字节(64位)的整数倍。
(8)生存时间 占8位,生存时间字段常用的的英文缩写是TTL(TimeToLive),表明是数据报在网络中的寿命。
由发出数据报的源点设置这个字段。
其目的是防止无法交付的数据报无限制地在因特网中兜圈子,因而白白消耗网络资源。
最初的设计是以秒作为TTL的单位。
每经过一个路由器时,就把TTL减去数据报在路由器消耗掉的一段时间。
若数据报在路由器消耗的时间小于1秒,就把TTL值减1。
当TTL值为0时,就丢弃这个数据报。
后来把TTL字段的功能改为“跳数限制”(但名称不变)。
路由器在转发数据报之前就把TTL值减1.若TTL值减少到零,就丢弃这个数据报,不再转发。
因此,现在TTL的单位不再是秒,而是跳数。
TTL的意义是指明数据报在网络中至多可经过多少个路由器。
显然,数据报在网络上经过的路由器的最大数值是255.若把TTL的初始值设为1,就表示这个数据报只能在本局域网中传送。
(9)协议 占8位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程。
(10)首部检验和 占16位。
这个字段只检验数据报的首部,但不包括数据部分。
这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化)。
不检验数据部分可减少计算的工作量。
(11)源地址 占32位。
为发送方的IP地址。
(12)目的地址 占32位。
为接收方的IP地址。
2.3程序流程图
通过对实验题目和要求的分析,画出程序流程图如下:
解析IP数据包
N
捕获IP数据包
结束
接收到Ctrl+C?
N
N
设置套接字
创建原始套接字
Y
Y
命令行参数正确?
开始
Y
加载WinSock动态链接库成功?
2.4实验环境
本实验采用Windows操作系统平台,利用Windows提供的WindowsSocketsAPI实现IP数据包的捕获与分析。
采用WinSock2.2版本,编程语言选用C++,编程工具采用VisualStudio2010旗舰版。
第三章系统总体框架
整个系统可以分为四个模块,分别为套接字模块、捕获IP数据包模块、解析IP数据包模块和输出模块。
下面分别作简要介绍。
3.1套接字模块
套接字模块主要包括原始套接字的创建和原始套接字的设置。
此模块先创建一个原始套接字,然后将此套接字绑定到一个本机的网络接口,再设置套接字使其能捕获经过此网络接口的所有IP数据包。
3.2IP数据包的捕获模块
此模块主要负责捕获IP数据包,然后将捕获的数据包提交给IP数据包解析模块。
此模块利用设置好的原始套接字捕获IP数据包,然后将数据包提交给解析模块,直到键盘输入ctrl+c时结束。
3.3IP数据包分析模块
此模块主要负责对