计算机网络课程设计报告IP数据包的捕获与分析Word下载.docx
《计算机网络课程设计报告IP数据包的捕获与分析Word下载.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计报告IP数据包的捕获与分析Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
随着计算机技术的发展,网络的应用迅速普及,网络已日益成为生活中不可或缺的工具。
同时,网络的安全性与可靠性日益受到人们的重视,安全性指的是网络上的信息不被泄露、更改和破坏,可靠性指的是网络系统能够连续、可靠地运行,网络服务不被中断。
网络数据包捕获、监听与分析技术是网络安全维护的一个基础技术同时也是网络入侵的核心手段。
所以研究有关数据包捕获和分析技术对保证网络的健康、安全运行是很有意义的。
1.2课题研究的意义
计算机之间进行通信时,交互的所有信息都封装在数据包中。
因此,通过采集网络数据并对其进行相应的分析,可以清楚地了解到进行通信的计算机的通信目的。
通过分析采集到的数据包可以确定网络是否受到入侵;
其次也可以通过采集到的数据包来分析应用程序可能出现的问题及原因;
此外,通过网络数据的采集和统计可以清楚地了解整个网络在各个时段内的网络负载情况,从而判断网络使用得是否合理。
除了以上谈到的几个方面外,网络数据包的采集和分析还有其它很多用途。
第2章课程设计的目的与要求
2.1课程设计的目的
计算机网络课程设计的目的,是为了让学生更深入地掌握计算机网络的核心内容,实现理论与实践相结合。
让学生用具体的实践成果,体现对理论知识的掌握程度。
有利于学生提高计算机网络的实践能力,加深对计算机网络理论知识的理解。
2.2课程设计的要求
(1)编写程序,实现系统的基本功能,鼓励自行增加新功能;
(2)要有用户界面:
要求至少采用文本菜单界面;
鼓励采用图形菜单界面;
(3)写课程设计报告,内容包括:
●封面(参见附录I)
●需求分析:
以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?
给出功能模块图和流程图。
同时明确规定:
输入的形式和输出值的范围;
输出的形式;
程序所能够达到的功能;
测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。
●概要设计:
包括程序设计组成框图,程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义)。
●详细设计:
包括模块功能说明(如函数功能、入口及出口参数说明,函数调用关系描述等),每个模块的算法设计说明(可以是描述算法的流程图)。
其中源程序要按照写程序的规则来编写,结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。
●运行结果:
包括典型的界面、输入和输出数据等;
●总结:
包括课程设计中遇到的问题,解决问题的过程及体会、收获、对课程设计的认识与思考等。
●附录:
包括主要程序清单,要有适当的注释,使程序容易阅读。
(4)课程设计报告书写规范参见附录II,不按照规范书写的,成绩不能评为“优”或“良”。
(5)无论在校外、校内,都要严格遵守学校和所在单位的学习和劳动纪律、规章制度,学生有事离校必须请假。
课程设计期间,无故缺席按旷课处理;
缺席
时间达四分之一以上者,其成绩按不及格处理。
3.1课程设计的内容
本次实验的要求在网络环境,使用VC++编写程序实现捕获网络中的IP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。
3.2内容的要求
(1)了解IP数据包的组织结构,设计程序使其能够自动捕获流经本地网卡的一定数量的IP数据包并解析数据包头部信息。
(2)在标准输出和日志文件中写入捕获的IP包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容。
(3)最好能用数据库等便于数据存储分析的媒介保存捕获IP数据包的头部信息,建议设计用户界面。
第4章程序设计与分析
4.1IP数据包
4.1.1IP数据包的格式说明
IP数据包格式包含了标头固定部分,标头可变部分和数据区三部分。
IP数据包标头固定部分为20个字节,其中包含了12个参数域,各参数域隐含着网间协议的传输机制。
IP包头部具体的标头格式下图所示:
各参数域的具体含义如下:
1)版本号:
长度4位,表示所使用的IP协议的版本。
IPv4版本号字段值为4;
IPV6版本号字段号的值为6,目前主要是Ipv4。
2)标头长:
长度4位,定义了一个以4B为一个单位的IP包的首部长度,一般长度为20-40个字节。
3)服务类型:
共8位,高3位组成优先级子域,随后4位组成服务类型子域,最后一位暂未使用。
4)数据报总长度:
总长度为2B(即16位)。
定义了以字节为单位的数据报的总长度,即一个数据报总长度为65535。
5)重装标识:
长度16位,用于识别IP数据报的编号,让目的主机判断新来的数据属于哪个分组。
6)分片标识:
共3位,最高位为0;
DF为禁止分片标识,DF=0表示可以分片;
DF=1表示不能分片。
MF为分片标识,MF=0表示接的是最后一个分片;
MF=1表示不是最后一个分片。
7)片偏移值:
共13位,说明分片在整个数据报中的相对位置。
8)生存周期:
共8位,用来设置数据数据报在整个网络传输过程中的寿命。
常以一个数据报可以经过的最多的路由器跳步数来控制。
9)协议类型:
共8位,表示该IP数据报的高层协议类型。
10)标头校验和:
共16位,用于存放检查报头错误的校验码。
11)源、宿主机地址:
各32位,分别表示发送和接受数据报的源主机和宿主机的IP地址。
12)选项数据域:
0-20B,用于控制和测试。
4.1.2头部数据结构的定义
IP数据包由IP头部与IP数据构成,需要自行构造的是IP数据包的头部。
在解析IP头部的各个字段之前,首先需要构造IP头部的数据结构,包括1字节的版本与头部长度、1字节的服务类型、2字节的总长度、2字节的标识符、2字节的标志位与片偏移、1字节的生存周期、1字节的协议、2字节的头部校验、4字节的源地址与4字节的目的地址。
这里,不需要构造选项与填充字段。
structIP_HEAD
{
union
{
unsignedcharVersion;
//版本(字节前4位)
unsignedcharHeadLen;
//首部长度(字节后4位)
};
unsignedcharServiceType;
//服务类型
unsignedshortTotalLen;
//总长度(16位)
unsignedshortIdentifier;
//标识符
unsignedshortFlags;
//标志位(字前位)
unsignedshortFragOffset;
//片偏移(后位)
unsignedcharTimeToLive;
//生存时间
unsignedcharProtocol;
//协议
unsignedshortHeadChecksum;
//头部校验和
unsignedintSourceAddr;
//源IP地址
unsignedintDestinAddr;
//目的IP地址
};
4.2程序实现
4.2.1套接字的使用
本程序使用套接字socket编程,将网卡设为能够接受流经网卡的所有类型的数据包。
首先,初始化套接字,然后监听数据包,解析数据包。
sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP)用来创建套接字,其参数为通信发生的区字段和套接字的类型。
bind(sock,(PSOCKADDR)&
host_addr,sizeof(host_addr))用来把原始socket绑定到本地网卡。
WSAIoctl(sock,_WSAIOW(IOC_VENDOR,1),&
dwBufferInLen,sizeof(dwBufferInLen),&
dwBufferLen,sizeof(dwBufferLen),&
dwBytesReturned,NULL,NULL)函数用来把网卡设置为混杂模式。
4.2.2数据库的使用
本程序需要将捕获的数据包头部信息存入数据库以便以后统计和分析,在使用数据库执行相关数据库的操作之前必须先连接到数据库。
具体实现如下:
MYSQL*mysql=mysql_init(NULL);
初始化一个并返回一个新的MySQL对象。
mysql_real_connect(mysql,con.host,con.user,con.password,con.db,3306,NULL,0);
根据传入的参数信息连接到数据库。
数据库连接成功后就可以使用mysql_query(conn,sql_query)函数执行数据库的操作了,conn为数据库连接句柄,sql_query中保存数据库操作语句。
执行数据库操作之前需生成数据库操作语句,实现如下:
stringversion,len_h,priority,type,len_t,identi,df,mf,s_offset,
life_t,protocol,checksum,s_ip,d_ip,s1,s2,s3,s;
定义string类型变量。
s1="
insertintohead_infosvalues('
IPv"
;
s2="
'
)"
s3="
'
"
以上语句为字符串常量定义,用于连接生成数据库语句。
在解析数据包头部信息时,返回值各不相同,为了便于使用字符串连接操作生成数据库执行语句,需将头部信息统一转换为字符串类型,自定义函数itos(intn)用于将int类型转换为string类型,具体实现如下:
stringitos(intn)
{
stringstreamss;
ss<
<
n;
ss>
>
str;
returnstr;
}将int类型转换为string类型
s=s1+version+s3+len_h+"
bits"
+s3+priority+s3+type+s3+len_t+"
+s3+identi+s3+df+s3+mf+s3+s_offset+s3+life_t+s3+protocol+s3+checksum+s3+s_ip+s3+d_ip+s2;
生成数据库要执行的插入语句。
sprintf(sql_query,s.c_str());
将生成的数据库插入语句格式化。
m