《ip数据包分析》由会员分享,可在线阅读,更多相关《ip数据包分析(13页珍藏版)》请在金锄头文库上搜索。
1、1.开发背景计算机网络是计算机技术与通信技术紧密结合的产物,网络技术队信息产业的发展产生深远的影响,而且将发挥越来越大的作用。本章在介绍网络形成于发展历史的基础上,对网络定义、分类与拓扑构型等问题进行了系统的讨论,并对网络的应用、网络技术的研究与发展进行了探讨,以帮助人们对网络技术与应用有一个全面和准确的认识。IP数据包作为网络层的数据必然要通过帧来传输。一个数据包可能要通过多个不同的网络。每一个路由器都要讲接收到的帧进行拆包和处理,然后封装成另外一个帧。帧的格式与长度取决于网络所采用的协议。从网络层数据链路层来看,由于IP数据包的最大长度为65535B,那么它所使用的网络的数据链路层最大传输
2、单元的长度为65535B,那么传输的效率一定会很高。但是实际上大量使用的网络的最大传输单元长度都比IP数据包的最大长度短。以太网的MTU长度为1500B,它远小于IP数据包的最大长度。因此,使用这些网络传输IP数据包时,要对IP数据包进行分成若干较小的片濑传输,这些片的长度小于或等于数据链路层MTU的长度。#2.需求分析在传输路径中,路由器通常连接多个网络。不同的网络的数据链路层最大传输单元的长度的可能不同的,因此路由器在接收到数据包,并准备要转发到目的主机时,它必须首先决定使用哪一个接口网络,要决定该网络的数据链路层最大传输单元是否允许该数据包通过。根据数据包长度来确定是否需要对数据包进行分
3、片。如果数据包来自一个能够通过较大数据包的局域网,又要通过另一个只能通过较小的数据包的局域网,那么就必须对IP数据包进行分片。IP数据包分片的方法如下图所示在IP数据包分片时,首先要确定片长度。然后将原始IP数据包包括报头分成第1个片。如果剩下的数据仍然超过长度,那么需要进行第2次分片。第2个分片数据加上原来的报头,构成第2个片。这样一直分割到剩下的数据小于片长度为止。3.可行性分析经济可行性适用本计算机安全系统可提高计算机通信流量分析和管理水平,把大量繁琐工作简单化,能够有效地节省人力物力,并能够准确地进行统计和计算,避免人工统计或计算所带来的差错,保证计算机通信管理高效而有序地进行。技术可
4、行性本系统前台采用Microsoft公司的VisualC+6.0作为主要开发工具;该系统在安全、准确性和运行速度方面都占有一定优势。4.系统分析本系统是针对于计算机通信流量分析的,通过对IP数据包的版本、头部长度服务类型、总长度、标示符、标志位、片位移、生存周期、协议、头部校验和、源地址、目的IP地址。对所输入的IP数据包进行对应的分析可以得到一系列的对应的属性值。管理员通过对这些IP数据包属性值进行对应的解析可以得到该网络的通信具体情况。5.系统设计5.1系统目标利用语言,根据所学知识,设计程序,功能为捕获网络中的数据包,接续数据包的内容,将结果显示在比准输出上,并同时写入日志文件。具体:以
5、命令行形式运行,其中是程序命,而则代表记录记过的日志文件。在标准输出和日志文件中写入捕获的包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源地址和目的地址等内容。当程序接收到键盘输入时推出。5.2系统功能结构通过对相应的数据包进行分析可以得出: 数据包版本的信息 数据包头长度的信息 数据包服务类型的信息 数据包数据包总长度的信息 数据包数据包标识的信息 数据包分段标志的信息 数据包分段偏移值的信息 数据包生存时间的信息 数据包上层协议类型的信息 数据包头校验和的信息 数据包源地址的信息 数据包目的地址的信息通过对以上的数据报的分析可
6、以得到具体的网络流量状况,并通过对其进行分析,得到当前网络的状况的流量分析结果,从而实现高效的管理。#3结构功能图及活动流程图.结1构功能图IP数据包分析目的地址5.3.2功能活动图5.4具体功能实现5.4.1网卡设置为了获取网络中的数据包,必须对网卡进行编程,在这里使用套接字进行编程。但是,在通常情况下,网络通信的套接字程序只能响应与自己硬件地址相匹配的数据包或是以广播形式发出的数据包。对于其他形式的数据包,如已到达网络接口,但却不是发送到此地址的数据包,网络接口在骓投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的数据包。我们要想获取网络设备的所有数据包,就是需要将
7、网卡设置为混杂模式。5.4.2接收数据包在程序中可使用函数接收经过的包。该函数有四个参数,第一个参数接收操作所用的套接字描述符;第二个参数接收缓冲区的地址;第三个参数接收缓冲区的大小,也就是所要接收的字节数;第四个参数是一个附加标志,如果对所发送的数据没特殊要求,直接设为。因为数据包的最大长度是3因此缓冲区的大小不能小于。设置缓冲区后,可利用循环来反复监听接收包,用函数实现接收功能。定义头部的数据结构没有详细的进行数据包的定义,而是利用数据包的结构进行调用使得成为一个虚拟的数据报。例如:source.S_un.S_addr=pIPHeader-ipSource;就是从IP头中取出IP数据源的。
8、dest.S_un.S_addr=pIPHeader-ipDestination;从IP头中取出目的IP地址的。后面的依次同理进行求解。包的解析解析包的字段有两种策略。针对长度为位、位和位的字段或子字段时,可以利用的成员直接获取。要解析长度不是位倍数的字段或子字段时,可以利用语言中的移位以人、及与、或操作完成。#5.5具体的实现代码#includeinitsock.h#includeprotoinfo.h#include#include#include#include#includemstcpip.h/#pragmacomment(lib,Advapi32.lib)CInitSocktheSo
9、ck;voidIPHQZ(char*);intnc=0;voidmain()SOCKETsAYU=socket(AF_INET,SOCK_RAW,IPPROTO_IP);/创建原始套接字sHQZ.charszHostName56;SOCKADDR_INaddr_in;gethostname(szHostName,56);/获取主机名。structhostent*pcHost;/创建一结构体对象用于存放获得的本机IP。if(pcHost=gethostbyname(char*)szHostName)=NULL)return;addr_in.sin_family=AF_INET;#.S_addr,
10、pcHost-h_addr_listaddr_in.sin_port=htons(0);memcpy(&addr_in.sin_addr.S_un0,pcHost-h_length);cout欢迎使用IP网络数据包分析工具endl0)IPHQZ(buff);closesocket(sAYU);voidIPHQZ(char*pData)coutendl;coutIP网络数据包分析endlipSource;/从IP头中取出源dest.S_un.S_addr=pIPHeader-ipDestination;/从IP头中取出目的IP地址strcpy(szSourceIp,:inet_ntoa(sour
11、ce);strcpy(szDestIp,:inet_ntoa(dest);coutvvTP包源地址vvszSourcelpvvendl;coutvvTP包目的地址vvszDestlpvvendl;intiphver=(pIPHeader-iphVerLen4)&0xf)*sizeof(UCHAR);/IP包版本号coutIP包版本为:IPviphveriphVerLen&0xf)*sizeof(ULONG);/IP报头长度coutvvTP包报头长度为vvnHeaderLenvvendl;coutvv开销为:vv(pIPHeader-ipTOSl)&Oxl)vvendl;coutvv可靠性为:v
12、v(pIPHeader-ipTOS2)&0x1)vvendl;coutvv吞吐量为:vv(pIPHeader-ipTOS3)&0x1)vvendl;coutvv延迟为:vv(pIPHeader-ipTOS4)&0x1)vvendl;coutvv优先级为:vv(pIPHeader-ipTOS5)&0x1)vv(pIPHeader-ipTOS6)&0xf)*sizeof(UCHAR)vv(pIPHeader-ipTOS7)&0xf)*sizeof(UCHAR)vvendl;intcountlen=(pIPHeader-ipLength);coutvvIP包总长度为:vvcountlenvvBvve
13、ndl;coutvv标识为:vvpIPHeader-ipIDvvendl;coutvv标志位为:vvpIPHeader-ipFlagsvvendl;coutvv生存时间为:vvint(pIPHeader-ipTTL)vvendl;switch(pIPHeader-ipProtocol)caseIPPROTO_TCP:/TCP协议coutvvTP包使用的协议为:TCPvvendl;break;caseIPPROTO_UDP:coutvvIP包使用的协议为:UDPvvendl;break;caseIPPROTO_ICMP:coutvvTP包使用的协议为:ICMPvvendl;break;caseIPPROTO_IGMP:coutvvTP包使用的协议为:IGMPvvendl;break;coutvv校验和:vvpIPHeader-ipChecksumvvendl;coutvv部分数据为:vvendl;for(inti=1;i100;i+)print