Ping课程设计报告.docx
- 文档编号:30382290
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:17
- 大小:396.15KB
Ping课程设计报告.docx
《Ping课程设计报告.docx》由会员分享,可在线阅读,更多相关《Ping课程设计报告.docx(17页珍藏版)》请在冰豆网上搜索。
Ping课程设计报告
课程设计
课程名称_计算机网络
题目名称_PING程序设计
2012年12月25日
摘要
为了深入理解并全面掌握ping命令的使用,以下结合ping程序的原理对其功能进行了深入探讨.由此可见Internet中的某台主机能ping通并不能肯定该主机就能被访问,而ping不通也并不意味着就不能被访问,同时也发现ping命令对网络也存在一些安全隐患.在Window系统下使用Win32进行网络编程实现采用WSA通过IP/ICMP进行实现Ping目的主机的功能。
使用VisualStudio2008控制台进行建立的工程,使用WindowSocketAPI2版本。
自己定义IP、ICMP结构体,建立目的地址和原始套接字,调用Win32库函数进行发送、接收数据包。
采用ICMP的时间截请求和回答差错报文。
本设计包括了具体设计任务,基本思路及所涉及的相关理论,设计流程图,以及考虑到运行中会出现的一些异常处理。
关键词:
Window网络编程,Socket,TCP/IP,ICMP报文
目录
一、实验目的5
二、实验内容和要求5
1、RAW模式的SOCKET编程3
2、具体内容3
三、实验主要仪器设备和材料3
四、实验方法及原理3
1.ICMP报文组成结构:
6
2.RAW模式的SOCKET编程实现Ping的具体原理4
2.1创建原始套接字4
2.2设置套接字选项5
2.3创建并填充相应协议头5
五、实验流程图6
六、实验具体步骤6
1.定义IP结构体7
2.定义ICMP结构体7
3.定义目的地址7
4.定义原始套接字7
5.发送数据包7
6.接收数据包7
7.解析数据包8
8.校验和的实现8
9.打印相关信息8
10.循环工作实现块8
11.信息统计8
12.相关异常处理9
13.相关引用到的头文件及宏11
七、实验测试结果以及使用说明11
八、参考文献13
九、附录:
源代码14
一、实验目的
PING程序是我们使用的比较多的用于测试网络连通性的程序。
PING程序基于ICMP,使用ICMP的回送请求和回送应答来工作。
由计算机网络课程知道,ICMP是基于IP的一个协议,ICMP包通过IP的封装之后传递。
课程设计中选取PING程序的设计,其目的是希望同学们通过PING程序的设计,能初步掌握TCP/IP网络协议的基本实现方法,对网络的实现机制有进一步的认识。
二、实验内容和要求
1、RAW模式的SOCKET编程
PING程序是面向用户的应用程序,该程序使用ICMP的封装机制,通过IP协议来工作。
为了实现直接对IP和ICMP包进行操作,实验中使用RAW模式的SOCKET编程。
熟悉SOCKET的编程,包括基本的系统调用如SOCKET、BIND等;
2、具体内容
1)定义数据结构
需要定义好IP数据报、ICMP包等相关的数据结构;
2)程序实现
在WINDOWS环境下实现PING程序;
3)程序要求
在命令提示符下输入:
PINGΧΧΧ.ΧΧΧ.ΧΧΧ.ΧΧΧ
其中ΧΧΧ为目的主机的IP地址,不要求支持域名,对是否带有开关变量也不做要求。
不带开关变量时,要求返回4次响应。
返回信息的格式:
REPLYFROMΧΧΧ.ΧΧΧ.ΧΧΧ.ΧΧΧ
或
REQUESTTimeOut(无法PING通的情况)。
三、实验主要仪器设备和材料
联网Win7操作系统计算机、VisualStudio2008Win32控制台程序
四、实验方法及原理
ping的原理:
Ping命令的主要作用是检测网络上主机的状态。
要是在几年前,我们还可以下如此断言,如果不能Ping通某台主机,那么也就无法Telnet或者FTP到这台主机,但随着互联网的安全意识的增加,出现了访问控制清单的路由器和防火墙,由于ICMP报文是在IP数据包中被传输的,而到达一台主机不仅取决于IP层是否到达,还取决于使用何种协议和端口。
譬如金山公司的金山网镖就可以禁止其他机器Ping通这台主机。
所以在现在的情况下,即时Ping不通某台机器,但也有可能FTP登陆到这台机器,或者通过HTTP来浏览这台机器上的Web页面
1.ICMP报文组成结构:
在网络中,一般用ICMP来传递差错报文以及其他应注意的信息.ICMP一般被认为是和IP协议同一层的协议,IMCP报文通常被IP层或者更高层的协议(如:
TCP或者UDP)使用,ICMP对于互联网以及其他基于IP协议的网络的正常运行起着非常重要的作用.有许多重要的网络程序都是基于ICMP协议上的,最为著名如Ping和Tracert等.
2.RAW模式的SOCKET编程实现Ping的具体原理
其中PING程序设计使用了RAW模式的SOCKET编程,程序使用ICMP的封装机制,通过IP协议来工作。
2.1创建原始套接字
要使用原始套接字,必须经过创建原始套接字、设置套接字选项和创建并填充相应协议头这三个步骤,然后用send、WSASend函数将组装好的数据发送出去。
接收的过程也很相似,只是需要用recv或WSARecv函数接收数据。
我们可以用socket或WSASocket函数来创建原始套接字,因为原始套接字能直接控制底层协议,因此只有属于“管理员”组的成员,才有权创建原始套接字。
下面是用socket函数创建原始套接字的代码。
SOCKETsock;
Sock=socket(AF_INET,SOCK_RAW,IPPROTO_UDP);
上述创建原始套接字的代码使用的是UDP协议,如果要使用其它的协议,比如ICMP、IGMP、IP等协议,只需要把相应的参数改为IPPROTO_ICM、IPPROTO_IGMP、IPPROTO_IP就可以了。
另外,IPPROTO_UDP、IPPROTO_IP、IPPROTO_RAW这几个协议标志要求使用套接字选项IP_HDRINCL,而目前只有Windows2000和WindowsXP提供了对IP_HDRINCL的支持,这意味着在Windows2000以下平台创建原始套接字时是不能使用IP、UDP、TCP协议的。
2.2设置套接字选项
创建了原始套接字后,就要设置套接字选项,这要通过setsocketopt函数来实现,setsocketopt函数的声明如下:
intsetsocketopt(
SOCKETs,
intlevel,
intoptname,
constcharFAR*optval,
intoptlen);
在该声明中,参数s是标识套接口的描述字,要注意的是选项对这个套接字必须是有效的。
参数Level表明选项定义的层次,对TCP/IP协议族而言,支持SOL_SOCKET、IPPROTO_IP和IPPROTO_CP层次。
参数Optname是需要设置的选项名,这些选项名是在Winsock头文件内定义的常数值。
参数optval是一个指针,它指向存放选项值的缓冲区。
参数optlen指示optval缓冲区的长度
2.3创建并填充相应协议头
这一步就是创建IP和TCP协议头的数据结构,根据相关协议的定义进行编写即可,下面是一个TCP协议头的数据结构。
发送接收数据包的实现原理:
Sendto()-使用指定的SocketFlags,将指定字节数的数据发送到指定的终结点。
适用于已连接的数据报或流式套接口发送数据。
对于数据报类套接口,必需注意发送数据长度不应超过通讯子网的IP包最大长度。
IP包最大长度在WSAStartup()调用返回的WSAData的iMaxUdpDg元素中。
如果数据太长无法自动通过下层协议,则返回WSAEMSGSIZE错误,数据不会被发送。
请注意成功地完成sendto()调用并不意味着数据传送到达。
endto()函数主要用于SOCK_DGRAM类型套接口向to参数指定端的套接口发送数据报。
对于SOCK_STREAM类型套接口,to和tolen参数被忽略;这种情况下sendto()等价于send()。
为了发送广播数据(仅适用于SOCK_DGRAM),in参数所含地址应该把特定的IP地址INADDR_BROADCAST(winsock.h中有定义)和终端地址结合起来构造。
通常建议一个广播数据报的大小不要大到以致产生碎片,也就是说数据报的数据部分(包括头)不超过512字节。
如果传送系统的缓冲区空间不够保存需传送的数据,除非套接口处于非阻塞I/O方式,否则sendto()将阻塞。
对于非阻塞SOCK_STREAM类型的套接口,实际写的数据数目可能在1到所需大小之间,其值取决于本地和远端主机的缓冲区大小。
可用select()调用来确定何时能够进一步发送数据。
Recvfrom()-接收一个数据报并保存源地址。
对于SOCK_STREAM类型的套接口,最多可接收缓冲区大小个数据。
如果套接口被设置为线内接收带外数据(选项为SO_OOBINLINE),且有带外数据未读入,则返回带外数据。
应用程序可通过调用ioctlsocket()的SOCATMARK命令来确定是否有带外数据待读入。
对于SOCK_STREAM类型套接口,忽略from和fromlen参数。
对于数据报类套接口,队列中第一个数据报中的数据被解包,但最多不超过缓冲区的大小。
如果数据报大于缓冲区,那么缓冲区中只有数据报的前面部分,其他的数据都丢失了,并且recvfrom()函数返回WSAEMSGSIZE错误。
若from非零,且套接口为SOCK_DGRAM类型,则发送数据源的地址被复制到相应的sockaddr结构中。
fromlen所指向的值初始化时为这个结构的大小,当调用返回时按实际地址所占的空间进行修改。
如果没有数据待读,那么除非是非阻塞模式,不然的话套接口将一直等待数据的到来,此时将返回SOCKET_ERROR错误,错误代码是WSAEWOULDBLOCK。
用select()或WSAAsynSelect()可以获知何时数据到达。
如果套接口为SOCK_STREAM类型,并且远端“优雅”地中止了连接,那么recvfrom()一个数据也不读取,立即返回。
如果立即被强制中止,那么recv()将以WSAECONNRESET错误失败返回。
五、实验流程图
--另付图
六、实验具体步骤
1.定义IP结构体
//IP格式
typedefstructiph{
UCHARiph_VerLen;//版本-4byte
UCHARip_TOS;//区分服务-8byte
USHORTip_Length;//首部长度-4byte
USHORTip_ID;//标识-16byte
USHORTip_Flags;//标志-3byte
UCHARip_TTL;
//生存数据(数据报在网络上的存活时间,每通过一个路//由器,该数值减一
UCHARip_Protacol;
//协议(TCP/IP协议类型,比如:
ICMP为,IGMP为,TCP为,UDP为等)
USHORTip_Checksum;//头部检验和
ULONGip_Source;//源IP地址
ULONGip_Destination;//目的IP地址
}IPHDR;
2.定义ICMP结构体
//ICMP格式
typedefstructicmph{
unsignedcharicmp_Type;//类型-8byte
unsignedcharicmp_Code;//代码-16byte
unsignedshorticmp_Checksum;//检验和-16byte
unsignedshorticmp_Id;//识别号
unsignedshorticmp_Sequence;//报文序列号
unsignedlongicmp_Timestamp;//时间截
}ICMPHDR,*PICMPHDR;
3.定义目的地址
//目标主机地址
SOCKADDR_INaddrdest;
addrdest.sin_family=AF_INET;
//是地址家族,AF_INET,代表TCP/IP协议族
addrdest.sin_addr.S_un.S_addr=inet_addr(ip);
//存储IP地址,使用in_addr这个数据结
addrdest.sin_port=htons(0);
//存储端口号(使用网络字节顺序)
4.定义原始套接字
SOCKETsk=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);/
/使用RAWsocket模式。
ICMP协议
5.发送数据包
result=sendto(sk,sendbuf,sizeof(ICMPHDR)+DATA_SIZE,0,(SOCKADDR*)&addrdest,sizeof(SOCKADDR));
6.接收数据包
result=recvfrom(sk,recvbuf,RECV_MAX_SZIE,0,(SOCKADDR*)&addrfrom,&len)
7.解析数据包
IPHDR*pIP=(IPHDR*)recvbuf;
PICMPHDRp=(PICMPHDR)(recvbuf+sizeof(IPHDR));
8.校验和的实现
USHORTCheckSum(USHORT*buffer,intsize){
USHORTchecksum=0;
while(size>1){
checksum+=*buffer++;
size-=sizeof(SHORT);
}
if(size){
checksum+=*buffer++;
}
//进行校验
checksum=(checksum>>16)+(checksum&0xffff);
checksum+=(checksum>>16);
return(SHORT)(~checksum);
}
9.打印相关信息
目的地址:
cout<<"-"<<"来自:
"< 接收字节: cout<<"的回复: "<<"字节="< 时间截: cout<<"时间="< 数据包生存数据: cout<<"TTL="< 10.循环工作实现块 Ping多次或者无穷次运行的实现 while(a||count--){} 当a==true进行无穷次Ping 当count数字不为默认或者为默认(4次)进行自减,count==-1就退出 当Ping完结束后没有关闭程序,而是现实欢迎使用页面 While(true){/*Ping的程序*/} 11.信息统计 //统计信息 intgetData=0;//获取到数据包个数 intloseData=0;//丢失数据包的个数 intsetData=count;//发送数据包的个数 intmaxTime=0;//最大时间截 intminTime=0;//最小时间截 intaverage=0;//平均时间截 11.1获取到的数据包个数统计 if(DATA_SIZE! =NULL) getData++; 11.2时间截的统计 //往返估计时间 if(maxTime maxTime=nTick-p->icmp_Timestamp; else{ if(minTime==0) minTime=nTick-p->icmp_Timestamp; if(minTime>nTick-p->icmp_Timestamp) minTime=nTick-p->icmp_Timestamp; } 11.3丢失的数据包个数 loseData=setData-getData; 12.相关异常处理 12.1WSA的版本测试 if(LOBYTE(data.wVersion)! =2||HIBYTE(data.wVersion)! =2) { cout<<"WindowsSOCKET初始化失败! "< WSACleanup(); return0; } 12.2设置发送超时 if(SOCKET_ERROR==rst) { cout<<"设置SOCKET初始化出错! 发送超时,请检查! "< closesocket(sk); WSACleanup(); return-1; } 12.3设置接收超时 rst=setsockopt(sk,SOL_SOCKET,SO_RCVTIMEO,(char*)&outTime,sizeof(int)); if(SOCKET_ERROR==rst) { cout<<"设置SOCKET初始化出错! 接收超时,请检查! "< closesocket(sk); WSACleanup(); return-1;} 12.4向目的地址发送数据包异常 if(SOCKET_ERROR==result){ if(WSAETIMEDOUT==WSAGetLastError()){ cout<<": "<<"发送超时! "< continue; } else{ cout<<": "<<"发送出错! "< closesocket(sk); WSACleanup(); return-1; } } 12.5接收数据包过程异常 if(SOCKET_ERROR==result) {if(WSAETIMEDOUT==GetLastError()){ cout<<": "<<"接收超时! "< continue; } else{ cout<<": "<<"接收出错! "< closesocket(sk); WSACleanup(); return-1;}} 12.6接收到的数据包异常 if(result { cout<<": "<<"接收到数据包大小不对! "< } if(p->icmp_Type! =0) { cout<<": "<<"ICMP的类型: "< return-1; } if(p->icmp_Id! =(USHORT): : GetCurrentProcessId()) { cout<<": "<<"ICMP的ID出错! "< return-1; } 13.相关引用到的头文件及宏 #include"stdafx.h" #include #include #include #include #include usingnamespacestd; #pragmacomment(lib,"ws2_32.lib") #defineDATA_SIZE32 #defineRECV_MAX_SZIE1024 七、实验测试结果以及使用说明 1.运行程序如图: 2.1根据提示输入IP地址,输入“-d”为默认Ping4次, 2.2输入“-n”为Ping无穷次: 2.3可以自定义Ping次数: 3..查看统计Ping的信息 详细请运行查看结果 八、课程设计心得 经过实现Ping程序,熟悉了IP、ICMP等,掌握TCP/IP网络协议的基本实现方法。 也熟悉了Window网络编程的技术。 能熟悉地使用套接字进行网络通信。 熟悉了数据通信的网络技术,同时学会了跟同学合作交流完成项目的讨论方法和解决问题的能力。 学会如果通过讨论、交流、找资料来独立解决所遇到的问题和不懂。 更多地锻炼了独立解决问题的能力。 九、参考文献 [1]谢希仁计算机网络[M].北京: 电子工业出版社第5版2012年P108~P144 [2]孙鑫VC++深入详解[M].北京: 电子工业出版社2007年P523~P556 [3]谭浩强C++程序设计[M].北京: 清华大学出版社,2004,6 [4]尤文坚利用RAWSOCKET捕获网络底层数据包的方法[J]编程技巧2007年第11期(总第108期) 一十、附录: 源代码 -另付光碟
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Ping 课程设计 报告