课程设计报告发现网络中的活动主机.docx
《课程设计报告发现网络中的活动主机.docx》由会员分享,可在线阅读,更多相关《课程设计报告发现网络中的活动主机.docx(20页珍藏版)》请在冰豆网上搜索。
课程设计报告发现网络中的活动主机
重庆交通大学信息科学及工程学院
课程设计实验报告
专业:
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)输出格式为:
活动主机1IP地址
活动主机2IP地址
……
四、课程设计相关技术
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目不可达
1网络不可达
2主机不可达
3协议不可达
4端口不可达
5需要进行分片但设置了禁止分片比特
6源主机选择路由失败
7无法识别目网络
8无法识别目主机
9源主机被隔离
10目网络被禁止
11目主机被禁止
12由于服务类型(TOS),网络不可达
13由于服务类型(TOS),主机不可达
14由于过滤,通信被强行禁止
15主机越权
16优先权终止生效
40源端被关闭(基本流控制)
5重定向
1对网络重定向
2对主机重定向
3对服务类型和网络重定向
4对服务类型和主机重定向
80回送请求(PING请求)
90路由器通告
100路由器请求
11超时
1传输期间生存期减为0
2数据报组装期间生存期减为0
12参数问题
1各种IP头部错误
2缺少必须选项
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;//源IP
unsignedintdestIP;//目IP
}IpHeader;
//ICMP头部数据结构
typedefstructicmphdr{
BYTEtype;//ICMP类型码,回送请求类型码为8
BYTEcode;//子类型码,保存及特定ICMP报文类型相关细节信息
USHORTchecksum;//校验和
USHORTid;//ICMP报文ID号(一般用进程号作ID)
USHORTseg;//ICMP数据报序列号
}IcmpHeader;
WSAStartup函数
本函数必须是应用程序或DLL调用第一个WindowsSockets函数.它允许应用程序或DLL指明WindowsSocketsAPI版本号及获得特定WindowsSockets实现细节.应用程序或DLL只能在一次成功WSAStartup()调用之后才能调用进一步WindowsSocketsAPI函数。
具体应用:
vMAKEWORD函数
本函数用于进行对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)
{
cout<<"WASStartupfailed"<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,re