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