计算机网络课程设计基于ICMP的PING设计.docx
《计算机网络课程设计基于ICMP的PING设计.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计基于ICMP的PING设计.docx(22页珍藏版)》请在冰点文库上搜索。
![计算机网络课程设计基于ICMP的PING设计.docx](https://file1.bingdoc.com/fileroot1/2023-8/13/a6cd58cb-3ec7-4952-afab-2c6c3da14664/a6cd58cb-3ec7-4952-afab-2c6c3da146641.gif)
计算机网络课程设计基于ICMP的PING设计
编程实现基于ICMP的PING
摘要本次课程设计主要是基于Linux系统,使用编程语言C语言,编写一个实验程序,实现基于ICMP报文的PING的类似功能。
本文主要介绍了ICMP报文,PING功能的相关原理,根据设计要求,用C语言编程运行、仿真,通过观察实验结果,从而判定本次设计成功完成任务。
通过这次计算机网络方面的课程设计,提高了我们对网络领域的认识,有利于培养我们在该方面的设计能力。
一人一题特别有利于锻炼我们独立分析问题和解决问题的能力。
设计过程的复杂加老师的严格要求有益于培养我们严谨的工作作风。
关键词Linux;C语言;ICMP;PING
ProgrammingPINGcapabilitiesbasedonICMPprotocol
AbstractThecurriculumdesignismainlybasedontheLinuxsystem,usetheprogramminglanguageClanguage,writeatestprogram,packet-basedICMPPINGsimilarfunction.ThispaperdescribestheICMPmessage,PINGfunctionofrelevantprinciples,accordingtodesignrequirements,theCprogramminglanguagetorunthesimulation,byobservingtheresults,whichdeterminethesuccessofthisdesigntask.Throughthiscomputernetworkdesignaspectsofthecurriculum,improveourknowledgeinthefieldofnetworking,helpingtotrainusinthataspectofthedesigncapacity.Oneperson,oneproblemisparticularlyconducivetoexerciseourindependentanalysisofissuesandproblem-solvingability.Thecomplexityofthedesignprocessincreasesthestringentrequirementsofteachertrainingbenefitourstrictstyleofwork
KeywordsLinux;Clanguage;ICMP;PING
1引言
当现代社会逐渐变为具有高度的相互依赖的巨大网络时,我们所生活的世界无法不变成一个被计算机网络紧密联结起来的世界。
计算机网络从技术角度来说,是作为一种布局,将经有关联但相距遥远的事物通过通信线路连接起来,但是对网络的思考决不是传统的二维平面思维甚至三维的球面思维所能达到的。
在信息时代,网络的生命在于其安全性和可靠性。
计算机网络最重要的方面是它向用户所提供的信息服务及其所拥有的信息资源,网络连接在给用户带来方便的同时,也给网络入侵者带来了方便。
因此,未来的计算机网络应该具有很高的安全性和可靠性,可以抵御高智商的网络入侵者,使用户更加可靠、更加方便地拥有大量各式各样的个性化客户服务。
1.1课程设计的目的
本次设计的目的就是在掌握计算机网络理论的基础上,了解网络技术,掌握网络相关设计方法和思想,通过本次课程设计,达到巩固和综合运用计算机网络原理的知识,理论联系实际,巩固所学理论知识,并且提高自己通过所学理论分析、解决计算机实际问题的能力。
掌握计算机网络课程的知识可使学生打下一个坚实的专业基础,可提高处理通信系统问题能力和素质。
由于通信工程专业理论深、实践性强,做好课程设计,对学生掌握本专业的知识、提高其基本能力是非常重要的。
本次设计的目的也是为了学生加深对所学计算机网络知识的理解,培养学生专业素质,提高利用计算机网络知识处理通信系统问题的能力,为今后的专业课程的学习、毕业设计和工作打下良好的基础。
使学生能比较扎实地掌握本专业的基础知识和基本理论。
本次课程设计主要是基于Linux系统,使用编程语言C语言,编写一个实验程序,实现基于ICMP报文的PING的类似功能。
本文主要介绍了ICMP报文,PING功能的相关原理,根据设计要求,用C语言编程运行、仿真,通过观察实验结果,从而判定本次设计成功完成任务。
通过这次计算机网络方面的课程设计,提高了我们对网络领域的认识,有利于培养我们在该方面的设计能力。
一人一题特别有利于锻炼我们独立分析问题和解决问题的能力。
设计过程的复杂加老师的严格要求有益于培养我们严谨的工作作风。
1.2课程设计的主要任务和要求
课程设计的主要任务
编程实现PING的服务器端和客户端,实现操作系统提供的ping命令的类似功能。
服务器端PingServer功能:
可以并发地为多个用户服务;
显示用户通过客户端发送来的消息内容(包含头部和payload);
能够模拟分组的丢失;能够模拟分组传输延迟;
将用户发送来的请求request在延迟一段随机选择的时间(小于1s)后返回给客户端,作为收到请求的响应reply;
通过如下命令行启动服务器:
javaPingServerport。
port为PingServer的工作端口号
客户端PingClient功能:
启动后发送10个request。
发送一个request后,最多等待1秒以便接收PingServer返回的reply消息。
如果在该时间内没有收到服务器的reply,则认为该请求或对该请求的reply已经丢失;在收到reply后立即发送下一个request。
请求消息的payload中至少包含关键字PingUDP、序号、时间戳等内容。
如:
PingUDPSequenceNumberTimeStampCRLF
其中:
CRLF表示回车换行符(0X0D0A);TimeStamp为发送该消息的机器时间。
为每个请求计算折返时间(RTT),统计10个请求的平均RTT、最大/小RTT。
通过如下命令行启动:
javaPingClienthostport。
host为PingServer所在的主机地址;port为PingServer的工作端口号
课程设计的要求:
(1)按要求编写课程设计报告书,能正确阐述设计结果。
(2)通过课程设计培养学生严谨的科学态度,认真的工作作风和团队协作精神。
(3)学会文献检索的基本方法和综合运用文献的能力。
(4)在老师的指导下,要求每个学生独立完成课程设计的全部内容。
2理论基础
2.1ICMP相关介绍
ICMP是(InternetControlMessageProtocol)Internet控制报文协议。
它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。
控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。
这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
ICMP协议是一种面向无连接的协议,用于传输出错报告控制信息。
它是一个非常重要的协议,它对于网络安全具有极其重要的意义。
它是TCP/IP协议族的一个子协议,属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。
当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。
ICMP提供一致易懂的出错报告信息。
发送的出错报文返回到发送原数据的设备,因为只有发送设备才是出错报文的逻辑接受者。
发送设备随后可根据ICMP报文确定发生错误的类型,并确定如何才能更好地重发失败的数据报。
但是ICMP唯一的功能是报告问题而不是纠正错误,纠正错误的任务由发送方完成。
我们在网络中经常会使用到ICMP协议,比如我们经常使用的用于检查网络通不通的Ping命令(Linux和Windows中均有),这个“Ping”的过程实际上就是ICMP协议工作的过程。
还有其他的网络命令如跟踪路由的Tracert命令也是基于ICMP协议的。
ICMP协议对于网络安全具有极其重要的意义。
ICMP协议本身的特点决定了它非常容易被用于攻击网络上的路由器和主机。
例如,在1999年8月海信集团“悬赏”50万元人民币测试防火墙的过程中,其防火墙遭受到的ICMP攻击达334050次之多,占整个攻击总数的90%以上!
可见,ICMP的重要性绝不可以忽视!
比如,可以利用操作系统规定的ICMP数据包最大尺寸不超过64KB这一规定,向主机发起“PingofDeath”(死亡之Ping)攻击。
“PingofDeath”攻击的原理是:
如果ICMP数据包的尺寸超过64KB上限时,主机就会出现内存分配错误,导致TCP/IP堆栈崩溃,致使主机死机。
(现在的操作系统已经取消了发送ICMP数据包的大小的限制,解决了这个漏洞)
此外,向目标主机长时间、连续、大量地发送ICMP数据包,也会最终使系统瘫痪。
大量的ICMP数据包会形成“ICMP风暴”,使得目标主机耗费大量的CPU资源处理,疲于奔命。
2.2PING相关介绍
Ping是Windows系列自带的一个可执行命令。
利用它可以检查网络是否能够连通,用好它可以很好地帮助我们分析判定网络故障。
应用格式:
PingIP地址。
该命令还可以加许多参数使用,PING是DOS命令,一般用于检测网络通与不通,也叫时延,其值越大,速度越慢。
PING(PacketInternetGrope),因特网包探索器,用于测试网络连接量的程序。
Ping发送一个ICMP回声请求消息给目的地并报告是否收到所希望的ICMP回声应答。
它是用来检查网络是否通畅或者网络连接速度的命令。
作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的:
利用网络上机器IP地址的唯一性,给目标IP地址发送一个数据包,再要求对方返回一个同样大小的数据包来确定两台网络机器是否连接相通,时延是多少?
ping指的是端对端连通,通常用来作为可用性的检查,但是某些病毒木马会强行大量远程执行ping命令抢占你的网络资源,导致系统变慢,网速变慢。
严禁ping入侵作为大多数防火墙的一个基本功能提供给用户进行选择。
通常的情况下你如果不用作服务器或者进行网络测试,可以放心的选中它,保护你的电脑。
简单的说,Ping就是一个测试程序,如果Ping运行正确,你大体上就可以排除网络访问层、网卡、MODEM的输入输出线路、电缆和路由器等存在的故障,从而减小了问题的范围。
但由于可以自定义所发数据报的大小及无休止的高速发送,Ping也被某些别有用心的人作为DDOS(拒绝服务攻击)的工具,曾经Yahoo就是被黑客利用数百台可以高速接入互联网的电脑连续发送大量Ping数据包而瘫痪的。
按照缺省设置,Windows上运行的Ping命令发送4个ICMP(网间控制报文协议)回送请求,每个32字节数据,如果一切正常,你应能得到4个回送应答。
Ping能够以毫秒为单位显示发送回送请求到返回回送应答之间的时间量。
如果应答时间短,表示数据报不必通过太多的路由器或网络连接速度比较快。
Ping还能显示TTL(TimeToLive存在时间)值,你可以通过TTL值推算一下数据包已经通过了多少个路由器:
源地点TTL起始值(就是比返回TTL略大的一个2的乘方数)-返回时TTL值。
例如,返回TTL值为119,那么可以推算数据报离开源地址的TTL起始值为128,而源地点到目标地点要通过9个路由器网段(128-119);如果返回TTL值为246,TTL起始值就是256,源地点到目标地点要通过9个路由器网段。
通过Ping检测网络故障的典型次序。
正常情况下,当你使用Ping命令来查找问题所在或检验网络运行情况时,你需要使用许多Ping命令,如果所有都运行正确,你就可以相信基本的连通性和配置参数没有问题;如果某些Ping命令出现运行故障,它也可以指明到何处去查找问题。
下面就给出一个典型的检测次序及对应的可能故障:
ping127.0.0.1--这个Ping命令被送到本地计算机的IP软件,该命令永不退出该计算机。
如果没有做到这一点,就表示TCP/IP的安装或运行存在某些最基本的问题。
ping本机IP--这个命令被送到你计算机所配置的IP地址,你的计算机始终都应该对该Ping命令作出应答,如果没有,则表示本地配置或安装存在问题。
出现此问题时,局域网用户请断开网络电缆,然后重新发送该命令。
如果网线断开后本命令正确,则表示另一台计算机可能配置了相同的IP地址。
ping局域网内其他IP--这个命令应该离开你的计算机,经过网卡及网络电缆到达其他计算机,再返回。
收到回送应答表明本地网络中的网卡和载体运行正确。
但如果收到0个回送应答,那么表示子网掩码(进行子网分割时,将IP地址的网络部分与主机部分分开的代码)不正确或网卡配置错误或电缆系统有问题。
ping网关IP--这个命令如果应答正确,表示局域网中的网关路由器正在运行并能够作出应答。
3结构定义与程序设计
3.1IP首部结构与程序定义
由于IP层协议是一种点对点的协议,而非端对端的协议,它提供无连接的数据报服务,没有端口的概念,因此很少使用bind()和connect()函数,若有使用也只是用于设置IP地址。
发送数据使用sendto()函数,接收数据使用recvfrom()函数。
IP报头格式如图3-1所示:
版本号
IP报头长度IHL
服务类型TOS
数据报长度TL
报文标志ID
报文标志F
分段偏移量FO
生存时间TTL
协议号PORT
报头校验和
源地址
目标地址
任选项和填充位
图3-1IP报头格式
在Linux中,IP报头格式数据结构()定义如下:
structip
{
#if__BYTE_ORDER==__LITTLE_ENDIAN
unsignedintip_hl:
4;/*headerlength*/
unsignedintip_v:
4;/*version*/
#endif
#if__BYTE_ORDER==__BIG_ENDIAN
unsignedintip_v:
4;/*version*/
unsignedintip_hl:
4;/*headerlength*/
#endif
u_int8_tip_tos;/*typeofservice*/
u_shortip_len;/*totallength*/
u_shortip_id;/*identification*/
u_shortip_off;/*fragmentoffsetfield*/
#defineIP_RF0x8000/*reservedfragmentflag*/
#defineIP_DF0x4000/*dontfragmentflag*/
#defineIP_MF0x2000/*morefragmentsflag*/
#defineIP_OFFMASK0x1fff/*maskforfragmentingbits*/
u_int8_tip_ttl;/*timetolive*/
u_int8_tip_p;/*protocol*/
u_shortip_sum;/*checksum*/
structin_addrip_src,ip_dst;/*sourceanddestaddress*/
};
其中ping程序只使用以下数据:
IP报头长度IHL(InternetHeaderLength)以4字节为一个单位来记录IP报头的长度,是上述IP数据结构的ip_hl变量。
生存时间TTL(TimeToLive)以秒为单位,指出IP数据报能在网络上停留的最长时间,其值由发送方设定,并在经过路由的每一个节点时减一,当该值为0时,数据报将被丢弃,是上述IP数据结构的ip_ttl变量。
3.2ICMP首部结构与程序定义
ICMP报文分为两种,一是错误报告报文,二是查询报文。
每个ICMP报头均包含类型、编码和校验和这三项内容,长度为8位,8位和16位,其余选项则随ICMP的功能不同而不同。
Ping命令只使用众多ICMP报文中的两种:
"请求回送'(ICMP_ECHO)和"请求回应'(ICMP_ECHOREPLY)。
在Linux中定义如下:
#defineICMP_ECHO0
#defineICMP_ECHOREPLY8
这两种ICMP类型报头格式如图3-2所示:
类型TYPE(8或0)
编码CODE(未使用)
校验和CHECKSUM
标志符Identifier
顺序号SequenceNO
图3-2ICMP类型报头格式
在Linux中ICMP数据结构()定义如下:
structicmp
{
u_int8_ticmp_type;/*typeofmessage,seebelow*/
u_int8_ticmp_code;/*typesubcode*/
u_int16_ticmp_cksum;/*onescomplementchecksumofstruct*/
union
{
u_charih_pptr;/*ICMP_PARAMPROB*/
structin_addrih_gwaddr;/*gatewayaddress*/
structih_idseq/*echodatagram*/
{
u_int16_ticd_id;
u_int16_ticd_seq;
}ih_idseq;
u_int32_tih_void;
/*ICMP_UNREACH_NEEDFRAG--PathMTUDiscovery(RFC1191)*/
structih_pmtu
{
u_int16_tipm_void;
u_int16_tipm_nextmtu;
}ih_pmtu;
structih_rtradv
{
u_int8_tirt_num_addrs;
u_int8_tirt_wpa;
u_int16_tirt_lifetime;
}ih_rtradv;
}icmp_hun;
#defineicmp_pptricmp_hun.ih_pptr
#defineicmp_gwaddricmp_hun.ih_gwaddr
#defineicmp_idicmp_hun.ih_idseq.icd_id
#defineicmp_seqicmp_hun.ih_idseq.icd_seq
#defineicmp_voidicmp_hun.ih_void
#defineicmp_pmvoidicmp_hun.ih_pmtu.ipm_void
#defineicmp_nextmtuicmp_hun.ih_pmtu.ipm_nextmtu
#defineicmp_num_addrsicmp_hun.ih_rtradv.irt_num_addrs
#defineicmp_wpaicmp_hun.ih_rtradv.irt_wpa
#defineicmp_lifetimeicmp_hun.ih_rtradv.irt_lifetime
Union
{
struct
{
u_int32_tits_otime;
u_int32_tits_rtime;
u_int32_tits_ttime;
}id_ts;
struct
{
structipidi_ip;
/*optionsandthen64bitsofdata*/
}id_ip;
structicmp_ra_addrid_radv;
u_int32_tid_mask;
u_int8_tid_data[1];
}icmp_dun;
#defineicmp_otimeicmp_dun.id_ts.its_otime
#defineicmp_rtimeicmp_dun.id_ts.its_rtime
#defineicmp_ttimeicmp_dun.id_ts.its_ttime
#defineicmp_ipicmp_dun.id_ip.idi_ip
#defineicmp_radvicmp_dun.id_radv
#defineicmp_maskicmp_dun.id_mask
#defineicmp_dataicmp_dun.id_data
};
使用宏定义令表达更简洁,其中ICMP报头为8字节,数据报长度最大为64K字节。
(1)校验和算法:
这一算法称为网际校验和算法,把被校验的数据16位进行累加,然后取反码,若数据字节长度为奇数,则数据尾部补一个字节的0以凑成偶数。
此算法适用于IPv4、ICMPv4、IGMPV4、ICMPv6、UDP和TCP校验和,更详细的信息请参考RFC1071,校验和字段为上述ICMP数据结构的icmp_cksum变量。
(2)标识符:
用于唯一标识ICMP报文,为上述ICMP数据结构的icmp_id宏所指的变量。
(3)顺序号:
ping命令的icmp_seq便由这里读出,代表ICMP报文的发送顺序,为上述ICMP数据结构的icmp_seq宏所指的变量。
ICMP数据报
Ping命令中需要显示的信息,包括icmp_seq和ttl都已有实现的办法,但还缺rtt往返时间。
为了实现这一功能,可利用ICMP数据报携带一个时间戳。
使用以下函数生成时间戳:
#include
intgettimeofday(structtimeval*tp,void*tzp)
其中timeval结构如下:
structtimeval{
longtv_sec;
longtv_usec;
}
4程序设计与验证
4.1程序设计流程
根据课程设计的要求,结合程序设计流程,本次设计按如下流程进行,如图4-1所示。
开始
功能分析
程序设计
程序校验
通过
结束
Y
N
图4-1程序设计流程图
4.2程序验证结果
图4-2程序验证截图
5小结
本次课程设计主要是基于Linux系统,使用编程语言C语言,编写一个实验程序,实现基于ICMP报文的PING的类似功能。
本文主要介绍了ICMP报文,PING功能的相关原理,根据设计要求,用C语言编程运行、仿真,通过观察实验结果,从而判定本次设计成功完成任务。
通过这次计算机网络方面的课程设计,提高了我们对网络