网络使用ICMP发现局域网内活动主机.docx

上传人:b****5 文档编号:4552851 上传时间:2022-12-06 格式:DOCX 页数:12 大小:77.59KB
下载 相关 举报
网络使用ICMP发现局域网内活动主机.docx_第1页
第1页 / 共12页
网络使用ICMP发现局域网内活动主机.docx_第2页
第2页 / 共12页
网络使用ICMP发现局域网内活动主机.docx_第3页
第3页 / 共12页
网络使用ICMP发现局域网内活动主机.docx_第4页
第4页 / 共12页
网络使用ICMP发现局域网内活动主机.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

网络使用ICMP发现局域网内活动主机.docx

《网络使用ICMP发现局域网内活动主机.docx》由会员分享,可在线阅读,更多相关《网络使用ICMP发现局域网内活动主机.docx(12页珍藏版)》请在冰豆网上搜索。

网络使用ICMP发现局域网内活动主机.docx

网络使用ICMP发现局域网内活动主机

 

天津师范大学

TianjinUniversityofEducation

 

网络课程设计

 

所在学院:

信息技术工程学院

专业:

计算机科学与技术

学号:

学生姓名:

指导教师:

 

二〇一三年六月

 

信息技术工程学院网络课程设计

 

使用ICMP发现局域网内活动主机

 

学生姓名:

肖磊

指导教师:

黄彦副教授

 

2013年6月

摘要

本程序使用原始套接字生成ICMP报文来进行活动主机的探查。

这个程序使用的是回送请求与应答消息。

程序的大致思想是把ICMP的数据包类型设置为回送请求,将它发送给网络上的一个IP地址,如果这个IP地址已经被占用的话,那幺使用位于这个IP地址的主机上的TCP/IP软件就能够接收到这个ICMP回送请求,从而返回一个ICMP回送响应(类型号为0)信息。

信息封装在一个IP包中,我们需要解析该IP包,从中找到ICMP数据信息。

相反,如果这个IP地址没有人使用,那幺发送的ICMP回送请求在设定的延时内就不可能得到响应。

在初始化原始套接字之后,本程序就要开始在一个IP网段内寻找活动主机。

因为要寻找的主机可能很多,为节省时间可以采用多线程编程。

 

关键词:

ICMP协议,Visualc++6.0

引言

IP协议的优点是简洁,但缺少差错控制和查询机制,而网际控制报文协议(ICMP)具有补充IP功能的作用。

在网络管理中,常常要确定当前网络中处于活动状态的主机,这时可以通过使用ICMP的回送和回送响应消息来完成这项工作。

本课程设计的目的就是编制程序,利用ICMP数据包,发现指定网段中的活动主机。

通过课程设计,更加熟悉ICMP报文的结构,对ICMP协议有更好的理解和认识。

 

1课程设计相关技术

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应答)

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)。

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表示使用接收超时设置,SO_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;//源IP

unsignedintdestIP;//目的IP

}IpHeader;

//ICMP头部的数据结构

typedefstructicmphdr{

BYTEtype;//ICMP类型码,回送请求的类型码为8

BYTEcode;//子类型码,保存与特定ICMP报文类型相关细节信息

USHORTchecksum;//校验和

USHORTid;//ICMP报文ID号(一般用进程号作ID)

USHORTseq;//ICMP数据报的序列号

}IcmpHeader;

2.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)->checksum=0;//先将校验和置0

((IcmpHeader*)icmp_data)->checksum=checksum((USHORT*)icmp_data,datasize);

checksum为校验和的函数,设校验和初值为0,然后对数据每16为求异或,结果取反,便得校验和。

其代码如下:

USHORTchecksum(USHORT*buffer,intsize)//计算校验和

{

unsignedlongcksum=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_indest;

dest.sin_family=AF_INET;

dest.sin_addr.s_addr=inet_addr(IP_STRING);//填入搜索的IP地址

sendto(sockRaw,icmp_data,datasize,0,(sockaddr*)&dest,sizeof(dest));

 

2.4程序流程图

N

YY

N

Y

N

 

图1主程序流程图

 

 

Y

N

Y

N

Y

N

 

图2子程序流程图

结论

通过此次课程设计,我加深了对ICMP协议的理解,巩固了课堂知识。

由于网络协议比较抽象、难学,自己学得也不够深入,加上还要把所学知识运用到实践中来,所以一开始时感觉比较困难,而且在调试过程中难免要出现一些如变量没有定义、缺少头文件、大小写错误以及其它问题,通过查阅文献资料、向同学请教以及认真地思考与分析,逐一对错误进行了调试,才使得程序能正常运行,大体上符合了设计的目的和要求。

在程序的调试过程中,出现问题是正常的,关键是如何去发现问题的根源,然后去解决它。

为了能够快速地确定错误的原因,尽快的排除程序错误,通常把程序错误划分为三种类型:

语法错误、运行错误和逻辑错误。

在设计过程中,我们可以先找出问题,看是属于哪一类错误,然后再将问题一一解决,这样既解决了疑难问题又节省了不少时间。

 

参考文献

[1]安淑芝,黄彦.计算机网络[M].北京:

中国铁道出版社.2011

[2]吴功宜,胡晓英,张仁,何云,王宁编著.计算机网络课程设计.北京:

机械工业出版社,2010.8

[3]吴功宜著.计算机网络.北京:

清华大学出版社,2004

[4]陈坚,陈伟.VisualC++网络高级编程[M].北京:

人民邮电出版社,2001

[5]郭国强.计算机网络与Internet教程.北京:

清华出版社,2006.11

[6]杨丰瑞,杨丰任.实用教程最新计算机网络.北京:

中国铁道出版社,2001.7

致谢

在本课程设计论文即将完成之际,我想对所有曾经给过我帮助和支持的同学老师表示衷心的感谢。

感谢我的老师对我课程设计的指导,书到用时方恨少,在这篇论文的写作过程中,我深感自己的水平还非常的欠缺。

生命不息,学习不止,人生就是一个不断学习和完善的过程,敢问路在何方?

路在脚下!

老师同学在学习和工作方面给了我大量的指导,让我学到了很多知识,也获得了实践锻炼的机会。

老师对我的严格要求以及为人的诚恳都将使我终身受益,使我可以顺利的完成课程设计任务,感谢我的同学,感谢他们在大学期间在学习和生活上给予我的帮助。

感谢我在网络上的那些个朋友,每当遇到自己无法解决的问题的时候,总是向他们求教,他们也总是不吝赐教,在此非常感谢你们为我付出!

一个人的成长绝不是一件孤立的事,没有别人的支持与帮助绝不可能办到。

我感谢可以有这样一个空间,让我对所有给予我关心、帮助的人说声“谢谢”!

今后,我会继续努力,好好学习!

好好生活!

最后,衷心的感谢在百忙之中抽出时间审阅论文的老师。

 

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

当前位置:首页 > 高等教育 > 工学

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

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