课程设计报告发现网络中的活动主机讲解Word下载.docx
- 文档编号:17517802
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:17
- 大小:124.79KB
课程设计报告发现网络中的活动主机讲解Word下载.docx
《课程设计报告发现网络中的活动主机讲解Word下载.docx》由会员分享,可在线阅读,更多相关《课程设计报告发现网络中的活动主机讲解Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
ICMP(InternetControlMessagesProtocol,网间控制
报文协议)允许主机或路由器报告差错情况和提供有关异常情况的报告。
一般来说,ICMP报文提供针对网络层的错误诊断、拥塞控制、路径控制和查询服务四项大的功能。
如,当一个分组无法到达目的站点或TTL超时后,路由器就会丢弃此分组,并向源站点返回一个目的站点不可到达的ICMP报文。
编制程序前首先要对ICMP报文的格式有一定的了解,ICMP报文是在IP数据报内部传输的,其结构如图10-1所示。
图10-1ICMP封装在IP内部
078151631(位)
类型字段
代码字段
校验和字段
不同类型和代码有不同内容)
图10-2ICMP报文
ICMP报文的格式如图10-2所示。
所有报文的前4个字节都是一样的,但是其它字节则互不相同。
其中类型字段可以有15个不同的值,以描述特定类型的ICMP报文,某些ICMP报文还使用代码字段的值来进一步描述不用的条件。
按验和字段为2字节,校验的范围是整个ICMP报文。
检验和是必须的,其计算方法与IP协议头部校验和的计算方法一样。
各种类型的ICMP报文如图10-3所示(ICMP报文类型),不同类型由报文中的类型字段和代码字段来共同决定。
类型
代码
描述
回送响应(PING应答)
3
目的不可达
网络不可达
1
主机不可达
2
协议不可达
端口不可达
4
需要进行分片但设置了禁止分片比特
5
源主机选择路由失败
6
无法识别目的网络
7
无法识别目的主机
8
源主机被隔离
9
目的网络被禁止
10
目的主机被禁止
11
由于服务类型(TOS),网络不可达
12
由于服务类型(TOS),主机不可达
13
由于过滤,通信被强行禁止
14
主机越权
15
优先权终止生效
源端被关闭(基本流控制)
重定向
对网络重定向
对主机重定向
对服务类型和网络重定向
对服务类型和主机重定向
回送请求(PING请求)
路由器通告
路由器请求
超时
传输期间生存期减为0
数据报组装期间生存期减为0
参数问题
各种IP头部错误
缺少必须的选项
时间戳请求
时间戳应答
信息请求(已作废)
16
信息应答(已作废)
17
地址掩码请求
18
地址掩码应答
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:
版本号
unsignedchartos;
//
服务类型
unsignedshorttotallen;
包总长度
unsignedshortid;
;
//ID
号
unsignedshortflag;
标记
unsignedcharttl;
生存时间
unsignedcharprot;
协议(UDPTCP)
unsignedshortchecksum;
校验和
unsignedintsourceIP;
源IP
unsignedintdestIP;
目的IP
}IpHeader;
//ICMP头部的数据结构
typedefstructicmphdr{
类型码,回送请求的类型码为8
BYTEtype;
//ICMP
子类型码,保存与特定ICMP报文类型相关细节信息
报文ID号(一般用进程号作ID)数据报的序列号
}IcmpHeader;
WSAStartup函数
本函数必须是应用程序或DLL调用的第一个WindowsSockets函数.它允许应用程序或DLL指明WindowsSocketsAPI的版本号及获得特定WindowsSockets实现的细节.应用程序或DLL只能在一次成功的WSAStartup()调用之后才能调用进一步的WindowsSocketsAPI函数。
具体应用:
MAKEWOR函D数
本函数用于进行对Socket版本的指定和协商,具体应用实例如下:
4.2、实例化ICMP数据报格式并创建Socket套接字
程序使用原始套接字(SOCK_RA)W生成ICMP报文来进行活动主机的探查,这个
#defineICMP_RCHO8
程序使用的是回送请求与应答信息。
//请求回送
#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())。
//from是一个sockaddr_in数据结构,用于保存响应的目的
的主机的地址
unsignedintaddr=0;
longThreadNumCounter=0,ThreadNumLimit=20;
long*aa=&
ThreadNumCounter;
voidmain(intargc,char*argv[])
{
if(WSAStartup(MAKEWORD(2,1),&
wsaData)!
=0)
cout<
<
"
WASStartupfailed"
GetLastError()<
endl;
ExitProcess(STATUS_FAILED);
}sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLA;
PPED
4.4、解析数据包
如果所Ping的目的主机所在,那么它会发送一个回送应答包。
这是一个IP包,收到后解析此数据包并获取其中的ICMP信息。
根据IP报头信息中的IP报头长度字段,就可以得到ICMP报文的真实地址。
ICMP数据包中的IP地址就是活动主机的IP。
代码如下:
#defineICMP_MIN8//ICMP报文头长度(最小ICMP报文长度)
#defineMAX_PING_PACKET_SIZE(MAX_PACKET+SIZEOF(IPHeader))
//保证大与发送包的大小
//from是一个sockaddr_in数据结构,用于保存响应的目的的主机的地址
structsockaddr_infrom;
intfromlen=sizeof(from);
intbytes=recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(strucksockaddr*)&
from),&
fromlen);
IpHeader*iphdr;
IcmpHeader*icmphdr;
unsignedshortiphdrlen;
iphdr=(Ipheader*)buf;
iphdrlen=iphdr->
headlen*4;
//IP报头的长度
icmphdr=(Icmpheader*)(buf+iphdrlen);
//跳过IP报头//数据包太短,丢弃if(bytes<
iphdrlen+ICMP_MIN)return;
//不是回送响应(Ping应答),丢弃if(icmphdr->
type!
=ICMP_ECHO_REPLY)return;
//Id号不相符,丢弃if(icmphdr->
id!
=(USHOT)GetCurrentThreadId())return;
//输出正在使用的IP地址。
Cout<
”活动主机:
”<
inet_ntoa(from->
sin_addr)<
4.5、程序流程图
以下分别是主
一个用多线程实现的程序在课程设计过程的第三部分中给出,程序流程图和子程序流程图:
Start_IP≤End_IP?
YY
创建一个线程并执行
StartIP++
N
图1主程序流程图
Y
不是回送响应?
图2子程序流程图
六、程序运行结果
七、课程设计小结
这次课程设计是在毫无准备的尴尬情况下进行的,在此之前,虽然学习了许多有关计算机网路以及通信原理的知识,但是都是基于理论教学的。
至于将网络协议应用到编程过程中,这还是头一次,因此在设计的过程中遇到许多难题。
在阅读设计要求时,一个概念困扰很久,多线程编程在之前并没有接触过,但是通过网络查询资料后得以理解其含义和作用。
在计算机中,一个应用程序在运行状态可以看做一个进程,但是这就像做一项及其重要的过程是同一个道理,在实际生活中,为了实现高效率的工作模式,通常是多个人同时来完成一项工作,或者说是很多人做同一样事情,结果是同样的时间可以实现大批量的工作。
在这个过程当中,参与该事件的人都可以使用现有的资源,这就是多线程共享进程资源的原理。
但是,在计算机线程中有一种特殊的情况,有的线程不能使用某些系统资源,这就称作锁,就好比有的线程将属于自己的系统资源上了一把锁,不允许其他线程使用这些资源。
总之,计算机多线程编程就是为了实现计算机快速、高效率地执行程序。
通过此次课程设计,我加深了对ICMP协议的理解,巩固了课堂知识。
由于网络协议比较抽象、难学,自己学得也不够深入,加上还要把所学知识运用到实践中来,所以一开始时感觉比较困难,而且在调试过程中难免要出现一些如变量没有定义、缺少头文件、大小写错误以及其它问题,通过查阅文献资料、向同学请教以及认真地思考与分析,逐一对错误进行了调试,才使得程序能正常运行,大体上符合了设计的目的和要求。
在程序的调试过程中,出现问题是正常的,关键是如何去发现问题的根源,然后去解决它。
为了能够快速地确定错误的原因,尽快的排除程序错误,通常把程序错误划分为三种类型:
语法错误、运行错误和逻辑错误。
在设计过程中,我们可以先找出问题,看是属于哪一类错误,然后再将问题一一解决,这样既解决了疑难问题又节省了不少时间。
参考文献
[1]吴功宜,胡晓英,张仁,何云,王宁编著.计算机网络课程设计.北京:
机械工业出版社,2010.8
[2]吴功宜著.计算机网络.北京:
清华大学出版社,2004
[3]陈坚,陈伟.VisualC++网络高级编程[M].北京:
人民邮电出版社,2001
[4]郭国强.计算机网络与Internet教程.北京:
清华出版社,2006.11
[5]杨丰瑞,杨丰任.实用教程最新计算机网络.北京:
中国铁道出版社,2001.7
附录源代码
#pragmapack(4)#pragmacomment(lib,"
Ws2_32.lib"
)#defineWIN32_LEAN_AND_MEAN
#include<
winsock2.h>
stdio.h>
stdlib.h>
iostream.h>
#include<
sys/timeb.h>
time.h>
//为了实现发送/监听ICMP报文,必须使用原始套接字,创建原始套接字
structsockaddr_indest,from,end;
//from是一个sockaddr_in数据结构,用于保存响应的目的的主机的地址
//保证大与发送包的大小unsignedintaddr=0;
ExitProcess(STATUS_FAILED);
}sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);
if(sockRaw==INVALID_SOCKET)
WASSocketet()falied"
WSAGetLastError()<
}
inttimeout=1000;
intbread=setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&
timeout,sizeof(timeout));
if(bread==SOCKET_ERROR)
FAILEDTOSEYRECVTIMEOUT"
}timeout=1000;
bread=setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&
}memset(&
dest,0,sizeof(dest));
unsignedlongstartIP,endIP;
dest.sin_family=AF_INET;
dest.sin_addr.s_addr=inet_addr(argv[1]);
startIP=inet_addr(argv[1]);
end.sin_family=AF_INET;
end.sin_addr.s_addr=inet_addr(argv[2]);
endIP=inet_addr(argv[2]);
HANDLEhThread;
while(htonl(startIP)<
=htonl(endIP))
{if(ThreadNumCounter>
ThreadNumLimit){
Sleep(5000);
continue;
DWORDThreadID;
sockaddr_in*pIPAddrTemp=new(sockaddr_in);
if(!
pIPAddrTemp)
{cout<
memoryallocfailed"
return;
*pIPAddrTemp=dest;
clock_tstart;
start=clock();
hThread=CreateThread(NULL,NULL,FindIP,(LPVOID)pIPAddrTemp,NULL,&
ThreadID);
longi=60000000L;
while(i--);
TerminateThread(hThread,0);
InterlockedDecrement(aa);
memset(&
from,0,sizeof(from));
startIP=htonl(htonl(startIP)+1);
dest.sin_addr.s_addr=startIP;
while(ThreadNumCounter!
Sleep(2000);
return;
error"
报文的填充
设置类型设置其ID号为
计算出数据报的
voidf
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 报告 发现 网络 中的 活动 主机 讲解