天津师范大学TianjinUniversityofEducation网络课程设计所在学院:信息技术工程学院专业:计算机科学与技术学号:学生姓名:指导教师:二〇一三年六月信息技术工程学院网络课程设计使用ICMP发现局域网内活动主机学生姓名:肖磊指导教师:黄彦副教授2013年6月摘要本程序使用原始套接字生成ICMP报文来进行活动主机的探查。这个程序使用的是回送请求与应答消息。程序的大致思想是把ICMP的数据包类型设置为回送请求,将它发送给网络上的一个IP地址,如果这个IP地址已经被占用的话,那幺使用位于这个IP地址的主机上的TCP/IP软件就能够接收到这个ICMP回送请求,从而返回一个ICMP回送响应(类型号为0)信息。信息封装在一个IP包中,我们需要解析该IP包,从中找到ICMP数据信息。相反,如果这个IP地址没有人使用,那幺发送的ICMP回送请求在设定的延时内就不可能得到响应。在初始化原始套接字之后,本程序就要开始在一个IP网段内寻找活动主机。因为要寻找的主机可能很多,为节省时间可以采用多线程编程。关键词:ICMP协议,Visualc++6.0目录引言....................................................................................................................................11课程设计相关技术...........................................................................................................21.1ICMP报文格式及类型...........................................................................................21.2实验平台介绍..........................................................................................................42.1使用原始套接字.....................................................................................................42.2定义IP头部和ICMP头部的数据结构................................................................52.3填充并发送回送请求类型的ICMP报文.............................................................62.4程序流程图..............................................................................................................8结论.....................................................................................................................................10参考文献.............................................................................................................................11致谢.....................................................................................................................................12信息技术工程学院网络课程设计1引言IP协议的优点是简洁,但缺少差错控制和查询机制,而网际控制报文协议(ICMP)具有补充IP功能的作用。在网络管理中,常常要确定当前网络中处于活动状态的主机,这时可以通过使用ICMP的回送和回送响应消息来完成这项工作。本课程设计的目的就是编制程序,利用ICMP数据包,发现指定网段中的活动主机。通过课程设计,更加熟悉ICMP报文的结构,对ICMP协议有更好的理解和认识。。信息技术工程学院网络课程设计21课程设计相关技术1.1ICMP报文格式及类型编制程序前首先要对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应答)信息技术工程学院网络课程设计33目的不可达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的回送和回送响应信息技术工程学院网络课程设计4消息发现网络中的活动主机,即Ping消息的请求和应答。那幺,发送的ICMP的数据包类型设置为回送请求(类型号为8)。1.2实验平台介绍VisualC++6.0,简称VC或者VC6.0,是微软推出的一款C++编译器,将“高级语言”翻译为“机器语言(低级语言)”的程序。VisualC++是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出VisualC++1.0后,随着其新版本的不断问世,VisualC++已成为专业程序员进行软件开发的首选工具。VisualC++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导ClassWizard等开发工具。这些组件通过一个名为DeveloperStudio的组件集成为和谐的开发环境。2课程设计过程2.1使用原始套接字为了实现发送/监听ICMP报文,必须使用原始套接字,创建原始套接字的代码如下:socketsockRaw;sockRaw=WSAocket(AF_INET,sock_Raw,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);在WSASocket函数中,我们使用IPPROTO_ICMP表示接收ICMP数据包,为了使用发送超时设置(设置SO_RCVTIMEO或SO_SNDTIMEO),必须将标志位置为WSA_FLAG_OVERLAPPED。然后调用setsockopt函数设置读取延迟。Inttimeout=1000;setsockopt(sockRaw,SQL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout);setsockopt(sockRaw,SQL_socket,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout);在setsockopt函数中,sockRaw是之前创建的原始套接字,设置SQL_SOCKET表明使用基本套接字处理ICMP报文。设置SO_RCVTIMEO表示使用接收超时设置,信息技术工程学院网络课程设计5SO_SNDTIMEO表示使用发送超时设置,在这里,超时时间均设置为1000ms。2.2定义IP头部和ICMP头部的数据结构由于socket发送/捕获的是IP包,因此要分别定义IP头部的数据结构ICMP头部数据结构。//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)USHORTseq;//ICMP数据报的序列号}IcmpHeader;信息技术工程学院网络课程设计62.3填充并发送回送请求类型的ICMP报文为了使收到数据包的目的主机发送响应,我们需要向目的主机发送回送请求类型的ICMP报文。从图10-3中可知,回送请求的类型号为8。因此ICMP报文的填充代码如下:#defineICNP_ECHO8//请求回送#defineDEF_PACKET_SIZE32//缺省数据报长度#defineMAX_PACKET1024//最大数据块长度charicmp_data[MAX_PACKET];//ICMP数据报最大可能的长度memset(icmp_data,0,MAX_PACKET);//将数据报清空初始化intdatasize=DEF_PACKET_SIZE;//ICMP数据报报文体的缺省长度datasize+=sizeof(IcmpHeader);//再加上ICMP头部的长度IcmpHeader*icmp_hdr:Char*datapart;icmp_hdr=(IcmpHeader*)icmp_data;icmp_hdr-type=ICMP_ECHO;//设置类型icmp_hdr-id=(USHORT)GetCurrentThreadId();//设置其ID号为当前线程号Datapart=icmp_data+sizeof(IcmpHeader);//计算出数据报的数据部分Memset(datapart,A,datasize-sizeof(IcmpHeader));//填入数据((IcmpHeader*)icmp_data)-seq=0;//序列号为0((IcmpHeader*)icmp_data)-