您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 课程设计报告-发现网络中的活动主机
重庆交通大学信息科学与工程学院课程设计实验报告专业:12级通信工程(2)班学号:姓名:实验所属课程:通信网综合课程设计指导教师:谭晋一、程设计的目的和意义在网络管理中,经常要确定当前网络中处于活动状态的主机,这时可以通过使用ICMP协议的回送请求(Ping请求)和回送响应(Ping应答)消息来完成本工作。本课程设计的目的是编制程序,利用ICMP数据包,发现制定网段中的活动主机。IP协议的优点是简洁,但缺少差错控制和查询机制,而网际控制报文协议(ICMP)具有补充IP功能的作用。在网络管理中,常常要确定当前网络中处于活动状态的主机,这时可以通过使用ICMP的回送和回送响应消息来完成这项工作。本课程设计的目的就是编制程序,利用ICMP数据包,发现指定网段中的活动主机。通过课程设计,使学生更加熟悉ICMP报文的结构,对ICMP协议有更好的理解和认识。二、课程设计条件计算机,Matlab、C/C++或JAVA编程软件或者其他通信网仿真软件(如NS2、OMNET++等)、嵌入式开发板、编程器等。三、程设计的内容和要求本程序的功能是发送ICMP数据包,以获取指定网段中的活动主机,并将结果显示到屏幕上。程序的要求1)不允许在程序中直接调用Ping,而是用程序实现Ping的功能。2)以命令形式运行:程序名Start_ipEnd_ip,其中,Start_IP为起始IP地址;End_IP为结束IP地址。3)输出格式为:活动主机1的IP地址活动主机2的IP地址……四、课程设计的相关技术IP协议是一种不可靠的协议,无法进行差错控制。但IP协议可以借助其他协议来实现这一功能,如ICMP。ICMP(InternetControlMessagesProtocol,网间控制报文协议)允许主机或路由器报告差错情况和提供有关异常情况的报告。一般来说,ICMP报文提供针对网络层的错误诊断、拥塞控制、路径控制和查询服务四项大的功能。如,当一个分组无法到达目的站点或TTL超时后,路由器就会丢弃此分组,并向源站点返回一个目的站点不可到达的ICMP报文。编制程序前首先要对ICMP报文的格式有一定的了解,ICMP报文是在IP数据报内部传输的,其结构如图10-1所示。IP数据报IP首部ICMP报文图10-1ICMP封装在IP内部078151631(位)类型字段代码字段校验和字段(不同类型和代码有不同内容)图10-2ICMP报文ICMP报文的格式如图10-2所示。所有报文的前4个字节都是一样的,但是其它字节则互不相同。其中类型字段可以有15个不同的值,以描述特定类型的ICMP报文,某些ICMP报文还使用代码字段的值来进一步描述不用的条件。按验和字段为2字节,校验的范围是整个ICMP报文。检验和是必须的,其计算方法与IP协议头部校验和的计算方法一样。各种类型的ICMP报文如图10-3所示(ICMP报文类型),不同类型由报文中的类型字段和代码字段来共同决定。类型代码描述00回送响应(PING应答)3目的不可达0网络不可达1主机不可达2协议不可达3端口不可达4需要进行分片但设置了禁止分片比特5源主机选择路由失败6无法识别目的网络7无法识别目的主机8源主机被隔离9目的网络被禁止10目的主机被禁止11由于服务类型(TOS),网络不可达12由于服务类型(TOS),主机不可达13由于过滤,通信被强行禁止14主机越权15优先权终止生效40源端被关闭(基本流控制)5重定向0对网络重定向1对主机重定向2对服务类型和网络重定向3对服务类型和主机重定向80回送请求(PING请求)90路由器通告100路由器请求11超时0传输期间生存期减为01数据报组装期间生存期减为012参数问题0各种IP头部错误1缺少必须的选项130时间戳请求140时间戳应答150信息请求(已作废)160信息应答(已作废)170地址掩码请求180地址掩码应答10-3ICMP报文类型本课程设计的目的是发现网络中的活动主机,就是使用ICMP的回送和回送响应消息发现网络中的活动主机,即Ping消息的请求和应答。那幺,发送的ICMP的数据包类型设置为回送请求(类型号为8)。五、课程设计过程本程序使用原始套接字(SOCK_RAW)生成ICMP报文来进行活动主机的探查,这个程序使用的是回送请求与应答信息。程序的大致思想:把ICMP的数据包类型设置为回送请求(Ping请求,类型号为8),将它发送给网络上的一个IP地址,如果这个IP地址已经被占用,那么使用该IP地址的主机的,从而返回一个ICMP回送响应(类型号为0)的信息。信息封装在一个IP包中,需要解析该IP包,找到ICMP数据信息(类型为0,表示为对方的应答,证明对方IP地址是活动的),如果这个IP地址没有人使用,则发送的ICMP回送请求(Ping请求)在设定的延时时间内不可能得到响应。初始化原始套接字后(SOCK_RAW)后,本程序就开始在一个IP网段内寻找活动主机,由于要寻找的主机较多,可以采用多线程技术4.1、分析ICMP协议类型和程序实现方法创建ICMP数据报的内容格式,把ICMP的数据包类型设置为回送请求(Ping请求,类型号为8)。具体实现代码如下://IP报头的数据结构typedefstructiphdr{unsignedintheadlen:4;//IP头长度unsignedintversion:4;//IP版本号unsignedchartos;//服务类型unsignedshorttotallen;//IP包总长度unsignedshortid;;//ID号unsignedshortflag;//标记unsignedcharttl;//生存时间unsignedcharprot;//协议(UDPTCP)unsignedshortchecksum;//校验和unsignedintsourceIP;//源IPunsignedintdestIP;//目的IP}IpHeader;//ICMP头部的数据结构typedefstructicmphdr{BYTEtype;//ICMP类型码,回送请求的类型码为8BYTEcode;//子类型码,保存与特定ICMP报文类型相关细节信息USHORTchecksum;//校验和USHORTid;//ICMP报文ID号(一般用进程号作ID)USHORTseg;//ICMP数据报的序列号}IcmpHeader;WSAStartup函数本函数必须是应用程序或DLL调用的第一个WindowsSockets函数.它允许应用程序或DLL指明WindowsSocketsAPI的版本号及获得特定WindowsSockets实现的细节.应用程序或DLL只能在一次成功的WSAStartup()调用之后才能调用进一步的WindowsSocketsAPI函数。具体应用:MAKEWORD函数本函数用于进行对Socket版本的指定和协商,具体应用实例如下:4.2、实例化ICMP数据报格式并创建Socket套接字程序使用原始套接字(SOCK_RAW)生成ICMP报文来进行活动主机的探查,这个程序使用的是回送请求与应答信息。具体实现代码如下:#defineICMP_RCHO8//请求回送#defineDEF_PACKET_SIZE32//缺省数据报长度#defineMAX_PACKET1024//最大数据块长度#defineICMP_MIN8//ICMP报文头长度(最小ICMP报文长度)#defineICMP_RCHO_REPLY0#defineSTATUS_FAILED0xFFFF#defineMAX_PING_PACKET_SIZE(MAX_PACKET+sizeof(IpHeader))voidfill_icmp_data(char*,int);USHORTchecksum(USHORT*,int);voiddecode_resp(char*,int,structsockaddr_in*);DWORDWINAPIFindIP(LPVOIDpIPAddrTemp);WSADATAwsaData;SOCKETsockRaw;//为了实现发送/监听ICMP报文,必须使用原始套接字,创建原始套接字structsockaddr_indest,from,end;intfromlen=sizeof(from);//from是一个sockaddr_in数据结构,用于保存响应的目的的主机的地址char*recvbuf=newchar[MAX_PING_PACKET_SIZE];//保证大与发送包的大小4.3、创建多个线程线程是进程内部的一个执行单元。系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启动点提供给Windows系统。主执行线程终止了,进程也就随之终止。由于要寻找的主机较多,可以采用多线程技术(多线程的函数为:CreateThread())。具体实现代码如下:intfromlen=sizeof(from);//from是一个sockaddr_in数据结构,用于保存响应的目的的主机的地址char*recvbuf=newchar[MAX_PING_PACKET_SIZE];//保证大与发送包的大小unsignedintaddr=0;longThreadNumCounter=0,ThreadNumLimit=20;long*aa=&ThreadNumCounter;voidmain(intargc,char*argv[]){if(WSAStartup(MAKEWORD(2,1),&wsaData)!=0){coutWASStartupfailedGetLastError()endl;ExitProcess(STATUS_FAILED);}sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED;4.4、解析数据包如果所Ping的目的主机所在,那么它会发送一个回送应答包。这是一个IP包,收到后解析此数据包并获取其中的ICMP信息。根据IP报头信息中的IP报头长度字段,就可以得到ICMP报文的真实地址。ICMP数据包中的IP地址就是活动主机的IP。代码如下:#defineICMP_MIN8//ICMP报文头长度(最小ICMP报文长度)#defineMAX_PING_PACKET_SIZE(MAX_PACKET+SIZEOF(IPHeader))char*recvbuf=newchar[MAX_PING_PACKET_SIZE];//保证大与发送包的大小//from是一个sockaddr_in数据结构,用于保存响应的目的的主机的地址structsockaddr_infrom;intfromlen=sizeof(from);intbytes=recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(strucksockaddr*)&from),&fromlen);IpHeader*iphdr;IcmpHeader*icmphdr;unsignedshortiphdrlen;iphdr=(Ipheader*)buf;iphdrlen=iphdr-headlen*4;//IP报头的长度icmphdr=(Icmpheader*)(buf+iphdrlen);//跳过IP报头//数据包太短,丢弃if(bytesiphdrlen+ICMP_MIN)return;//不是回送响应(Ping应答),丢弃if(icmphdr-type!=ICMP_ECHO_REPLY)return;//Id号不相符,丢弃if(icmphdr-id!=(USHOT)GetCurrentThreadId())return;//输出正在使用的IP地址。Cout”活动主机:”inet_ntoa(from-sin_addr)endl;4.5、程序流程图一个用多线程实现的程序在课程设计过程的第三部分中给出
本文标题:课程设计报告-发现网络中的活动主机
链接地址:https://www.777doc.com/doc-2032410 .html