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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

天津师范大学Tianjin University of Education

网络课程设计

所在学院:信息技术工程学院

专业:计算机科学与技术

学号:

学生姓名:

指导教师:

二〇一三年六月

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

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

学生姓名:肖磊

指导教师:黄彦副教授

20 13 年6月

摘要

本程序使用原始套接字生成ICMP报文来进行活动主机的探查。这个程序使用的是回送请求与应答消息。程序的大致思想是把ICMP的数据包类型设置为回送请求,将它发送给网络上的一个IP地址,如果这个IP地址已经被占用的话,那幺使用位于这个IP地址的主机上的TCP/IP软件就能够接收到这个ICMP回送请求,从而返回一个ICMP回送响应(类型号为0)信息。信息封装在一个IP包中,我们需要解析该IP 包,从中找到ICMP数据信息。相反,如果这个IP地址没有人使用,那幺发送的ICMP 回送请求在设定的延时内就不可能得到响应。

在初始化原始套接字之后,本程序就要开始在一个IP网段内寻找活动主机。因为要寻找的主机可能很多,为节省时间可以采用多线程编程。

关键词: ICMP协议,Visual c++ 6.0

目录

引言 (1)

1 课程设计相关技术 (2)

1.1 ICMP报文格式及类型 (2)

1.2实验平台介绍 (4)

2.1 使用原始套接字 (4)

2.2 定义IP头部和ICMP头部的数据结构 (5)

2.3 填充并发送回送请求类型的ICMP报文 (6)

2.4程序流程图 (8)

结论 (10)

参考文献 (11)

致谢 (12)

引言

IP协议的优点是简洁,但缺少差错控制和查询机制,而网际控制报文协议(ICMP)具有补充IP功能的作用。在网络管理中,常常要确定当前网络中处于活动状态的主机,这时可以通过使用ICMP的回送和回送响应消息来完成这项工作。本课程设计的目的就是编制程序,利用ICMP数据包,发现指定网段中的活动主机。通过课程设计,更加熟悉ICMP报文的结构,对ICMP协议有更好的理解和认识。。

1 课程设计相关技术

1.1 ICMP报文格式及类型

编制程序前首先要对ICMP报文的格式有一定的了解,ICMP报文是在IP数据报内部传输的,其结构如图10-1所示。

图10-1 ICMP封装在IP内部

0 7 8 15 16 31(位)

图10-2 ICMP报文

ICMP报文的格式如图10-2所示。所有报文的前4个字节都是一样的,但是其它字节则互不相同。其中类型字段可以有15个不同的值,以描述特定类型的ICMP报文,某些ICMP报文还使用代码字段的值来进一步描述不用的条件。按验和字段为2字节,校验的范围是整个ICMP报文。检验和是必须的,其计算方法与IP协议头部校验和的计算方法一样。

各种类型的ICMP报文如图10-3所示(ICMP报文类型),不同类型由报文中的类型字段和代码字段来共同决定。

10-3 ICMP报文类型

本课程设计的目的是发现网络中的活动主机,就是使用ICMP的回送和回送响应

消息发现网络中的活动主机,即Ping消息的请求和应答。那幺,发送的ICMP的数据包类型设置为回送请求(类型号为8)。

1.2实验平台介绍

Visual C++ 6.0,简称VC或者VC6.0,是微软推出的一款C++编译器,将“高级语言”翻译为“机器语言(低级语言)”的程序。Visual C++是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软件开发的首选工具。Visual C++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境。

2 课程设计过程

2.1 使用原始套接字

为了实现发送/监听ICMP报文,必须使用原始套接字,创建原始套接字的代码如下:

socket sockRaw;

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函数设置读取延迟。

Int timeout=1000;

setsockopt(sockRaw,SQL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(tim eout);

setsockopt(sockRaw,SQL_socket,SO_SNDTIMEO,(char*)&timeout,sizeof(tim eout);

在setsockopt函数中,sockRaw是之前创建的原始套接字,设置SQL_SOCKET 表明使用基本套接字处理ICMP报文。设置SO_RCVTIMEO表示使用接收超时设置,

SO_SNDTIMEO表示使用发送超时设置,在这里,超时时间均设置为1000ms。

2.2 定义IP头部和ICMP头部的数据结构

由于socket发送/捕获的是IP包,因此要分别定义IP头部的数据结构ICMP 头部数据结构。

//IP报头的数据结构

typedef struct iphdr{

unsigned int headlen:4; //IP头长度

unsigned int version:4; //IP版本号

unsigned char tos; //服务类型

unsigned short totallen; //IP包总长度

unsigned short id;; //ID号

unsigned short flag; //标记

unsigned char ttl; //生存时间

unsigned char prot; //协议(UDP TCP)

unsigned short checksum; //校验和

unsigned int sourceIP; //源IP

unsigned int destIP; //目的IP

}IpHeader;

//ICMP头部的数据结构

typedef struct icmphdr{

BYTE type; //ICMP类型码,回送请求的类型码为8 BYTE code; //子类型码,保存与特定ICMP报文类型相关细节信息

USHORT checksum; //校验和

USHORT id; //ICMP报文ID号(一般用进程号作ID) USHORT seq; //ICMP数据报的序列号

}IcmpHeader;

相关文档
最新文档