课程设计报告发现网络中的活动主机.docx

上传人:b****4 文档编号:718314 上传时间:2022-10-12 格式:DOCX 页数:20 大小:95.55KB
下载 相关 举报
课程设计报告发现网络中的活动主机.docx_第1页
第1页 / 共20页
课程设计报告发现网络中的活动主机.docx_第2页
第2页 / 共20页
课程设计报告发现网络中的活动主机.docx_第3页
第3页 / 共20页
课程设计报告发现网络中的活动主机.docx_第4页
第4页 / 共20页
课程设计报告发现网络中的活动主机.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

课程设计报告发现网络中的活动主机.docx

《课程设计报告发现网络中的活动主机.docx》由会员分享,可在线阅读,更多相关《课程设计报告发现网络中的活动主机.docx(20页珍藏版)》请在冰豆网上搜索。

课程设计报告发现网络中的活动主机.docx

课程设计报告发现网络中的活动主机

重庆交通大学信息科学及工程学院

课程设计实验报告

 

专业:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1