




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机网络课程设计网络嗅探器的设计与实现 学院: 信息科学与工程学院 专业班级: 指导老师: 张士庚 学号: 姓名: 目录一、实验要求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.5 IP包的解析164.6 协议的定义164.7捕获处理16五、实验截图17六、源程序代码及分析17七、总结24八、课程设计参考资料25一、 实验要求网络嗅探器的设计与实现: 基本要求捕获
2、本网段的数据包,将报文结构显示出来.进一步要求进行数据包协议分析,可以按报头进行统计,提取部分关键信息,如捕获登陆信息,破解登陆密码等.二、 实验目的了解和掌握捕获网络中ip包的方法,了解ip、tcp、udp等包的结构。可用winsock或winpcap来完成嗅探器的设计。 本次实验用socket(套接字)在vc 6.0上进行编程。三、 相关知识3.1、IP包格式:互联网络层是TCP/IP协议参考模型中的关键部分.IP协议把传输层送来的消息组装成IP数据包,并把IP数据包传送给数据链层.IP协议在TCP/IP协议族中处于核心地位,IP协议制定了统一的IP数据包格式,以消除个通信子网中的差异,从
3、而为信息发送方和接收方提供了透明的传输通道.编制本程序前,首先要对IP包的格式有一定了解,图1给出了IP协议的数据包格式.IP数据包的第一个字段是版本字段,其度是4位,表示所使用的IP协议的版本.目前的版本是IPV4,版本字段的值是4,下一代版本是IPV6,版本字段值是6.本程序主要针对版本是IPV4的数据包的解析.报头标长字段为4位,它定义了以4B为一个单位的IP包的报文长度.报头中除了选项字段和填充域字段外,其他各字段是定长的.因此,IP数据包的头长度在2040B之间,是可变的.0 4 8 16 19 24 31版本首部长度区分服务总长度标识标志片偏移生存时间协议头校验和源IP地址目的地址
4、选项填充域数据部分图1 IP数据包的格式服务类型字段共8位,用于指示路由器如何处理该数据包.该字段长度由4位服务类型(TOS)子域和3位优先级子域组成,1位为保留位,该字段结构如图2所示. B7 b6 b5 b4 b3 b2 b1 b0优先级DTRC0图2 服务类型字段结构优先级共有8种,优先级越高表明数据包越重要.表1中列出了各种优先级所代表的意义.表一 优先子域的说明位数(b7b6b5) 意义111 网络控制110 网络间控制101 重要(CRITIC/ECP)100 即时,优先011 即时010 立刻001 优先000 普通在4位服务类型子域中b4,b3,b2,b1分别表示D(延迟),T
5、(吞吐量),R(可靠性)与C(成本).表2列出了服务器类型自域的构成.位数( b4b3b2b1)意义 1111 安全级最高 1000 延迟最小 0100 吞吐量最大 0001 金钱成本最小 0000 普通服务总长度字段为2B,它定义了以字节为单位的数据包的总长度.IP数据包的最大长度为65535B.标识字段的长度为16位,用于识别IP数据包的编号.每批数据都要有一个标识值,用于让目的主机判断新来的数据属于哪个分组.报头中的标志字段如图7-3所示.标志字段共3位,最高位是0.禁止分片标志DF(do not fragment)字段的值若为1,表示不能对数据包分片;若DF值为0,则表明可以分片.分片
6、标志MF(more fragment)的值为1,表示接收到的不是最后一个分片;若MF值为0,表示接收到的是最后一个分片.片偏移字段共13位,说明分片在整个数据包中的相对位置.片偏移值是以8B为单位来记数的,因此选择的分片长度应该是8B的整数倍.生存时间(TTL)字段为8位,用来设置数据包在互联网络的传输过程的寿命,通常是用一个数据包可以经过的最多的路由器跳步数来限定的.协议字段为8位,表示使用此IP数据包的高层协议类型,常用的协议号如表3所示.序号协议名称序号协议名称12468ICMPIGMPIP inIPTCPEGP17414689UDPIPV6RSVPOSPFA表3 典型的协议号头校验和字
7、段为16位,用于存放检查报头错误的校验码。检验的范围是整个IP包的报头。校验和按如下方法计算:1)将头校验和的字段置为0。2)将报头部分的所有数据以16位为单位进行累加,累加方式是求异或。3)将累加的结果取反码,就是头校验和。 当收到一个IP包时,要检查报头是否出错,就把报头中的所有数据以16位为单位进行累加,若累加的结果为0,则报文没有出错。 地址字段包括源地址和目的地址。源地址和目的地址的长度都是32位,分别表示发送数据包的源主机和目的主机的IP地址。 选项字段的长度范围为040B,主要用于控制和测试。在使用选项字段的过程中,有可能出现报头部分的长度不是32位的整数倍的情况。如果出现这种情
8、况,就需要通过填充位来凑齐。3.2、TCP包格式TCP (Transport Control Protocol)传输控制协议:TCP数据包的分组格式:源端口:标识源端应用进程。目的端口:标识目的端应用进程。序号:在SYN标志未置位时,该字段指示了用户数据区中第一个字节的序号;在SYN标志置位时,该字段指示的是初始发送的序列号。确认号:用来确认本端TCP实体已经接收到的数据,其值表示期待对端发送的下一个字节的序号,实际上告诉对方,在这个序号减1以前的字节已正确接收。数据偏移:表示以32位字为单位的TCP分组头的总长度,用于确定用户数据区的起始位置。URG:紧急指针字段有效。ACK:确认好有效。P
9、SH:Push操作。TCP分组长度不定,为提高传输速率,往往要收集到足够的数据后才发送。这种方式不适合实时性要求很高的应用,因此,TCP提供“Push”操作,以强迫传输当前的数据,不必等待缓冲区满才传输。RST:连接复位,重新连接。SYN:同步序号,该比特置位表示连接建立分组。FIN:字符串发送完毕,没有其它数据需要发送,该比特置位表示连接确认分组。窗口:单位是字节,指明该分组的发送端愿意接收的从确认字段中的值开始的字节数量。校验和:对TCP分组的头部和数据进行校验。紧急指针:指出窗口中紧急数据的位置(从分组序号开始的正向位移,指向紧急数据的最后一个字节),这些紧急数据应优先于其它的数据进行传
10、输。任选项:用于处理一些特殊情况。目前被正式使用的选项字段可用于定义通信过程中的最大分组长度,只能在连接建立时使用。填充:用于保证任选项为32bit的整数倍。 TCP三次握手机制:第一次握手:客户端发送一个SYN(包含有同步序列号的标志位的数据段和通信请求)给服务器,然后等待服务器的回发确认信息第二次握手:服务器发送一个SYN-ACK给客户端,确认已经收到客户端发来的信息第三次握手:客户端接收到服务器发来的确认信息后,再回馈一个ACK给服务器,此时就可与服务器建立可靠的连接 ACK:TCP数据包首部中的确认标志,对已接收到的TCP报文进行确认。SY
11、N:SYN是TCP/IP建立连接时使用的握手信号。 3.3、UDP数据包UDP(User Datagram Protocol)用户数据报协议:UDP首部字段由4个部分组成,其中两个是可选的。各16bit的来源端口和目的端口用来标记发送和接受的应用进程。因为UDP不需要应答,所以来源端口是可选的,如果来源端口不用,那么置为零。在目的端口后面是长度固定的以字节为单位的长度域,用来指定UDP数据报包括数据部分的长度,长度最小值为8byte。首部剩下地16bit是用来对首部和数据部分一起做校验和(Checksum)的,这部分是可选的,但在实际应用中一般都使用这一功能。
12、UDP数据报格式有首部和数据两个部分。首部很简单,共8字节。包括: 源端口(Source Port):2字节,源端口号。 目的端口(Destination Port ):2字节,目的端口号。 长度(Length):2字节,UDP用户数据报的总长度,以字节为单位。 检验和(Checksum):2字节,用于校验UDP数据报的数字段和包含UDP数据报首部的“伪首部”。其校验方法同IP分组首部中的首部校验和。与TCP包的不同之处: 无需三次握手四次断开,传输速度相对于TCP极快,不确定性,甚至可以不需要应答,没有TCP数据包的安全性,有丢包现象。3.4、IP、TCP、
13、 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数据段中都包含源端口
14、和目标端口字段。有时,我们把一个IP地址和一个端口号合称为一个套接字(Socket),而一个套接字对(Socket pair)可以唯一地确定互连网络中每个TCP连接的双方(客户IP地址、客户端口号、服务器IP地址、服务器端口号)。 常见协议和对应的端口号需要注意的是,不同的应用层协议可能基于不同的传输层协议,如FTP、TELNET、SMTP协议基于可靠的TCP协议。TFTP、SNMP、RIP基于不可靠的UDP协议。同时,有些应用层协议占用了两个不同的端口号,如FTP的20、21端口,SNMP的161、162端口。这些应用层协议在不同的端口提供不同的功能。如FTP的21端口用来侦听用户的连接请求
15、,而20端口用来传送用户的文件数据。再如,SNMP的161端口用于SNMP管理进程获取SNMP代理的数据,而162端口用于SNMP代理主动向SNMP管理进程发送数据。还有一些协议使用了传输层的不同协议提供的服务。如DNS协议同时使用了TCP 53端口和UDP 53端口。DNS协议在UDP的53端口提供域名解析服务,在TCP的53端口提供DNS区域文件传输服务。四、 课程设计分析4.1 网卡设置 为了获取网络中的IP数据包,必须对网卡进行编程,在这里使用套接字(socket)进行编程。但是,在通常情况下,网络通信的套接字程序只能响应与自己硬件地址相匹配的数据包或是以广播形式发出的数据包。对于其他
16、形式的数据包,如已到达网络接口,但却不是发送到此地址的数据包,网络接口在骓投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的数据包。我们要想获取网络设备的所有数据包,就是需要将网卡设置为混杂模式。4.2 使用套接字 套接字分为三种,即流套接字(Stream socket)、数据报套接字(Datagram Socket)和原始套接字(Raw Socket)。要进行IP层数据包的接收和发送,应使用原始套接字。创建原始套接字的代码如下: Socket sock; sock = soc
17、ket(AF_INET,SOCK_RAW,IPPROTO_IP);本设计不用考虑超时情况。创建套接后,IP头就会包含在接收数据包中。然后,我可以设置IP头操作选项,调用setsockopt函数。其中flag设置为true,并设定IP-HDRINCL选项,表明用户可以亲自对IP头进行处理。最后使用bind()函数将socket绑定到本地网卡上。绑定网卡后,需用WSAIoctl()函数把网卡设置为混杂模式,使网卡能够接收所有的网络数据。如果接收的数据包中的协议类型和定义的原始套接字匹配,那么接收的数据就拷贝到套接字中,因此,网卡就可以接收所有经过的IP包。4.3 接收数据包 在程序中可使用recv
18、()函数接收经过的IP包。该函数有四个参数,第一个参数接收操作所用的套接字描述符;第二个参数接收缓冲区的地址;第三个参数接收缓冲区的大小,也就是所要接收的字节数;第四个参数是一个附加标志,如果对所发送的数据没特殊要求,直接设为0。因为IP数据包的最大长度是65535B,因此缓冲区的大小不能小于65535B。设置缓冲区后,可利用循环来反复监听接收IP包,用recv()函数实现接收功能。4.4 定义IP头部的数据结构程序需要定义一个数据结构表示IP头部。其代码如下:/* 定义IP头部数据结构 */typedef struct _IP_HEADERunionBYTE Version; /版本(前4位
19、)BYTE HdrLen; /报头标长(后四位),IP头长度;BYTE ServiceType; /服务类型WORD TotalLen; /总长度WORD ID; /标识unionWORD Flags;WORD FragOff;BYTE TimeToLive;BYTE Protocol;WORD HdrChksum;DWORD SrcAddr;DWORD DstAddr;BYTE Options;IP_HEADER;4.5 IP包的解析 解析IP包的字段有两种策略。针对长度为8位、16位和32位的字段(或子字段)时,可以利用IP-HEADER的成员直接获取。要解析长度不是8位倍数的字段(或子字
20、段)时,可以利用C语言中的移位以人、及与、或操作完成。4.6 协议的定义(包含相应的头文件#include #include): DWORD dwIoControlCode=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,
21、 0, &dwBytesRet, NULL, NULL) = SOCKET_ERROR)5.接着设定一个线程进行捕获:(1)创建一个接收IP包的链表头;(2)设置一个标识,为真,则不断进行IP包的捕获;(3)建立一个新的结点,将捕获的数据包加入到该结点;(4)如果链表的长度达到指定的长度,创建一个线程对该链表的IP包进行解析;再设置一个在IP数据包链表不足给定的长度,而又中止IP捕获时,对链表的处理;(5)为下一个IP包链表创建一个链表头。五、 实验截图六、 源程序代码及分析#include "winsock2.h"#include "ws2tcpip.h
22、"#include"iostream.h"#include "stdio.h"#include"fstream.h"#pragma comment(lib,"ws2_32.lib")/ TCP数据包解析函数int DecodeTcpPack(char *);/ UDP数据包解析函数int DecodeUdpPack(char *);/ ICMP数据包解析函数int DecodeIcmpPack(char *);/ 显示数据包信息void ShowSubPackInfo(char *buf, BYTE Pr
23、otocol);/*定义IP头部数据结构*/typedef struct IP_HEADER /union / / BYTE Version; /版本(前四位) / BYTE HdrLen; /报头标长(后四位),IP头长度 / ; unsigned char h_verlen; / 版本和报头标长 BYTE ServiceType; /服务类型 WORD TotalLen; /总长度 WORD ID; /标识 union WORD Flags; /标志 WORD FragOff; /片偏移 ; BYTE TimeToLive; /生存时间 BYTE Protocol; /协议 WORD Hd
24、rChksum; /首部检验和 DWORD SrcAddr; /源地址 DWORD DstAddr; /目的地址 BYTE Options; /选项 IP_HEADER;/ 定义TCP首部格式typedef struct _TCPHeader unsigned short th_sport; / 源端口号 unsigned short th_dport; / 目的端口号 unsigned int th_seq; / SEQ序号 unsigned int th_ack; / ACK序号 unsigned char th_lenres; / 首部长度 unsigned char th_flag;
25、/ 控制位 unsigned short th_win; / 窗口大小 unsigned short th_sum; / 校验和 unsigned short th_urp; / 紧急指针 TCPHEADER;/ 定义UDP首部格式typedef struct _UDPHeaderunsigned short uh_sport; / 16位源端口unsigned short uh_dport; / 16位目的端口unsigned short uh_len; / 16位长度unsigned short uh_sum; / 16位校验和UDPHEADER;/ 定义ICMP首部格式typedef s
26、truct _ICMPHeaderBYTE i_type; / 8位类型BYTE i_code; / 8位代码unsigned short i_cksum; / 16位校验和unsigned short i_id; / 识别号unsigned short i_seq; / 报文序列号unsigned long timestamp; / 时间戳ICMPHEADER;/根据协议号获取协议类型char * getProtocol(BYTE Protocol) switch(Protocol) case 1:return "ICMP" case 2:return "IGM
27、P"case 4: return "IP in IP"case 6:return "TCP"case 8:return "EGP"case 17:return "UDP" case 41:return "IPv6"case 46:return "RSVP"case 89:return "OSPF"default:return "UNKNOW"/* 解析IP数据包 */void ipparse(FILE* file,char*
28、buffer) IP_HEADER ip=*(IP_HEADER*)buffer; /fseek(file,0,SEEK_END); /ShowSubPackInfo(char *buf, int iProtocol); cout<<"生存期 协议 源IP地址 目的IP地址 总长度 "<<endl; cout<<(int)ip.TimeToLive<<" "<<getProtocol(ip.Protocol)<<" "<<inet_ntoa(*(in_
29、addr*)&ip.SrcAddr)<<"->"<<inet_ntoa(*(in_addr*)&ip.DstAddr)<<" "<<ip.TotalLen<<endl; int iIpLen = sizeof(unsigned long)*(ip.h_verlen & 0xf); ShowSubPackInfo(buffer+iIpLen, ip.Protocol); cout<<"*"<<endl; / 显示子协议数据包
30、信息void ShowSubPackInfo(char *buf, BYTE Protocol) /char Protocol=getProtocol(BYTE Protocol);switch(Protocol)case 6: / TCP数据包DecodeTcpPack(buf);break;case 17: / UDP数据包DecodeUdpPack(buf);break;case 1: / ICMP数据包DecodeIcmpPack(buf);break;default:cout<<"unknown"<<endl;break; 下面程序是实现解
31、析TCP数据包函数的部分代码。参数TcpBuf是输入的TCP首部和数据段的头指针。程序流程是:首先将TcpBuf转换成TCP首部格式。然后输出TCP首部中的源端口号th_sport和目的端口号th_dport。最后采用循环与位的方法输出TCP首部中的标志位。/ TCP解包函数int DecodeTcpPack(char *TcpBuf)TCPHEADER *pTcpHeader;/char dataMAX_PACK_LEN;/int i;/ 转换成TCP首部格式pTcpHeader = (TCPHEADER*)TcpBuf;/ 输出源端口和目的端口cout<<" &quo
32、t;<<" 源端口 目的端口"<<endl<<" "<<ntohs(pTcpHeader->th_sport)<<"->"<<ntohs(pTcpHeader->th_dport)<<endl; return true;下面程序是实现了解析UDP数据包的功能函数。参数UdpBuf表示输入的UDP数据首部和数据段。程序流程是:首先将输入参数UdpBuf 转换成UDP首部格式,然后输出UDP首部格式中的源端口号uh_sport,目的端口号
33、uh_dport 和数据长度uh_len。最后和TCP解析函数一样对关键字进行查找和输出。/ UDP 解包函数int DecodeUdpPack(char *UdpBuf)UDPHEADER *pUdpHeader;/char dataMAX_PACK_LEN;pUdpHeader = (UDPHEADER *)UdpBuf;/ 输出端口cout<<" "<<" 源端口 目的端口"<<endl<<" "<<ntohs(pUdpHeader->uh_sport)<&
34、lt;"->"<<ntohs(pUdpHeader->uh_dport)<<endl; return true;下面程序是实现了解析ICMP数据包的功能函数。参数IcmpBuf 表示输入的ICMP首部和数据段。程序流程是:首先将输入参数IcmpBuf 转换成ICMP首部格式。然后输出ICMP首部中的类型码Type。最后输出首部格式中的识别号ID和报文序列号SEQ。/ ICMP 解包函数int DecodeIcmpPack(char *IcmpBuf)ICMPHEADER *pIcmpHeader;pIcmpHeader = (ICMPHE
35、ADER *)IcmpBuf;/ 输出ICMP数据包类型、ID和SEQprintf(" Type : %d,%d",pIcmpHeader->i_type,pIcmpHeader->i_code);printf(" ID = %d SEQ = %dn",pIcmpHeader->i_id,pIcmpHeader->i_seq);return true;下面程序是实现嗅探功能的主函数部分代码。程序流程是:调用WSAStartup函数初始化Winsock库。然后调用socket函数创建原始套接字,并且调用gethostname函数和g
36、ethostname函数获得本机上IP地址,同时设置本地监听端口号为6000. 最后调用bind函数将本地地址结构绑定在套接字上。然后调用WSAIoctl函数设置原始套接字接受所有的数据包,主要是将函数的第二个参数设置为SIO_RCVALL。开始无限循环调用recv函数接收Hub上所有的数据包。最后对接收到的数据包调用ipparse函数进行解析。/主程序开始main()int nRetCode = 0;WSADATA wsData;/* 启动2.2版本的Socket,并将Socket版本信息保存到wsData中 */WSAStartup(MAKEWORD(2,2),&wsData); /初始化winsock,动态链接库SOCKET sock;/* 创建原始套接字 */sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);BOOL flag=TRUE;/* 设置IP头操作选项 */setsockopt(sock,IPPROTO_IP
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 数字智慧方案某体育馆智能化系统设计方案
- 2024年导航仪器及装置项目投资申请报告代可行性研究报告
- 2024年防腐导静电材料项目资金需求报告代可行性研究报告
- 供电防护员练习试题(二)
- 2023年高考全国甲卷数学(文)真题
- 职业资格-房地产经纪综合能力真题库-8
- 中西医实操考试试题及答案
- 传感器试题及答案
- 英语口语考试试题及答案
- 单位职业测试题及答案
- 《电力建设工程施工安全管理导则》(nbt10096-2018)
- 垃圾场应急预案
- 医院医疗服务收费自查自纠制度
- 低压电缆破损修补方案
- 供水公司的组织结构优化与管理流程重构
- 采购流程案例
- 教研员考试题及答案
- 物业客服管家晋升述职报告
- “艾梅乙”感染者消除医疗歧视制度-
- 裹包青贮采购合同
- 患者画像与精准营销-深度研究
评论
0/150
提交评论