




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
..计算机网络课程设计网络嗅探器的设计与实现学院:信息科学与工程学院专业__指导张士庚____目录一、实验要求2二、实验目的3三、相关知识33.1、IP包格式:33.2、TCP包格式73.3、UDP数据包103.4、IP、TCP、UDP的关系113.5、套接字12四、课程设计分析134.1网卡设置134.2使用套接字134.3接收数据包144.4定义IP头部的数据结构144.5IP包的解析164.6协议的定义164.7捕获处理16五、实验截图17六、源程序代码及分析17七、总结24八、课程设计参考资料25实验要求网络嗅探器的设计与实现:基本要求捕获本网段的数据包,将报文结构显示出来.进一步要求进行数据包协议分析,可以按报头进行统计,提取部分关键信息,如捕获登陆信息,破解登陆密码等.实验目的了解和掌握捕获网络中ip包的方法,了解ip、tcp、udp等包的结构。可用winsock或winpcap来完成嗅探器的设计。本次实验用socket〔套接字在vc6.0上进行编程。相关知识3.1、IP包格式:互联网络层是TCP/IP协议参考模型中的关键部分.IP协议把传输层送来的消息组装成IP数据包,并把IP数据包传送给数据链层.IP协议在TCP/IP协议族中处于核心地位,IP协议制定了统一的IP数据包格式,以消除个通信子网中的差异,从而为信息发送方和接收方提供了透明的传输通道.编制本程序前,首先要对IP包的格式有一定了解,图1给出了IP协议的数据包格式.IP数据包的第一个字段是版本字段,其度是4位,表示所使用的IP协议的版本.目前的版本是IPV4,版本字段的值是4,下一代版本是IPV6,版本字段值是6.本程序主要针对版本是IPV4的数据包的解析.报头标长字段为4位,它定义了以4B为一个单位的IP包的报文长度.报头中除了选项字段和填充域字段外,其他各字段是定长的.因此,IP数据包的头长度在20—40B之间,是可变的.04816192431版本首部长度区分服务总长度标识标志片偏移生存时间协议头校验和源IP地址目的地址选项填充域数据部分图1IP数据包的格式服务类型字段共8位,用于指示路由器如何处理该数据包.该字段长度由4位服务类型<TOS>子域和3位优先级子域组成,1位为保留位,该字段结构如图2所示.B7b6b5b4b3b2b1b0优先级DTRC0图2服务类型字段结构优先级共有8种,优先级越高表明数据包越重要.表1中列出了各种优先级所代表的意义.表一优先子域的说明位数<b7b6b5>意义111网络控制110网络间控制重要<CRITIC/ECP>100即时,优先011即时010立刻001优先000普通在4位服务类型子域中b4,b3,b2,b1分别表示D<延迟>,T<吞吐量>,R<可靠性>与C<成本>.表2列出了服务器类型自域的构成.位数<b4b3b2b1>意义1111安全级最高1000延迟最小0100吞吐量最大0001金钱成本最小0000普通服务总长度字段为2B,它定义了以字节为单位的数据包的总长度.IP数据包的最大长度为65535B.标识字段的长度为16位,用于识别IP数据包的编号.每批数据都要有一个标识值,用于让目的主机判断新来的数据属于哪个分组.报头中的标志字段如图7-3所示.标志字段共3位,最高位是0.禁止分片标志DF<donotfragment>字段的值若为1,表示不能对数据包分片;若DF值为0,则表明可以分片.分片标志MF< morefragment>的值为1,表示接收到的不是最后一个分片;若MF值为0,表示接收到的是最后一个分片.片偏移字段共13位,说明分片在整个数据包中的相对位置.片偏移值是以8B为单位来记数的,因此选择的分片长度应该是8B的整数倍.生存时间<TTL>字段为8位,用来设置数据包在互联网络的传输过程的寿命,通常是用一个数据包可以经过的最多的路由器跳步数来限定的.协议字段为8位,表示使用此IP数据包的高层协议类型,常用的协议号如表3所示.序号协议名称序号协议名称12468ICMPIGMPIPinIPTCPEGP17414689UDPIPV6RSVPOSPFA表3典型的协议号头校验和字段为16位,用于存放检查报头错误的校验码。检验的范围是整个IP包的报头。校验和按如下方法计算:1将头校验和的字段置为0。2将报头部分的所有数据以16位为单位进行累加,累加方式是求异或。3将累加的结果取反码,就是头校验和。当收到一个IP包时,要检查报头是否出错,就把报头中的所有数据以16位为单位进行累加,若累加的结果为0,则报文没有出错。地址字段包括源地址和目的地址。源地址和目的地址的长度都是32位,分别表示发送数据包的源主机和目的主机的IP地址。选项字段的长度范围为0~40B,主要用于控制和测试。在使用选项字段的过程中,有可能出现报头部分的长度不是32位的整数倍的情况。如果出现这种情况,就需要通过填充位来凑齐。3.2、TCP包格式TCP<TransportControlProtocol>传输控制协议:TCP数据包的分组格式:源端口:标识源端应用进程。目的端口:标识目的端应用进程。序号:在SYN标志未置位时,该字段指示了用户数据区中第一个字节的序号;在SYN标志置位时,该字段指示的是初始发送的序列号。确认号:用来确认本端TCP实体已经接收到的数据,其值表示期待对端发送的下一个字节的序号,实际上告诉对方,在这个序号减1以前的字节已正确接收。数据偏移:表示以32位字为单位的TCP分组头的总长度,用于确定用户数据区的起始位置。URG:紧急指针字段有效。ACK:确认好有效。PSH:Push操作。TCP分组长度不定,为提高传输速率,往往要收集到足够的数据后才发送。这种方式不适合实时性要求很高的应用,因此,TCP提供"Push"操作,以强迫传输当前的数据,不必等待缓冲区满才传输。RST:连接复位,重新连接。SYN:同步序号,该比特置位表示连接建立分组。FIN:字符串发送完毕,没有其它数据需要发送,该比特置位表示连接确认分组。窗口:单位是字节,指明该分组的发送端愿意接收的从确认字段中的值开始的字节数量。校验和:对TCP分组的头部和数据进行校验。紧急指针:指出窗口中紧急数据的位置〔从分组序号开始的正向位移,指向紧急数据的最后一个字节,这些紧急数据应优先于其它的数据进行传输。任选项:用于处理一些特殊情况。目前被正式使用的选项字段可用于定义通信过程中的最大分组长度,只能在连接建立时使用。填充:用于保证任选项为32bit的整数倍。
TCP三次握手机制:第一次握手:客户端发送一个SYN〔包含有同步序列号的标志位的数据段和通信请求给服务器,然后等待服务器的回发确认信息第二次握手:服务器发送一个SYN-ACK给客户端,确认已经收到客户端发来的信息第三次握手:客户端接收到服务器发来的确认信息后,再回馈一个ACK给服务器,此时就可与服务器建立可靠的连接ACK:TCP数据包首部中的确认标志,对已接收到的TCP报文进行确认。SYN:SYN是TCP/IP建立连接时使用的握手信号。3.3、UDP数据包UDP<UserDatagramProtocol>用户数据报协议:UDP首部字段由4个部分组成,其中两个是可选的。各16bit的来源端口和目的端口用来标记发送和接受的应用进程。因为UDP不需要应答,所以来源端口是可选的,如果来源端口不用,那么置为零。在目的端口后面是长度固定的以字节为单位的长度域,用来指定UDP数据报包括数据部分的长度,长度最小值为8byte。首部剩下地16bit是用来对首部和数据部分一起做校验和〔Checksum的,这部分是可选的,但在实际应用中一般都使用这一功能。UDP数据报格式有首部和数据两个部分。首部很简单,共8字节。包括:源端口〔SourcePort:2字节,源端口号。目的端口〔DestinationPort:2字节,目的端口号。长度〔Length:2字节,UDP用户数据报的总长度,以字节为单位。检验和〔Checksum:2字节,用于校验UDP数据报的数字段和包含UDP数据报首部的"伪首部"。其校验方法同IP分组首部中的首部校验和。与TCP包的不同之处:
无需三次握手四次断开,传输速度相对于TCP极快,不确定性,甚至可以不需要应答,没有TCP数据包的安全性,有丢包现象。3.4、IP、TCP、UDP的关系TCP/IP协议栈主要分为四层:应用层、传输层、网络层、数据链路层,每层都有相应的协议,如下图所谓的协议就是双方进行数据传输的一种格式。整个网络中使用的协议有很多,所幸的是每一种协议都有RFC文档。在这里只对IP、TCP、UDP协议头做一个分析。
IP协议是TCP/IP协议族中最为核心的协议。它提供不可靠、无连接的服务,也即依赖其他层的协议进行差错控制。在局域网环境,IP协议往往被封装在以太网帧〔见本章1.3节中传送。而所有的TCP、UDP、ICMP、IGMP数据都被封装在IP数据报中传送。如图2-3所示:TCP/IP报文封装3.5、套接字在每个TCP、UDP数据段中都包含源端口和目标端口字段。有时,我们把一个IP地址和一个端口号合称为一个套接字〔Socket,而一个套接字对〔Socketpair可以唯一地确定互连网络中每个TCP连接的双方〔客户IP地址、客户端口号、服务器IP地址、服务器端口号。常见协议和对应的端口号需要注意的是,不同的应用层协议可能基于不同的传输层协议,如FTP、TELNET、SMTP协议基于可靠的TCP协议。TFTP、SNMP、RIP基于不可靠的UDP协议。同时,有些应用层协议占用了两个不同的端口号,如FTP的20、21端口,SNMP的161、162端口。这些应用层协议在不同的端口提供不同的功能。如FTP的21端口用来侦听用户的连接请求,而20端口用来传送用户的文件数据。再如,SNMP的161端口用于SNMP管理进程获取SNMP代理的数据,而162端口用于SNMP代理主动向SNMP管理进程发送数据。还有一些协议使用了传输层的不同协议提供的服务。如DNS协议同时使用了TCP53端口和UDP53端口。DNS协议在UDP的53端口提供域名解析服务,在TCP的53端口提供DNS区域文件传输服务。课程设计分析4.1网卡设置为了获取网络中的IP数据包,必须对网卡进行编程,在这里使用套接字<socket>进行编程。但是,在通常情况下,网络通信的套接字程序只能响应与自己硬件地址相匹配的数据包或是以广播形式发出的数据包。对于其他形式的数据包,如已到达网络接口,但却不是发送到此地址的数据包,网络接口在骓投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的数据包。我们要想获取网络设备的所有数据包,就是需要将网卡设置为混杂模式。4.2使用套接字套接字分为三种,即流套接字<Streamsocket>、数据报套接字<DatagramSocket>和原始套接字<RawSocket>。要进行IP层数据包的接收和发送,应使用原始套接字。创建原始套接字的代码如下:
Socketsock;
sock=socket<AF_INET,SOCK_RAW,IPPROTO_IP>;本设计不用考虑超时情况。创建套接后,IP头就会包含在接收数据包中。然后,我可以设置IP头操作选项,调用setsockopt函数。其中flag设置为true,并设定IP-HDRINCL选项,表明用户可以亲自对IP头进行处理。最后使用bind<>函数将socket绑定到本地网卡上。绑定网卡后,需用WSAIoctl<>函数把网卡设置为混杂模式,使网卡能够接收所有的网络数据。如果接收的数据包中的协议类型和定义的原始套接字匹配,那么接收的数据就拷贝到套接字中,因此,网卡就可以接收所有经过的IP包。4.3接收数据包在程序中可使用recv<>函数接收经过的IP包。该函数有四个参数,第一个参数接收操作所用的套接字描述符;第二个参数接收缓冲区的地址;第三个参数接收缓冲区的大小,也就是所要接收的字节数;第四个参数是一个附加标志,如果对所发送的数据没特殊要求,直接设为0。因为IP数据包的最大长度是65535B,因此缓冲区的大小不能小于65535B。设置缓冲区后,可利用循环来反复监听接收IP包,用recv<>函数实现接收功能。4.4定义IP头部的数据结构程序需要定义一个数据结构表示IP头部。其代码如下:/*定义IP头部数据结构*/typedefstruct_IP_HEADER{ union{ BYTEVersion;//版本〔前4位 BYTEHdrLen;//报头标长〔后四位,IP头长度 }; BYTEServiceType;//服务类型 WORDTotalLen;//总长度 WORDID;//标识 union{ WORDFlags; WORDFragOff; }; BYTETimeToLive; BYTEProtocol; WORDHdrChksum; DWORDSrcAddr; DWORDDstAddr; BYTEOptions;}IP_HEADER;4.5IP包的解析解析IP包的字段有两种策略。针对长度为8位、16位和32位的字段<或子字段>时,可以利用IP-HEADER的成员直接获取。要解析长度不是8位倍数的字段<或子字段>时,可以利用C语言中的移位以人、及与、或操作完成。4.6协议的定义<包含相应的头文件#include#include:
DWORDdwIoControlCode=SIO_RCVALL,/*接收所有的IP包*/
dwProtocol=IPPROTO_IP;/*协议类型为IP*/4.7捕获处理1.加载Winsock;2.创建一个接收原始IP包的socket连接;
3.绑定到一个接口;
4.进行WSAIoctl设置,接收所有的IP数据包。代码如下:
if<WSAIoctl<s,dwIoControlCode,&optval,sizeof<optval>,
NULL,0,&dwBytesRet,NULL,NULL>==SOCKET_ERROR>
5.接着设定一个线程进行捕获:
〔1创建一个接收IP包的链表头;
〔2设置一个标识,为真,则不断进行IP包的捕获;
〔3建立一个新的结点,将捕获的数据包加入到该结点;
〔4如果链表的长度达到指定的长度,创建一个线程对该链表的IP包进行解析;再设置一个在IP数据包链表不足给定的长度,而又中止IP捕获时,对链表的处理;
〔5为下一个IP包链表创建一个链表头。
实验截图源程序代码及分析#include"winsock2.h"#include"ws2tcpip.h"#include"iostream.h"#include"stdio.h"#include"fstream.h"#pragmacomment<lib,"ws2_32.lib">//TCP数据包解析函数intDecodeTcpPack<char*>;//UDP数据包解析函数intDecodeUdpPack<char*>;//ICMP数据包解析函数intDecodeIcmpPack<char*>;//显示数据包信息voidShowSubPackInfo<char*buf,BYTEProtocol>;/*定义IP头部数据结构*/typedefstructIP_HEADER{//union//{//BYTEVersion;//版本〔前四位//BYTEHdrLen;//报头标长〔后四位,IP头长度//};unsignedcharh_verlen;//版本和报头标长BYTEServiceType;//服务类型WORDTotalLen;//总长度WORDID;//标识union{WORDFlags;//标志WORDFragOff;//片偏移};BYTETimeToLive;//生存时间BYTEProtocol;//协议WORDHdrChksum;//首部检验和DWORDSrcAddr;//源地址DWORDDstAddr;//目的地址BYTEOptions;//选项}IP_HEADER;//定义TCP首部格式typedefstruct_TCPHeader{unsignedshortth_sport;//源端口号unsignedshortth_dport;//目的端口号unsignedintth_seq;//SEQ序号unsignedintth_ack;//ACK序号unsignedcharth_lenres;//首部长度unsignedcharth_flag;//控制位unsignedshortth_win;//窗口大小unsignedshortth_sum;//校验和unsignedshortth_urp;//紧急指针}TCPHEADER;//定义UDP首部格式typedefstruct_UDPHeader{ unsignedshortuh_sport;//16位源端口 unsignedshortuh_dport;//16位目的端口 unsignedshortuh_len;//16位长度 unsignedshortuh_sum;//16位校验和}UDPHEADER;//定义ICMP首部格式typedefstruct_ICMPHeader{ BYTEi_type;//8位类型 BYTEi_code;//8位代码 unsignedshorti_cksum;//16位校验和 unsignedshorti_id;//识别号 unsignedshorti_seq;//报文序列号 unsignedlongtimestamp;//时间戳}ICMPHEADER;//根据协议号获取协议类型char*getProtocol<BYTEProtocol>{ switch<Protocol> { case1: return"ICMP"; case2: return"IGMP"; case4: return"IPinIP"; case6: return"TCP"; case8: return"EGP"; case17: return"UDP"; case41: return"IPv6"; case46: return"RSVP"; case89: return"OSPF"; default: return"UNKNOW"; }}/*解析IP数据包*/voidipparse<FILE*file,char*buffer>{IP_HEADERip=*<IP_HEADER*>buffer;//fseek<file,0,SEEK_END>;//ShowSubPackInfo<char*buf,intiProtocol>;cout<<"生存期协议源IP地址目的IP地址总长度"<<endl;cout<<<int>ip.TimeToLive<<""<<getProtocol<ip.Protocol><<""<<inet_ntoa<*<in_addr*>&ip.SrcAddr><<">"<<inet_ntoa<*<in_addr*>&ip.DstAddr><<""<<ip.TotalLen<<endl;intiIpLen=sizeof<unsignedlong>*<ip.h_verlen&0xf>;ShowSubPackInfo<buffer+iIpLen,ip.Protocol>;cout<<"***************************************************************************"<<endl;}//显示子协议数据包信息voidShowSubPackInfo<char*buf,BYTEProtocol>{//charProtocol=getProtocol<BYTEProtocol>; switch<Protocol> { case6://TCP数据包 DecodeTcpPack<buf>; break; case17://UDP数据包 DecodeUdpPack<buf>; break; case1://ICMP数据包 DecodeIcmpPack<buf>; break; default: cout<<"unknown"<<endl; break; }}下面程序是实现解析TCP数据包函数的部分代码。参数TcpBuf是输入的TCP首部和数据段的头指针。程序流程是:首先将TcpBuf转换成TCP首部格式。然后输出TCP首部中的源端口号th_sport和目的端口号th_dport。最后采用循环与位的方法输出TCP首部中的标志位。//TCP解包函数intDecodeTcpPack<char*TcpBuf>{ TCPHEADER*pTcpHeader;// chardata[MAX_PACK_LEN];// inti; //转换成TCP首部格式 pTcpHeader=<TCPHEADER*>TcpBuf; //输出源端口和目的端口 cout<<""<<"源端口目的端口"<<endl<<""<<ntohs<pTcpHeader->th_sport><<">"<<ntohs<pTcpHeader->th_dport><<endl;returntrue;}下面程序是实现了解析UDP数据包的功能函数。参数UdpBuf表示输入的UDP数据首部和数据段。程序流程是:首先将输入参数UdpBuf转换成UDP首部格式,然后输出UDP首部格式中的源端口号uh_sport,目的端口号uh_dport和数据长度uh_len。最后和TCP解析函数一样对关键字进行查找和输出。//UDP解包函数intDecodeUdpPack<char*UdpBuf>{ UDPHEADER*pUdpHeader; //chardata[MAX_PACK_LEN]; pUdpHeader=<UDPHEADER*>UdpBuf; //输出端口 cout<<""<<"源端口目的端口"<<endl<<""<<ntohs<pUdpHeader->uh_sport><<">"<<ntohs<pUdpHeader->uh_dport><<endl;returntrue;}下面程序是实现了解析ICMP数据包的功能函数。参数IcmpBuf表示输入的ICMP首部和数据段。程序流程是:首先将输入参数IcmpBuf转换成ICMP首部格式。然后输出ICMP首部中的类型码Type。最后输出首部格式中的识别号ID和报文序列号SEQ。//ICMP解包函数intDecodeIcmpPack<char*IcmpBuf>{ ICMPHEADER*pIcmpHeader; pIcmpHeader=<ICMPHEADER*>IcmpBuf; //输出ICMP数据包类型、ID和SEQ printf<"Type:%d,%d",pIcmpHeader->i_type,pIcmpHeader->i_code>; printf<"ID=%dSEQ=%d\n",pIcmpHeader->i_id,pIcmpHeader->i_seq>; returntrue;}下面程序是实现嗅探功能的主函数部分代码。程序流程是:调用WSAStartup函数初始化Winsock库。然后调用socket函数创建原始套接字,并且调用gethostname函数和gethostname函数获得本机上IP地址,同时设置本地监听端口号为6000.最后调用bind函数将本地地址结构绑定在套接字上。然后调用WSAIoctl函数设置原始套接字接受所有的数据包,主要是将函数的第二个参数设置为SIO_RCVALL。开始无限循环调用recv函数接收Hub上所有的数据包。最后对接收到的数据包调用ipparse函数进行解析。//主程序开始main<>{ intnRetCode=0; { WSADATAwsData;/*启动2.2版本的Socket,并将Socket版本信息保存到wsDat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 旅游景区车位划线及游客引导服务合同
- 草场租赁与草原旅游观光合作协议范本
- 出租屋租赁合同(含健身房、瑜伽馆及健身器材)
- 亚洲企业南美投资合作框架协议
- 场地建设合同常见违规行为防范及监管措施
- 餐饮企业产品研发顾问服务协议
- 乡村民宿租赁合同范例大全
- 工业园区场地调研委托合同范本
- 房屋出租可转租条件审查及执行服务协议
- 肥大细胞案例分享
- 2023年广州中考政治试题及答案
- T-SCSTA001-2025《四川省好住房评价标准》
- 2025-2030全球及中国货运保险行业市场现状供需分析及市场深度研究发展前景及规划可行性分析研究报告
- 《MTP管理技能提升》课件
- 《探索微生物世界的奥秘》课件
- 隔离防护培训课件
- 《机械基础》课件 学习情境三 平面汇交力系
- 掘进工作面质量标准化细化标准实施方案
- 2025年春统编版初中道德与法治八年级下册(全册)教学设计及反思(附教材目录P210)
- 隐形股份合同协议
- 《自然选择的证明》 统编版高二语文选择性必修下册
评论
0/150
提交评论