2022年2022年计算机网络课程设计报告_IP数据包的捕获与分析 .pdf
CENTRAL SOUTH UNIVERSITY 计算机网络课程设计报告题目 IP数据包的捕获与分析学生姓名廖成班级学号 0902130408 指导教师穆帅设计时间 2015年 11 月名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 17 页 - - - - - - - - - 目录第一章 绪论.3 1.1 课题研究背景 .3 1.2 课题研究的意义 .3 第二章 课程设计的目的与要求 .3 2.1 课程设计的目的 .3 2.2 课程设计的要求 .4 第三章 课程设计的内容 .4 3.1 课程设计的内容 .5 3.2 内容的要求 .5 第四章 程序设计与分析 .5 4.1 IP 数据包 .5 4.1.1 数据包的格式说明 .5 4.1.2 头部数据结构的定义 .7 4.2 部分程序实现 .7 4.2.1 套接字的使用 .7 4.2.2 数据库的使用 .8 4.2.3 各部分详细实现 .9 4.4 程序流程图 .12 4.4.1 主程序流程图 .12 4.4.2 捕获并分析数据包头部模块流程图.13 4.4.3 头部信息存数据库模块 .13 第五章 实验结果 .14 5.1 程序截图 .14 第六章 总结.16 6.1 实验心得 .16 第七章 附录.17 参考文献 .17 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 17 页 - - - - - - - - - 第一章 绪论1.1 课题研究背景随着计算机技术的发展,网络的应用迅速普及,网络已日益成为生活中不可或缺的工具。同时,网络的安全性与可靠性日益受到人们的重视,安全性指的是网络上的信息不被泄露、更改和破坏,可靠性指的是网络系统能够连续、可靠地运行,网络服务不被中断。网络数据包捕获、监听与分析技术是网络安全维护的一个基础技术同时也是网络入侵的核心手段。所以研究有关数据包捕获和分析技术对保证网络的健康、安全运行是很有意义的。1.2 课题研究的意义计算机之间进行通信时,交互的所有信息都封装在数据包中。因此,通过采集网络数据并对其进行相应的分析, 可以清楚地了解到进行通信的计算机的通信目的。通过分析采集到的数据包可以确定网络是否受到入侵;其次也可以通过采集到的数据包来分析应用程序可能出现的问题及原因;此外,通过网络数据的采集和统计可以清楚地了解整个网络在各个时段内的网络负载情况,从而判断网络使用得是否合理。 除了以上谈到的几个方面外, 网络数据包的采集和分析还有其它很多用途。第二章 课程设计的目的与要求2.1 课程设计的目的计算机网络课程设计的目的, 是为了让学生更深入地掌握计算机网络的核心内容,实现理论与实践相结合。 让学生用具体的实践成果, 体现对理论知识的掌握程度。有利于学生提高计算机网络的实践能力,加深对计算机网络理论知识的理解。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 17 页 - - - - - - - - - 2.2 课程设计的要求(1)编写程序,实现系统的基本功能,鼓励自行增加新功能;(2)要有用户界面:要求至少采用文本菜单界面;鼓励采用图形菜单界面;(3)写课程设计报告,内容包括:封面(参见附录 I )需求分析:以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?给出功能模块图和流程图。同时明确规定:输入的形式和输出值的范围;输出的形式;程序所能够达到的功能;测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。概要设计:包括程序设计组成框图,程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义)。详细设计:包括模块功能说明(如函数功能、入口及出口参数说明,函数调用关系描述等),每个模块的算法设计说明(可以是描述算法的流程图)。其中源程序要按照写程序的规则来编写,结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。运行结果:包括典型的界面、输入和输出数据等;总结:包括课程设计中遇到的问题,解决问题的过程及体会、收获、对课程设计的认识与思考等。附录:包括主要程序清单,要有适当的注释,使程序容易阅读。(4) 课程设计报告书写规范参见附录II , 不按照规范书写的, 成绩不能评为“优”或“良”。(5)无论在校外、校内,都要严格遵守学校和所在单位的学习和劳动纪律、规章制度,学生有事离校必须请假。课程设计期间,无故缺席按旷课处理;缺席时间达四分之一以上者,其成绩按不及格处理。第三章课程设计的内容名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 17 页 - - - - - - - - - 3.1 课程设计的内容本次实验的要求在网络环境, 使用 VC+ 编写程序实现捕获网络中的IP 数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。3.2 内容的要求(1)了解 IP 数据包的组织结构, 设计程序使其能够自动捕获流经本地网卡的一定数量的 IP 数据包并解析数据包头部信息。(2)在标准输出和日志文件中写入捕获的IP 包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源 IP 地址和目的 IP 地址等内容。(3)最好能用数据库等便于数据存储分析的媒介保存捕获IP 数据包的头部信息,建议设计用户界面。第四章 程序设计与分析4.1 IP数据包4.1.1 IP数据包的格式说明IP 数据包格式包含了标头固定部分,标头可变部分和数据区三部分。IP 数据包标头固定部分为20 个字节,其中包含了 12 个参数域,各参数域隐含着网间协议的传输机制。 IP 包头部具体的标头格式下图所示:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 17 页 - - - - - - - - - 4位版本4位首部长度8位服务类型 (TOS)16位总长度 (字节为单位 )16位标识3位标志13位片偏移8位生存时间 (TTL)8位协议16位首部检验和32位源 IP地址32位目的 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,用于控制和测试。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 17 页 - - - - - - - - - 4.1.2 头部数据结构的定义IP 数据包由 IP 头部与 IP 数据构成,需要自行构造的是IP 数据包的头部。在解析 IP 头部的各个字段之前, 首先需要构造 IP 头部的数据结构, 包括 1 字节的版本与头部长度、 1 字节的服务类型、 2 字节的总长度、 2 字节的标识符、 2字节的标志位与片偏移、 1 字节的生存周期、 1 字节的协议、 2 字节的头部校验、4 字节的源地址与4 字节的目的地址。这里,不需要构造选项与填充字段。struct IP_HEAD union unsigned char Version;/版本(字节前 4 位)unsigned char HeadLen;/首部长度(字节后4 位); unsigned char ServiceType;/服务类型unsigned short TotalLen;/总长度( 16 位)unsigned short Identifier;/标识符union unsigned short Flags;/标志位(字前位)unsigned short FragOffset;/片偏移(后位); unsigned char TimeToLive;/生存时间unsigned char Protocol;/协议unsigned short HeadChecksum;/头部校验和unsigned int SourceAddr;/源 IP 地址unsigned int DestinAddr;/目的 IP 地址; 4.2 程序实现4.2.1 套接字的使用本程序使用套接字socket 编程,将网卡设为能够接受流经网卡的所有类型的数据包。首先,初始化套接字,然后监听数据包,解析数据包。sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP)用来创建套接字,其参数为通信发生的区字段和套接字的类型。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 17 页 - - - - - - - - - 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 中保存数据库操作语句。 执行数据库操作之前需生成数据库操作语句,实现如下:string version,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=insert into head_infos values(IPv; s2=); s3=,; 以上语句为字符串常量定义,用于连接生成数据库语句。在解析数据包头部信息时,返回值各不相同,为了便于使用字符串连接操作生成数据库执行语句,需将头部信息统一转换为字符串类型,自定义函数itos(int n)用于将 int类型转换为 string类型,具体实现如下:string itos(int n) stringstream ss; ssstr; return str; 将 int类型转换为 string类型s=s1+version+s3+len_h+bits+s3+priority+s3+type+s3+len_t+bits+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();将生成的数据库插入语句格式化。mysql_query(conn,sql_query);执行 MySQL 语句将信息存入数据库。4.2.3 各部分详细实现要进行 IP 层数据包的接收和发送, 应使用原始套接字。 创建原始套接字的代码如下: WSADATA wsadata; 建立一个 WSADATA结构,wsaData 用来存储系统传回的关于 WINSOCK 的资料。 WSAStartup(MAKEWORD(2,2),&wsadata);调用任何套接字 API 函数之前都必须成功调用一次WSAStartup() 函数。 sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP); 创建原始套接字。 bool flag=TRUE; setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag);设置 IP 头操作选项。在 soccket() 函数中,第一个参数指定通信发生的区字段,AF_INET是针对Internet的, 允许在远程主机之间通信。 第二个参数是套接字的类型, 在 AF_INET地址族下,有 SOCK_STREAM、SOCK_DGRAM、SOCK_RAW三种套接字类型。在这里,设置为 SOCK_RAW,表示声明的是一个原始套接字类型。第三个参数依赖于第二个参数,用于指定套接字所有的特定协议,这里使用IP 协议。第四个参数为WSAPROTOCOL_INFO位,该位可以置空。第五个参数保留,永远置0。第六个参数是标志位, WSA_FLAG_OVERLAPPED表明可以使用发送接收超时设置。创建原始套接字后, IP 头就会包含在接收的数据中。然后,可以设置IP 头名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 17 页 - - - - - - - - - 操作选项,调用 setsockopt函数。其中 flag设置为 true ,并设定 IP_HDRINCL选项,表明用户可以亲自对IP 头进行处理。gethostname(hostName,100); 获取本地主机名。pHostIP=gethostbyname(hostName); 获取本机 IP 地址。sockaddr_in host_addr;sockaddr_in结构的值必须是以网络字节顺序表示的值,不能直接使用本机字节顺序的值。/* 填充 sockaddr_in结构的内容 */ host_addr.sin_family=AF_INET;协议族 AF_INET。host_addr.sin_port=htons(6000);honts()函数可以将主机数据转换为网络字节顺序的数据。host_addr.sin_addr=*(in_addr *)pHostIP-h_addr_list0; bind(sock,(PSOCKADDR)&host_addr,sizeof(host_addr);把原始 Socket绑定到本地网卡。填写 sockaddr_in 的内容时,其地址值应填写为本机IP 地址,本机 IP 地址可以通过 gethostbyname() 函数获取;端口号可以随便填写, 但不能与系统冲突,要求大于 1024;协议族应填为 AF_INET 。使用 htons() 函数可以将无符号短整型的主机数据转换为网络字节顺序的数据。最后使用 bind() 函数将 socket 绑定到本机网卡上。绑定网卡后,需要用WSAIoctl() 函数把网卡设置为混杂模式,使网卡能够接收所有网络数据,其关键代码如下:DWORD dwBufferLen10; DWORD dwBufferInLen=1; DWORD dwBytesReturned=0; WSAIoctl(sock,_WSAIOW(IOC_VENDOR,1),&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL);如果接收的数据包中的协议类型和定义的原始套接字匹配,那么接收到的数据就拷贝到套接字中。因此,网卡就可以接收所有经过本机网卡的IP 数据包。recv() 函数用来接收经过的IP 包,其参数分别是套接字描述符,缓冲区的地址,缓冲区的大小。在程序中可使用recv() 函数接收经过的 IP 包。该函数有四个参数,第一个参数接收操作所用的套接字描述符;第二个参数接收缓冲区的名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 17 页 - - - - - - - - - 地址;第三个参数接收缓冲区的大小,也就是所要接收的字节数; 第四个参数是一个附加标志,如果对所发送的数据没特殊要求,直接设置为0。因为 IP 数据包的最大长度是 65535字节,因此,缓冲区的大小不能小于65535 字节。设置缓冲区后,可利用循环来反复监听接收IP 包,用 recv() 函数实现接收功能的代码如下:char buffer65535;设置缓冲区大小while(num0)接收数据包IP_HEAD ip=*(IP_HEAD *)buffer;逐步解析 IP 头部的各个字段 通过生成 P_HEAD 结构,使用移位运算和与运算操作解析IP 头各个字段的代码具体实现如下:ip.Version4;/*获取版本字段 */ ip.HdrLen & 0 x0f;/*获取头部长度字段 */ ip.ServiceType5;/*获取服务类型字段中的优先级子域*/ (ip.ServiceType1)&0 x0f;/*获取服务类型字段中的TOS子域*/ ip.TotalLen;/*获取总长度字段 */ ip.ID;/*获取标识字段 */ DF = (ip.Flags14) & 0 x01;/*解析标志字段 */ MF = (ip.Flags13) & 0 x01; ip.FragOff & 0 x1fff;/*获取分段偏移字段 */ ip.TimeToLive;/*获取生存时间字段 */ ip.Protocol;/*获取协议字段 */ ip.HdrChksum;/* 获取头校验和字段 */ inet_ntoa(*(in_addr*)&ip.SrcAddr);/*解析源 IP 地址字段 */ inet_ntoa(*(in_addr*)&ip.DstAddr);/*解析目的 IP 地址字段 */ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 17 页 - - - - - - - - - 4.4 程序流程图4.4.1 主程序流程图:开始初始化数据库连接信息并连接到数据库调用 Start() 启动 winsock 并创建原始 Socket 调用 Fill_bind() 填充 sockaddr_in 并绑定socket 到本地网卡调用 Set_() 将网卡设置为混杂模式,截获流经网卡的所有IP 数据报根据输入,循环捕获并分 析 相 应 数 量 的 数 据包,将头部信息存入数据库同时显示在到屏幕断开数据库连接,关闭套接字结束名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 17 页 - - - - - - - - - 4.4.2 捕获并分析数据包头部模块流程图:4.4.3 头部信息存数据库模块:开始Int num=0 要求捕获并分析的ip数据包数量packsum 如 果 recv() 返回值大于零 ,则将缓冲中数据强制转换为 IP_HEAD * 类型解析并输出 IP数据包头部信息, 调用函数insert_db()将头部信息存入数据库num+ 结束numpacksum? Y N 定义字符串常量,用于生成 MySQL 插入语句开始结束调用 itos() 将解析的IP 头部信息转换为string 类型,便于生成数据库插入语句调用 sprintf() 函数将 MySQL语句格式化, mysql_query()函数执行MySQL 插入语句名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 17 页 - - - - - - - - - 第五章 实验结果5.1 程序截图(1)输入要捕获 IP 数据包个数(2)正在捕获数据包名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 17 页 - - - - - - - - - (3)捕获到需要捕获个数的数据包(4)登陆到数据库,查看保存的头部信息名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 17 页 - - - - - - - - - (5)保存在数据库中的信息第六章总结6.1 实验收获通过本次课程设计,我将之前计算机网络课程学过的相关知识系统地学习了一遍,对 IP 数据包的格式以及如何对IP 数据包进行相关的操作都有了比较深刻的掌握,了解和学习到很多以前没有关注的知识,弥补了自己某些方面知识的缺陷。由于之前在课堂上学的知识比较有限,知识面不够广, 只是初步地了解了计算机网络的相关概念, 将理论应用于实践的机会不多,没有系统的掌握有关知识。本次课程设计开始时遇到了很多困难,通过查阅相关资料以及认真学习相关知识,逐渐掌握了捕获与分析IP 数据包的原理, 之前面临的问题也迎刃而解了。在本次课设中我学会了如何在C+ 程序中嵌入 MySQL 数据库的操作,如今,程序设计正由面向用户转向面向数据, 用后台数据库保存程序中的数据对程序的安全性、 健壮性都有很大的提升, 我相信这对我在以后的程序设计中会有很大的帮助。并且在这次程序中总结的很多失败与成功的经验对我以后程序开发的能力会有很大的提升。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 17 页 - - - - - - - - - 第七章附录程序源代码(详见附件)参考文献1 计算机网络 ( 第 5 版)/( 美)特南鲍姆( Tanenbaum ,A.S. ),( 美) 韦瑟罗尔(Wetherall ,D.J. )著;严伟,潘爱民译 .- 北京:清华大学出版社, 2012.3 2 W.Richard Stevens.TCP/IP 详解. 卷 1: 协议. 机械工业出版社,2000.4. 3 计算机网络(第2 版)/21 世纪大学本科计算机专业系列教材吴功宜编著;- 北京:清华大学出版社4 计算机网络:原理、应用和实现 / 高等学校教材计算机科学与技术王卫亚等主编,李晓莉等编著 ; 清华大学出版社名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 17 页 - - - - - - - - -