IP数据包的捕获与分析设计报告Word文档格式.docx
- 文档编号:3953959
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:24
- 大小:110.32KB
IP数据包的捕获与分析设计报告Word文档格式.docx
《IP数据包的捕获与分析设计报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《IP数据包的捕获与分析设计报告Word文档格式.docx(24页珍藏版)》请在冰点文库上搜索。
因此,通过采集网络数据并对其进行相应的分析,可以清楚地了解到进行通信的计算机的通信目的。
首先,分析采集到的数据包,可以确定网络是否受到攻击入侵;
其次,也可以使用采集到的数据包来分析网络应用程序可能出现的问题的原因;
此外,通过网络数据采集和统计可以清楚的了解整个网络在各个时段内的网络负载情况,从而判断网络使用得是否合理。
除了以上谈到的几个方面以外,数据包采集分析还有其他很多用途.在研究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?
设置套接字
创建原始套接字
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数据包分析模块
此模块主要负责对IP数据包进行分析,即根据IP数据包的格式把信息从捕获到的IP数据包中提取出来,然后再提交给输出模块。
3.4输出模块
此模块负责输出IP数据包信息的输出,包括输出到标准输出和日志文件。
第四章详细设计与实现
4.1数据结构的定义
本程序主要用到了两个数据结构,一个是IP头的结构体,一个是常用IP协议号与协议名的映射。
1.IP头结构体
根据IP数据包的格式,定义IP头结构体如下:
structIPHead
{
u_charihl:
4;
//头长度
u_charversion:
//版本
u_chartos;
//服务类型
u_shortlen;
//IP包的总长度
u_shortid;
//标识
u_shortoff;
//分段偏移量
u_charttl;
//生存期
u_charprotocol;
//协议
u_shortcksum;
//头校验和
structin_addrsaddr;
//源IP地址
structin_addrdaddr;
//目的IP地址
};
2.常用IP协议号与协议名的映射
为了通过协议号得到协议名,于是定义了一些常见的协议号与其协议名的映射关系,如下:
pair<
int,string>
common_ip[]={
make_pair(1,"
ICMP"
),
make_pair(2,"
IGMP"
),
make_pair(3,"
GGP"
make_pair(4,"
IPinIP"
make_pair(6,"
TCP"
make_pair(8,"
EGP"
make_pair(17,"
UDP"
make_pair(35,"
IDPR"
make_pair(45,"
IDRP"
make_pair(46,"
RSVP"
make_pair(47,"
GRE"
make_pair(54,"
NHRP"
make_pair(88,"
IGRP"
make_pair(89,"
OSPF"
//常见的IP协议编号和名称
constmap<
IP_PROTOCOL(common_ip,common_ip+14);
4.2初始化工作
1.命令行参数检查
if(argc!
=2)
{
cerr<
<
"
命令行参数错误!
"
<
endl;
return1;
}
如果命令行参数的数目不是2的话,说明输入有误,需打印错误信息,然后退出。
2.初始化动态链接库
WSADATAwsa_data;
if(WSAStartup(MAKEWORD(2,2),&
wsa_data)!
=0)
cerr<
WSAStartup()error!
return1;
}
如果初始化失败,则退出程序。
4.3套接字的创建和设置
1.套接字的创建
创建一个原始套接字,用来捕获数据包。
SOCKETs=socket(AF_INET,SOCK_RAW,IPPROTO_IP);
if(s==INVALID_SOCKET)
WSACleanup();
socket()error!
}
如果创建失败,则退出程序。
2.绑定本机地址
将刚刚建立的套接字与本机IP地址绑定。
structsockaddr_inhostaddr;
hostaddr.sin_family=AF_INET;
hostaddr.sin_port=htons(0);
hostaddr.sin_addr.s_addr=gethostid();
if(bind(s,(sockaddr*)&
hostaddr,sizeof(sockaddr))!
closesocket(s);
bind()error!
exit(-1);
WinSock提供的bind()函数用于将一个套接字与一个地址绑定。
绑定之后,原始套接字就能接收流经该IP地址所属网络接口的全部IP数据包。
3.设置套接字为SIO_RCVALL
DWORDin_buffer=1,n_returned;
intret=WSAIoctl(s,SIO_RCVALL,&
in_buffer,sizeof(in_buffer),
NULL,0,&
n_returned,NULL,NULL);
if(ret!
WSAIoctl()error!
将套接字设置为SIO_RCVALL之后,套接字就能捕获局域网内所有的IP数据包,如果设置失败,就退出程序。
4.4数据包的捕获与分析
前面的步骤完成之后就可以进行数据包的捕获了。
主要用到WinSock提供的recv函数,recv函数的原型为:
size_trecv(SOCKETsockfd,void*buf,size_tlen,intflags);
recv()如果执行成功,则捕获的数据包存储在buf中。
主要代码如下:
for(;
;
)
{
intn_recv=recv(s,buf,sizeof(buf),0);
SYSTEMTIMEcur_time;
GetLocalTime(&
cur_time);
//获得捕获数据包的时间
if(n_recv>
0)
IPHead*lp_iphead=(IPHead*)buf;
charbuf[20];
sprintf(buf,"
%02d:
%03d"
cur_time.wHour,
cur_time.wMinute,cur_time.wSecond,cur_time.wMilliseconds);
//输出到标准输出
cout<
捕包时间\t"
buf<
output_ip(lp_iphead,cout);
endl<
//输出到文件
fout<
output_ip(lp_iphead,fout);
fout.flush();
其中,output_ip是一个自定义函数,该函数,将lp_iphead所向的IP信息输出到输出流fout。
4.5信息的输出
信息的输出用函数output_ip函数完成,其定义如下:
/*
**将IP数据包信息输出到out流
**ip_iphead为指向IPHead类型的指针
*/
voidoutput_ip(IPHead*lp_iphead,ostream&
out)
out<
版本\t\t"
(int)lp_iphead->
version<
头长度\t\t"
(int)(lp_iphead->
ihl*4)<
服务类型\t"
tos<
总长度\t\t"
lp_iphead->
len<
标识\t\t"
id<
u_shortunserved=(lp_iphead->
off)>
>
15;
u_shortDF=((lp_iphead->
14)&
0x0001;
u_shortMF=((lp_iphead->
13)&
标志位\t\t"
unserved<
DF<
MF<
偏移量\t\t"
((lp_iphead->
off)&
0x1fff)<
生存期\t\t"
ttl<
协议\t\t"
protocol;
map<
:
const_iteratorit=IP_PROTOCOL.find(lp_iphead->
protocol);
if(it!
=IP_PROTOCOL.end())
out<
("
it->
second<
)"
校验和\t\t"
cksum<
源IP地址\t"
inet_ntoa(lp_iphead->
saddr)<
目的IP地址\t"
daddr)<
第五章程序运行结果与分析
5.1程序运行结果截图
标准输出截图:
日志文件截图:
通过对大量输出数据的分析,发现程序的输出是正确的。
5.2程序中有待改进的地方
这个程序只能捕获IPv4数据包,不能捕获IPv6数据包。
可以通过修改程序,让这个程序既能捕获IPv4数据包,又能捕获IPv6数据包,那么这个程序就会更加的完善。
还可以为这个程序设计一个图形用户界面,使程序更加美观,更加易于使用。
还可以为程序增加一个功能,让程序能获取数据包中的内容,可就需要对各种应用程协议进行解析(例如:
TCP,UDP)。
总之,只要多花点功夫,这个程序可以做的更好。
第六章总结
本次课程设计让我学会了很多的东西,其中,最值得一提的是:
①对IP协议有了比较深入的了解;
②学习了Windowssocket。
我选择的课题是IP数据包的捕获与分析。
所以需要对IP数据包有非常深入的了解。
这次实验中,我把IP协议学了好多遍,知道了IP头中每一个字段的意思。
对IP数据包的捕获,我使用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IP 数据包 捕获 分析 设计 报告
