课程设计报告-发现网络中的活动主机讲解_第1页
课程设计报告-发现网络中的活动主机讲解_第2页
课程设计报告-发现网络中的活动主机讲解_第3页
课程设计报告-发现网络中的活动主机讲解_第4页
课程设计报告-发现网络中的活动主机讲解_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、重庆交通大学信息科学与工程学院课程设计实验报告专业: 12 级通信工程( 2)班学号:姓名:实验所属课程:通信网综合课程设计指 导 教 师 : 谭晋一、程设计的目的和意义在网络管理中, 经常要确定当前网络中处于活动状态的主机, 这 时可以通过使用 ICMP 协议的回送请求(Ping 请求)和回送响应(Ping 应答)消息来完成本工作。本课程设计的目的是编制程序,利用 ICMP数据包,发现制定网 段中的活动主机。IP 协议的优点是简洁, 但缺少差错控制和查询机制, 而网际控制 报文协议( ICMP)具有补充 IP 功能的作用。在网络管理中,常常要 确定当前网络中处于活动状态的主机,这时可以通过使

2、用ICMP的回送和回送响应消息来完成这项工作。本课程设计的目的就是编制程 序,利用 ICMP数据包,发现指定网段中的活动主机。通过课程设计, 使学生更加熟悉 ICMP报文的结构,对 ICMP协议有更好的理解和认识。二、课程设计条件计算机, Matlab 、C/C+或 JAVA编程软件或者其他通信网仿真软 件(如 NS2、OMNET+等+)、嵌入式开发板、编程器等。三、程设计的内容和要求本程序的功能是发送 ICMP 数据包,以获取指定网段中的活动主 机,并将结果显示到屏幕上。程序的要求1) 不允许在程序中直接调用 Ping ,而是用程序实现 Ping 的功2 ) 以命令形式运行:程序名 Star

3、t_ip End_ip, 其中,Start_IP 为起始 IP 地址; End_IP为结束 IP 地址3) 输出格式为:活动主机 1的 IP 地址活动主机 2的 IP 地址四、课程设计的相关技术IP 协议是一种不可靠的协议, 无法进行差错控制。 但 IP 协议可以 借助其他协议来实现这一功能,如 ICMP。 ICMP(Internet Control Messages Protocol,网间控制报文协议)允许主机或路由器报告差错情况和提供有关异常情况的报 告。一般来说, ICMP 报文提供针对网络层的错误诊断、拥塞控制、 路径控制和查询服务四项大的功能。 如,当一个分组无法到达目的站 点或 T

4、TL 超时后,路由器就会丢弃此分组,并向源站点返回一个目 的站点不可到达的 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报文还使用代码字段的 值来进一步描述

5、不用的条件。 按验和字段为 2 字节,校验的范围是整 个 ICMP报文。检验和是必须的, 其计算方法与 IP 协议头部校验和的 计算方法一样。各种类型的 ICMP报文如图 10-3 所示( ICMP报文类型),不同类 型由报文中的类型字段和代码字段来共同决定。类型代码描述00回送响应( PING 应答)3目的不可达0网络不可达1主机不可达2协议不可达3端口不可达4需要进行分片但设置了禁止分片比特5源主机选择路由失败6无法识别目的网络7无法识别目的主机8源主机被隔离9目的网络被禁止10目的主机被禁止11由于服务类型( TOS),网络不可达12由于服务类型( TOS),主机不可达13由于过滤,通信

6、被强行禁止14主机越权15优先权终止生效40源端被关闭(基本流控制)5重定向0对网络重定向1对主机重定向2对服务类型和网络重定向3对服务类型和主机重定向80回送请求( PING 请求)90路由器通告100路由器请求11超时0传输期间生存期减为 01数据报组装期间生存期减为 012参数问题0各种 IP 头部错误1缺少必须的选项130时间戳请求140时间戳应答150信息请求(已作废)160信息应答(已作废)170地址掩码请求180地址掩码应答10-3 ICMP 报文类型本课程设计的目的是发现网络中的活动主机,就是使用 ICMP的 回送和回送响应消息发现网络中的活动主机,即 Ping 消息的请求和

7、应答。那幺,发送的 ICMP的数据包类型设置为回送请求(类型号为 8)。五、课程设计过程本程序使用原始套接字 ( SOCK_RAW)生成 ICMP 报文来进行活 动主机的探查,这个程序使用的是回送请求与应答信息。程序的大致思想:把 ICMP 的数据包类型设置为回送请求( Ping 请求,类型号为 8),将它发送给网络上的一个 IP 地址,如果这个 IP 地址已经被占用, 那么使用该 IP 地址的主机的, 从而返回一个 ICMP 回送响应(类型号为 0)的信息。信息封装在一个 IP 包中,需要解析该 IP 包,找到 ICMP 数据信息(类型为 0,表示为对方的应答,证明对方 IP地址是活动的),

8、如果这个 IP 地址没有人使用,则发送的 ICMP 回送请求( Ping 请求)在设定的延时时间内不可能得到响应。 初始化原始套接字后( SOCK_RAW)后,本程序就开始在一个 IP 网段内寻找活动主机,由于要寻找的主机较多,可以采用多线程技术4.1 、分析 ICMP 协议类型和程序实现方法创建 ICMP 数据报的内容格式,把 ICMP 的数据包类型设置为回送请求( Ping 请求,类型号为8)。具体实现代码如下:/IP 报头的数据结构typedef struct iphdrunsigned int headlen:4;/IP头长度unsigned int version:4;/IP版本号u

9、nsigned 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;/源 IPunsigned int destIP;/目的 IPIpHeader;/ICMP 头部的数据结构typedef struct icmphdr类型码,回送请求的类型码为 8BYTE ty

10、pe; /ICMPBYTE code; /子类型码,保存与特定 ICMP报文类型相关细节信息USHORT checksum; /USHORT id; /ICMPUSHORT seg;/ICMP校验和报文 ID 号(一般用进程号作 ID ) 数据报的序列号IcmpHeader;WSAStartup 函数本函数必须是应用程序或 DLL调用的第一个 Windows Sockets 函数. 它允许 应用程序或 DLL指明 WindowsS ockets API 的版本号及获得特定 Windows Sockets 实现的细节 . 应用程序或 DLL只能在一次成功的 WSAStartup() 调用之后才能

11、调用 进一步的 Windows Sockets API 函数。具体应用 :MAKEWOR函D数本函数用于进行对 Socket 版本的指定和协商,具体应用实例如下:4. 2、实例化 ICMP 数据报格式并创建 Socket 套接字程序使用原始套接字( SOCK_RA)W生成 ICMP报文来进行活动主机的探查,这个#define ICMP_RCHO 8程序使用的是回送请求与应答信息。具体实现代码如下:/ 请求回送#define DEF_PACKET_SIZE 32 /#define MAX_PACKET 1024 / #define ICMP_MIN 8 /ICMP #define ICMP_RC

12、HO_REPLY 0#define STATUS_FAILED 0xFFFF缺省数据报长度最大数据块长度 报文头长度(最小 ICMP报文长度)#define MAX_PING_PACKET_SIZE (MAX_PACKET+sizeof(IpHeader) void fill_icmp_data(char *,int);USHORT checksum(USHORT *,int);void decode_resp(char *,int,struct sockaddr_in *);DWORD WINAPI FindIP(LPVOID pIPAddrTemp);WSADATA wsaData;SOC

13、KET sockRaw;/为了实现发送 / 监听 ICMP报文,必须使用原始套接字,创建原始套接字 struct sockaddr_in dest,from,end;int fromlen =sizeof(from);/from 是一个 sockaddr_in 数据结构,用于保存响应的目的 的主机的地址char *recvbuf=new charMAX_PING_PACKET_SIZE;/ 保证大与发送包的大小4.3 、创建多个线程线程是进程内部的一个执行单元。 系统创建好进程后, 实际上就启动执行了该进 程的主执行线程,主执行线程以函数地址形式,比如说main 或 WinMain 函数,将程

14、序的启动点提供给 Windows系统。主执行线程终止了,进程也就随之终止。 由于要寻找的 主机较多,可以采用多线程技术( 多线程的函数为: CreateThread() )。具体实现代码如下:int fromlen =sizeof(from);/from是一个 sockaddr_in 数据结构,用于保存响应的目的的主机的地址char *recvbuf=new charMAX_PING_PACKET_SIZE;/ 保证大与发送包的大小unsigned int addr=0;long ThreadNumCounter=0,ThreadNumLimit=20;long *aa=&Thread

15、NumCounter;void main(int argc,char *argv)if(WSAStartup(MAKEWORD(2,1),&wsaData)!=0)cout<<"WASStartup failed"<<GetLastError()<<endl;ExitProcess(STATUS_FAILED); sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLA; PPED4.4 、解析数据包如果所 Ping 的目的主机所在,那么它会发送一

16、个回送应答包。这是一个 IP 包,收到后解析此数据包并获取其中的 ICMP信息。根据 IP 报头信息中的 IP 报 头长度字段,就可以得到 ICMP报文的真实地址。 ICMP数据包中的 IP 地址就是 活动主机的 IP 。代码如下:#define ICMP_MIN 8 /ICMP 报文头长度(最小 ICMP报文长度)#define MAX_PING_PACKET_SIZE (MAX_PACKET + SIZEOF(IPHeader)char *recvbuf=new charMAX_PING_PACKET_SIZE; /保证大与发送包的大小/from 是一个 sockaddr_in 数据结构,

17、用于保存响应的目的的主机的地址struct sockaddr_in from;int fromlen = sizeof(from);int bytes = recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(strucksockaddr* )& from),&fromlen);IpHeader *iphdr;IcmpHeader *icmphdr; unsigned short iphdrlen;iphdr=(Ipheader *)buf;iphdrlen = iphdr->headlen*4 ;/IP 报头的长度icmphdr=(Icmphea

18、der *)(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)<<end

19、l;4.5 、程序流程图以下分别是主一个用多线程实现的程序在课程设计过程的第三部分中给出, 程序流程图和子程序流程图 :Start_IP End_IP?Y Y创建一个线程并执行Start IP+N图 1 主程序流程图NY不是回送响应?图 2 子程序流程图六、程序运行结果七、课程设计小结这次课程设计是在毫无准备的尴尬情况下进行的, 在此之前, 虽然学习了许 多有关计算机网路以及通信原理的知识, 但是都是基于理论教学的。 至于将网络 协议应用到编程过程中, 这还是头一次, 因此在设计的过程中遇到许多难题。 在 阅读设计要求时, 一个概念困扰很久, 多线程编程在之前并没有接触过, 但是通 过网络查询

20、资料后得以理解其含义和作用。 在计算机中, 一个应用程序在运行状 态可以看做一个进程, 但是这就像做一项及其重要的过程是同一个道理, 在实际 生活中, 为了实现高效率的工作模式, 通常是多个人同时来完成一项工作, 或者 说是很多人做同一样事情, 结果是同样的时间可以实现大批量的工作。 在这个过 程当中,参与该事件的人都可以使用现有的资源, 这就是多线程共享进程资源的 原理。但是, 在计算机线程中有一种特殊的情况, 有的线程不能使用某些系统资 源,这就称作锁, 就好比有的线程将属于自己的系统资源上了一把锁, 不允许其 他线程使用这些资源。 总之,计算机多线程编程就是为了实现计算机快速、 高效 率

21、地执行程序。通过此次课程设计,我加深了对 ICMP协议的理解,巩固了课堂知识。由于 网络协议比较抽象、 难学, 自己学得也不够深入, 加上还要把所学知识运用到实 践中来,所以一开始时感觉比较困难, 而且在调试过程中难免要出现一些如变量 没有定义、缺少头文件、大小写错误以及其它问题,通过查阅文献资料、向同学 请教以及认真地思考与分析,逐一对错误进行了调试,才使得程序能正常运行, 大体上符合了设计的目的和要求。在程序的调试过程中,出现问题是正常的,关键是如何去发现问题的根源, 然后去解决它。 为了能够快速地确定错误的原因, 尽快的排除程序错误, 通常把 程序错误划分为三种类型:语法错误、运行错误和

22、逻辑错误。在设计过程中,我 们可以先找出问题, 看是属于哪一类错误, 然后再将问题一一解决, 这样既解决 了疑难问题又节省了不少时间。参考文献1 吴功宜, 胡晓英, 张仁, 何云, 王宁编著 . 计算机网络课程设计 . 北京:机 械工业出版社 , 2010.82 吴功宜著. 计算机网络 . 北京:清华大学出版社 , 20043 陈坚, 陈伟. Visual C+ 网络高级编程 M. 北京: 人民邮电出版社, 20014 郭国强 . 计算机网络与 Internet 教程. 北京: 清华出版社, 2006.115 杨丰瑞 , 杨丰任 . 实用教程最新计算机网络 . 北京 : 中国铁道出版社, 20

23、01.7附录 源代码#pragma pack(4) #pragma comment (lib,"Ws2_32.lib") #define WIN32_LEAN_AND_MEAN#include <winsock2.h>#include <stdio.h>#include <stdlib.h>#include <iostream.h>#include <stdio.h> #include <sys/timeb.h>#include <time.h>/IP 报头的数据结构typedef stru

24、ct icmphdrBYTE type; /ICMP BYTE code; / 子类型码,类型码,回送请求的类型码为 8 保存与特定 ICMP报文类型相关细节信息USHORT checksum; /USHORT id; /ICMP校验和报文 ID 号(一般用进程号作 ID )typedef struct iphdrunsigned int headlen:4;/IP头长度unsigned int version:4;/IP版本号unsigned char tos;/服务类型unsigned short totallen;/IP包总长度unsigned short id;/ID号unsigned

25、 short flag;/标记unsigned char ttl;/生存时间unsigned char prot;/协议( UDP TCP)unsigned short checksum;/校验和unsigned int sourceIP;/源 IPunsigned int destIP;/目的 IPIpHeader;/ICMP 头部的数据结构USHORT seg; /ICMP IcmpHeader;#define ICMP_RCHO 8 /#define DEF_PACKET_SIZE 32#define MAX_PACKET 1024#define ICMP_MIN 8 /ICMP#def

26、ine ICMP_RCHO_REPLY 0#define STATUS_FAILED 0xFFFF数据报的序列号请求回送/ 缺省数据报长度/ 最大数据块长度 报文头长度(最小 ICMP报文长度)#define MAX_PING_PACKET_SIZE (MAX_PACKET+sizeof(IpHeader) void fill_icmp_data(char *,int);USHORT checksum(USHORT *,int);void decode_resp(char *,int,struct sockaddr_in *);DWORD WINAPI FindIP(LPVOID pIPAdd

27、rTemp);WSADATA wsaData;SOCKET sockRaw;/为了实现发送 / 监听 ICMP报文,必须使用原始套接字,创建 原始套接字struct sockaddr_in dest,from,end;int fromlen =sizeof(from);/from 是一个 sockaddr_in 数据结构,用于保存 响应的目的的主机的地址char *recvbuf=new charMAX_PING_PACKET_SIZE;/ 保证大与发送包的大小 unsigned int addr=0;long ThreadNumCounter=0,ThreadNumLimit=20;long

28、 *aa=&ThreadNumCounter;void main(int argc,char *argv)if(WSAStartup(MAKEWORD(2,1),&wsaData)!=0)cout<<"WASStartup failed"<<GetLastError()<<endl; ExitProcess(STATUS_FAILED); sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_O VERLAPPED);if(sockRaw=INVAL

29、ID_SOCKET)cout<<"WASSocketet() falied"<<WSAGetLastError()<<endl; ExitProcess(STATUS_FAILED);int timeout=1000;int bread=setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(timeout);if(bread=SOCKET_ERROR)cout<<"FAILED TO SEY RECV TIMEOUT"&l

30、t;<WSAGetLastError()<<endl; ExitProcess(STATUS_FAILED); timeout=1000; bread=setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(timeout);if(bread=SOCKET_ERROR)cout<<"FAILED TO SEY RECV TIMEOUT"<<WSAGetLastError()<<endl; ExitProcess(STATUS_FAILED

31、); memset(&dest,0,sizeof(dest); unsigned long startIP,endIP;dest.sin_family=AF_INET; dest.sin_addr.s_addr=inet_addr(argv1);startIP=inet_addr(argv1); end.sin_family=AF_INET;end.sin_addr.s_addr=inet_addr(argv2); endIP=inet_addr(argv2);HANDLE hThread; while(htonl(startIP)<=htonl(endIP) if(Thread

32、NumCounter>ThreadNumLimit) Sleep(5000); continue;DWORD ThreadID;sockaddr_in *pIPAddrTemp=new (sockaddr_in); if(!pIPAddrTemp) cout<<"memory alloc failed"<<endl; return ;*pIPAddrTemp=dest; clock_t start; start=clock();hThread=CreateThread(NULL,NULL,FindIP,(LPVOID)pIPAddrTemp,N

33、ULL,&T hreadID);long i=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!=0)Sleep(2000);return;cout<<"error"<<endl;报文的填充设置类型 设置其 ID 号为

34、计算出数据报的void fill_icmp_data(char *icmp_data,int datasize)/ICMPIcmpHeader *icmp_hdr;char *datapart;icmp_hdr = (IcmpHeader*)icmp_data; icmp_hdr->type = ICMP_RCHO; / icmp_hdr->id = (USHORT)GetCurrentThreadId(); / 当前线程号datapart = icmp_data + sizeof(IcmpHeader); / 数据部分memset(datapart,'A',dat

35、asize-sizeof(IcmpHeader); / 填入数据 void decode_resp(char *buf,int bytes,struct sockaddr_in *from)IpHeader *iphdr;IcmpHeader *icmphdr;unsigned short iphdrlen;iphdr=(IpHeader*) buf;iphdrlen = iphdr->headlen*4 ; /IP icmphdr=(IcmpHeader *)(buf+iphdrlen); / if(bytes<iphdrlen+ICMP_MIN) return; /报头的长度

36、跳过 IP 报头 数据包太短,丢弃if(icmphdr->type!=ICMP_RCHO_REPLrYe)t urn;/ 不是回送响应( Ping应答),丢弃if(icmphdr->id!=(USHORT)GetCurrentThreadId() return; /Id 号 不相符,丢弃cout<<" 活动主机:"<<inet_ntoa(from->sin_addr)<<endl;/输出正在使用的 IP 地址cout<<" "<<inet_ntoa(from->sin_a

37、ddr)<<endl;USHORT checksum(USHORT *buffer,int size) / /计算校验和unsigned long cksum=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);DWORD WINAPI FindIP(LPVOID pIPAddrTemp)InterlockedIncrement(aa);char icmp_dataMAX_PACKET;/ICMP 数据报最大可能的长度 memset(icmp_data,0,MAX_PACKET); / 将数据报清空初始化

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论