课程设计活动主机扫描.docx
- 文档编号:28327426
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:14
- 大小:96.06KB
课程设计活动主机扫描.docx
《课程设计活动主机扫描.docx》由会员分享,可在线阅读,更多相关《课程设计活动主机扫描.docx(14页珍藏版)》请在冰豆网上搜索。
课程设计活动主机扫描
课程设计(Ⅰ)报告
(2011/2012学年第二学期)
题目:
活动主机的检测
专业计算机科学与技术
学生姓名
班级学号
指导教师
指导单位计算机学院
计算机系统与网络教学中心
日期2012.06.11-2012.06.22
指导教师成绩评定表
学生姓名
班级学号
专业
计算机科学与技术
评分内容
评分标准
优秀
良好
中等
差
平时成绩
认真对待课程设计,遵守实验室规定,上机不迟到早退,不做和设计无关的事
设计成果
设计的科学、合理性
功能丰富、符合题目要求
界面友好、外观漂亮、大方
程序功能执行的正确性
程序算法执行的效能
设计报告
设计报告正确合理、反映系统设计流程
文档内容详实程度
文档格式规范、排版美观
验收答辩
简练、准确阐述设计内容,能准确有条理回答各种问题,系统演示顺利。
评分等级
指导教师
简短评语
指导教师签名
日期
2012.06.23
备注
评分等级有五种:
优秀、良好、中等、及格、不及格
题目一:
活动主机的检测
一、课题内容和要求
1. 设计内容 :
根据协议规定的ICMP数据包的标准格式,编写程序向指定网段中的目的主机发送ICMP数据包,并对目的主机返回的数据包进行解析,以发现那些处于活动状态的主机。
2. 设计要求
(1)将目的主机的状态显示在屏幕上,具体格式:
开始主机扫描
活动主机:
xx.xx.xx.xx
活动主机:
xx.xx.xx.xx
…
(2)要求有良好的编程规范和注释,编程所使用的操作系统、语言和编译环境不限,但是需在课程设计报告文档中予以说明。
二、需求分析
2.1使用原始套接字,实现发送/监听ICMP报文
2.2由于socket发送/捕获的是IP包,因此要分别定义IP头部的数据结构和ICMP头部的数据结构。
IP头部的数据结构和ICMP头部的数据结构在概要设计中已有分析。
2.3填充并发送请求类型的ICMP报文,填充ICMP报文后,应在ICMP报文之前加上IP报头并发送出去。
2.4解析数据包:
如果所ping的目的主机存在,那么它会发出一个回送应答包。
这是一个IP包,受到后解析此数据包并获得其中的ICMP信息。
根据IP报头信息中的IP报头长度字段,就可以得到ICMP报文的真实地址。
ICMP数据包中的IP地址就是活动主机的IP。
三、概要设计
3.1设计原理
本程序使用的原始套接字生成ICMP请求/应答报文来进行活动主机的探查。
这个程序使用的是回送请求和应答消息。
程序的大致思想是把ICMP的数据报类型设置为回送请求,将它发送给网络上的一个IP地址,如果这个IP地址已经被占用的话,那么使用位于这个IP地址的主机上的TCP/IP软件就能接受到这个ICMP回送请求,从而返回一个ICMP回送请求(类型号为0)信息。
信息封装在一个IP包中,我们需要解析该IP包,从中找到ICMP数据信息,相反,如果这个IP地址没有人使用,那么发送的ICMP回送请求在设定的延时内就不可能得到响应。
本设计的主体思想是使用ICMPECHO数据包来探测指定网段内的活动主机。
具体方法是:
通过简单的发送一个ICMPECHO(Type8)数据包到目标主机,如果ICMPECHOReply(ICMPtype0)数据包接受到,说明主机是存活状态。
如果没有就可以初步判断主机没有在线或者使用了某些过滤设备过滤了ICMP的REPLY。
ICMP全称InternetControlMessageProtocol,工作在OSI的网络层。
它的中文名为因特网控制报文协议。
ICMP报文要封装在IP数据报内部才能传输。
其结构如(图1)所示。
ICMP报文的格式如(图2)所示。
所有的ICMP报文的前4个字节都是一样的,但是其他字节互不相同。
其中0-7位是类型字段,8-15位是代码字段,16-31位是校验和字段。
校验和字段为2个字节,校验的范围是整个ICMP报文。
本设计仅用到类型为0和8的ICMP报文,关于这两种类型报文的具体描述详见(图3)。
20B
图1:
ICMP封装在IP内部
IP数据报
IP首部
ICMP报文
31(位)
1516
78
类型字段
代码字段
校验和字段
0
(不同类型和代码有不同内容)
图2:
ICMP报文
类型
代码
描述
0
0
回应应答(Ping应答,与类型8的Ping请求一起使用)
8
0
回应请求(Ping请求,与类型8的Ping应答一起使用)
图3:
本设计使用的ICMP报文类型
3.2数据结构设计
3.1.1.IP头部数据结构
typedefstructiphdr{
unsignedintheadlen:
4;//ip头长度
unsignedintwersion:
4;//ip版本号
unsignedchartos;//服务类型
unsignedshorttotallen;//ip包总长度
unsignedshortid;//ip号
unsignedshortflag;//标记
unsignedcharttl;//生存时间
unsignedcharprot;//协议(UDPTCP)
unsignedshortchecksum;//校验和
unsignedintsourceip;//源ip
unsignedintdestip;//目的ip
}IpHeader;
3.1.2.ICMP头部数据结构
typedefstructicmphdr{
BYTEtype;//icmp类型码,回送请求的类型码为8
BYTEcode;//子类型码,保存与特定ICMP报文类型相关的细节信息
USHORTchecksum;//校验和
USHORTid;//ICMP报文id号
USHORTseq;//ICMP数据报的序列号
}Icmpheader;
3.3系统流程图
3.3.1.主流程图(图4)
图4
3.3.2.子流程图(图5)
图5
四、详细设计
4.1.ICMP报文分析
ICMP是一种差错和控制报文协议,用于传输错误报告和控制信息。
ICMP报文分为头部和数据部分。
ICMP报文封装在IP数据报中传输。
IP报头中的类型为1时,表示报文的数据部分为ICMP报文。
虽然ICMP报文由IP报文传输,但是并不能认为ICMP是IP的上层协议,而是IP协议的有机补充。
把ICMP报文放在IP包中,是要利用IP的转发功能。
类型(TYPE)是一个字节,表示ICMP消息的类型。
代码(CODE)也是一个字节,表示报文类型的下一步信息。
校验和共有两个字节,提供对整个ICMP报文的校验和(和IP报文类型的进一步信息)。
校验和共两个字节,提供对整个ICMP报文的校验和。
按照协议的功能来分,ICMP报文可以分为
1)ICMP差错报文
包括目的不可达报告,超时报告,参数出错报告。
2)ICMP控制报文
包括拥塞控制和源抑制报文,路游控制和重定向报文。
3)ICMP测试报文
包括请求应答报文,时戳请求应答报文。
本课程设计就是使用ICMP请求/应答报文来测试目的主机是否存在,请求者想某特定的主机发送请求,其中包含任选的数据。
目的主机收到请求后,发送应答报文。
在同一时刻,一台机器可以同时向多台主机发送请求报文。
ICMP报文格式如图6所示,ICMP回送报文格式如下图7所示。
类型
代码
校验和
数据区(变长)
类型
代码
校验和
标志位
序号
任选数据
图6.ICMP报文格式图7.ICMP回应报文格式
4.2.程序功能分析
在初始化原始套接字之后,本程序就要开始在一个IP网段内寻找活动主机。
因为要寻找活动的主机可能很多,为节省时间可以采用多线程编程。
结合核心代码对程序的具体进行分析。
4.2.1使用原始套接字
为了实现发送/监听ICMP抱文,必须使用原始套接字,创建原始套接字的代码如下:
SOCKETsockraw;
sockraw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,wsa_flag_overlapped);
在WSASocket函数中,我们使用IPPROTO_ICMP表示接受ICMP数据包,为了使用发送接受超时设置(设置SO_RCVTIMEO或SO_SNDTIMEO),必须将标志位置为WSA_FLAG_OVERLAPPED。
然后调用setsockopt函数设置读取迟延。
在setsockopt函数中,sockraw是之前创建的原始套接字,设置SOL_SOCKET表明使用基本套接字处理ICMP抱文。
设置SO_RCVTIMEO表示使用接受超时设置,SOSNDTIMEO表示使用发送超时设置,在这里,超时时间均设置为1000ms。
4.2.2定义IP头部和ICMP头部数据结构
由于socket发送/捕获的是IP包,因此要分别定义IP头部的数据结构和ICMP头部的数据结构。
IP头部的数据结构和ICMP头部的数据结构在概要设计中已有分析。
4.2.3填充并发送请求类型的ICMP报文
#defineICMP_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数据头部
icmp_header*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);//计算出ICMP数据报的数据部分
memset(datapart,'A',datasize-sizeof(icmphearder));//填入数据
((IcmpHeader*)icmp_data)->seq=0;//序列号
((IcmpHeader*)icmp_data)->check_sum=0;//先将检验和置0
((IcmpHeader*)icmp_data)->checksum=checksum(USHORT*)icmp_data,data_size);
//Checksum为计算校验和的函数,设校验和初值为0,然后对数据每16位求异或,结果取反,便得校验和。
其代码如下:
unsingedlongcksum=0;
while(size>1)
{cksum+=*buffer++;
size-=sizeof(ushort);}
if(size)
{cksum+=*(uchar)buffer;}
cksum=(cksum>>16)+(cksum&0xffff);
cksum+=(cksum>>16);
return(ushort)(~cksum);
填充ICMP报文之后,应在ICMP报文之前加上IP报头并发送出去。
可调用下面的代码发送数据包。
注意,这里的dest是填入目的主机的IP地址的一个sockaddr_in数据结构,IP_STRING是目的的主机的IP地址字符串。
Structsockaddr_in_dest;
Dest.sin_family=AF_INET;
Dest.sin_addr.s_addr=inet_addr(IP_STRING);
Sendto(sockraw,icmp_data,datasize,0,(sockaddr*)&dest,sizeof(dest));
4.2.4解析数据包
如果所ping的目的主机存在,那么它会发出一个回送应答包。
这是一个IP包,受到后解析此数据包并获得其中的ICMP信息。
根据IP报头信息中的IP报头长度字段,就可以得到ICMP报文的真实地址。
ICMP数据包中的IP地址就是活动主机的IP。
代码分析如下:
#defineICMP_MIN8
#defineMAX_PING_PACKET_SIZE(MAX_PACKET+sizeof(IpHeader))
char*recvbuf=new[MAX_PING_PACKET_SIZE];
structsockaddr_indest,from,end;
intformlen=sizeof(from);
intbytes=recvfrom(sockraw,recvbuf,MAX_PACKET,0,(Structsockaddr*)&from,&fromlen)
ipheader*iphdr;
icmpheader*icmphdr;
unsignedshortiphdrlen;
iphdr=(ipheader*)buf;
iphdrlen=iphdr->headlen*4;//IP报头的长度
icmphdr=(icmpheader*)(buf+iphdrlen);//跳过IP头
//数据包太短丢弃
if(bytes if(icmphdr->type! =icmp_echo_reply)return;//ID不相符,丢弃 if(icmphdr->id! =(USHORT)getcurrentthreadid())return;//输出正在使用的IP地址 cout<<"活动主机"< 五、测试数据及其结果分析 经调试,运行正常,运行结果如下图 实验过程中的一些测试: (1)在实验室运行程序时,发现某些主机无法发现。 经分析,是因为这些主机装有瑞星防火墙,拒绝发送ICMP回送响应信息。 如果将其防火墙关闭,或者修改规则,能正常发现。 (2)如果参数不符合,比如输入为: scanhost10.0.,程序能够发现格式错误,并给出警告并提示正确格式: 输入格式错误: scanhoststartipendip。 (3)在格式正确的情况下,如果IP地址格式有错误,程序不能正常发现。 比如输入scanhost10.110.15时,程序不能返回IP格式错误的信息,反而给出发现主机10.0.0.3与10.0.0.14。 这说明程序对IP地址没有预先判断处理。 (4)经以上分析,程序容错性不是很好,能检查基本错误,但是一些问题(如IP格式检测)等没有处理好。 (5)还有,程序把能响应ICMP回送请求信息的主体都视为主机,这有一定的不科学性。 比如上面截图中,10.0.0.3是网关的IP。 但是程序未能将其和一般主机区分。 六、调试过程中的问题 1,找不到头文件。 因为头文件存放位置错误。 2,变量没有定义。 因为变量没有定义和变量名书写写错。 3,指针书写错误。 4,宏参数列表错误。 5,结构体指针传递错误。 Cannotcovertfrom‘structiphdr*’to‘structicmphar*ip’Ipheader*iphdr.因为缺少成员运算符”.”。 七、课程设计总结 本次实验让我很好的理解了ICMP报文的结构,对ICMP协议也有了更好的认识。 加深了对ICMP协议的理解,巩固了课堂知识,为以后学习网络协议打下基础。 通过本次实验过程是我了解了IP协议的优点是简单,但缺少差错控制和查询机制,而网际控制报文协议(ICMP具有补充IP功能的作用。 在网络管理中,常常要确定当前网络在红处于活动状态的主机,这时可以通过ICMP的回送和回送响应消息来完成这项工作。 这课程设计的目的就是编制程序,利用ICMP数据包,发现网络中的活动主机,即ping消息的请求和应答。 在调试过程中难免要出现一些问题,为了能够快速地确定错误的原因,尽快的排除程序逻辑错误,通常把程序错误划分为三种类型: 语法错误、运行错误和逻辑错误。 在这次网络课程设计中,也发生了这样那样的错误,如变量没有定义、缺少头文件。 出现问题是正常的,关键是如何去发现问题的根源,然后去解决它,通过查阅文献资料、请教老师和同学讨论、借助网络去解决,逐一对错误进行了调试,使程序基本能正常运行,大体上符合了设计的意图和设计的要求。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 活动 主机 扫描