ping原理及应用
——ICMP和PING(来源于《TCP/IP详解一》)
ICMP协议(Internet控制报文协议)
ICMP经常被认为是IP层的一个组成部分。它传递差错报文以及其他需要注意的信息。
ICMP报文通常被IP层或更高层协议( T C P或U D P)使用。一些ICMP报文把差错报文返回给用户进程。
ICMP报文的类型
各种类型的ICMP报文如图6-3所示,不同类型由报文中的类型字段和代码字段来共同决定。图中的最后两列表明ICMP报文是一份查询报文还是一份差错报文。因为对ICMP差错报文有时需要作特殊处理,因此我们需要对它们进行区分。例如,在对ICMP差错报文进行响应时,永远不会生成另一份ICMP差错报文(如果没有这个限制规则,可能会遇到一个差错产生另一个差错的情况,而差错再产生差错,这样会无休止地循环下去)。
当发送一份ICMP差错报文时,报文始终包含IP的首部和产生ICMP差错报文的IP数据报的前8个字节。这样,接收ICMP差错报文的模块就会把它与某个特定的协议(根据IP数据报首部中的协议字段来判断)和用户进程(根据包含在IP数据报前8个字节中的T C P或U D P报文首部中的T C P或U D P端口号来判断)联系起来。
ping的作用
Ping的用途就是用来检测网络的连通情况和分析网络速度,但它是通过什么来显示连通呢?这首先要了解Ping的一些参数和返回信息。
WINXP系统下PING
ping [-t] [-a] [-n count] [-l length] [-f] [-i ttl] [-v tos] [-r count] [-s count] [-j computer-list] | [-k computer-list] [-w timeout] destination-list
-t 参数
Ping 指定的计算机直到中断。
-a
将地址解析为计算机名。
-n count
发送 count 指定的 ECHO 数据包数。默认值为 4。
-l length
发送包含由 length 指定的数据量的 ECHO 数据包。默认为 32 字节;最大值是65,527。
-f
在数据包中发送"不要分段"标志。数据包就不会被路由上的网关分段。
-i TTL Time To Live.
将"生存时间"字段设置为 ttl 指定的值。
指定TTL值在对方的系统里停留的时间。
此参数同样是帮助你检查网络运转情况的。
-v tos
将"服务类型"字段设置为 tos 指定的值。
-r count
在"记录路由"字段中记录传出和返回数据包的路由。count 可以指定最少 1 台,最多 9 台计算机。
-s count
指定 count 指定的跃点数的时间戳。
-j computer-list
利用 computer-list 指定的计算机列表路由数据包。连续计算机可以被中间网关分隔(路由稀疏源) IP 允许的最大数量为 9。
-k computer-list
利用 computer-list 指定的计算机列表路由数据包。连续计算机不能被中间网关分隔(路由严格源)IP 允许的最大数量为 9。
-w timeout
指定超时间隔,单位为毫秒。
-r 参数的使用
Linux下的ping
Usage: ping [-LRUbdfnqrvVaA] [-c count] [-i interval] [-w deadline]
[-p pattern] [-s packetsize] [-t ttl] [-I interface or address]
[-M mtu discovery hint] [-S sndbuf]
[ -T timestamp option ] [ -Q tos ] [hop1 ...] destination
语 法:ping [-dfnqrRv][-c<完成次数>][-i<间隔秒数>][-I<网络界面>][-l<前置载入>][-p<范本样式>][-s<数据包大小>][-t<存活数值>][主机名称或IP地址]
补充说明:执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常。
参 数:
-d 使用Socket的SO_DEBUG功能。
-c<完成次数> 设置完成要求回应的次数。
-f 极限检测。
-i<间隔秒数> 指定收发信息的间隔时间。
-I<网络界面> 使用指定的网络界面送出数据包。
-l<前置载入> 设置在送出要求信息之前,先行发出的数据包。
-n 只输出数值。
-p<范本样式> 设置填满数据包的范本样式。
-q 不显示指令执行过程,开头和结尾的相关信息除外。
-r 忽略普通的Routing Table,直接将数据包送到远端主机上。
-R 记录路由过程。
-s<数据包大小> 设置数据包的大小。
-t<存活数值> 设置存活数值TTL的大小。
-v 详细显示指令的执行过程。
记录路由信息
ping -R 202.38.64.1
PING 202.38.64.1 (202.38.64.1) 56(124) bytes of data.
64 bytes from 202.38.64.1: icmp_seq=1 ttl=60 time=3.03 ms
RR: 210.45.240.180
210.45.231.250
210.45.224.250
202.38.64.58
202.38.64.1
202.38.64.1
210.45.231.174
210.45.224.254
210.45.231.249
64 bytes from 202.38.64.1: icmp_seq=2 ttl=60 time=4.48 ms (same route)
64 bytes from 202.38.64.1: icmp_seq=3 ttl=60 time=1.86 ms (same route)
64 bytes from 202.38.64.1: icmp_seq=4 ttl=60 time=1.97 ms (same route)
64 bytes from 202.38.64.1: icmp_seq=5 ttl=60 time=2.10 ms (same route)
64 bytes from 202.38.64.1: icmp_seq=6 ttl=60 time=12.4 ms (same route)
64 bytes from 202.38.64.1: icmp_seq=7 ttl=60 time=2.06 ms (same route)
64 bytes from 202.38.64.1: icmp_seq=8 ttl=60 time=1.69 ms (same route)
64 bytes from 202.38.64.1: icmp_seq=9 ttl=60 time=2.14 ms (same route)
指定接口界面
下面的结果是从一台设备上ping同一台主机202.38.64.1的结果:
ping -I eth2 202.38.64.1
PING 202.38.64.1 (202.38.64.1) from 61.132.138.211 eth2: 56(84) bytes of data.
64 bytes from 202.38.64.1: icmp_seq=1 ttl=57 time=0.893 ms
64 bytes from 202.38.64.1: icmp_seq=2 ttl=57 time=0.750 ms
64 bytes from 202.38.64.1: icmp_seq=3 ttl=57 time=0.945 ms
ping -I eth3 202.38.64.1
PING 202.38.64.1 (202.38.64.1) from 210.45.240.180 eth3: 56(84) bytes of data.
64 bytes from 202.38.64.1: icmp_seq=1 ttl=60 time=1.13 ms
64 bytes from 202.38.64.1: icmp_seq=2 ttl=60 time=0.880 ms
64 bytes from 202.38.64.1: icmp_seq=3 ttl=60 time=1.12 ms
64 bytes from 202.38.64.1: icmp_seq=4 ttl=60 time=0.865 ms
TTL值与操作系统
根据icmp报文的ttl的值,我们就可以大概知道主机的类型。
如:64<ttl <128的主机应该是windows系列的机子,
ttl < 64的主机应该是Linux/uinx系列的机子。
128 <Ttl <256的主机应该是Linux/uinx系列的机子。
这是因为不同操作系统的机子对icmp报文的处理与应答是有所不同的,ttl值每过一个路由器会减1。所以造成了ttl回复值的不同。
Ping遇到的现象
网络出现故障的时候常使用ping命令:
经常遇到AàpingàB可以通,Bàping--*A的情况?
一、Request Timed Out
当Ping指定的对象时,出现“Request Timed Out”提示信息的频率非常高,这说明对方无法接受发送过来的数据。当然这种情况下,很可能就是网络出现了故障,但并不能就因此而确定网络一定不通。因为它还有可能是其它原因造成的。
主机不在线
如果对方关机、禁用网卡或者拨掉网线,那么无论你怎么操作,都不会有连通的信息返回的。要知道最简单的却往往是最容易被忽视的。
防火墙拦截(中途防火墙)
当安装了防火墙之后,当防火墙工作时,一般都能自动拦截来自网络的Ping命令,从而让其失去响应。同时安装防火墙后,还会造成共享文件无法访问的故障。因此在检查时应该先让对方关闭防火墙,然后再使用Ping命令来检测。
IP安全策略限制(本地防火墙)
对于很多有经验的网管人员来说,他们都在服务器上添加了IP安全策略,对ICMP报文进行过滤,使Ping命令无法回应,从而返回“Request Timed Out”的错误提示。
网关设置错误
这种情况主要出现在Ping外部网络地址时才出现。因为当网关设置错误时,Ping发出的数据包无法经网关进行转发。因此需要检查本机的网关设置以及远程网关的配置是否正确。
一般来说,只有在排除上述原因之外,才能够根据“Request Timed Out”初步判断网络连接可能有问题。
二、Destination Host Unreachable
出现“Destination Host Unreachable”错误信息时表示对方主机不存在或者没有跟对方建立连接。看起来好像与“Request Timed Out”差不多,但两者却有关本质的区别。如果Ping命令所发出的数据包经过路由器,并经路由表到达目标的路由,但是因为其它原因(例如防火墙拦截等)导致不可达,那么就是“Request Timed Out”的提示了;相反如果路由表中没有到达目标的路由信息,那么就会出现“Destination Host Unreachable”。
出现这种情况主要有以下一些方面的原因:对于使用DHCP自动分配IP地址的网络,很可能是DHCP服务器出错或不能正常工作,这样客户机无法与DHCP正常通讯并获得正确的IP地址,对此只需要修复DHCP服务器即可;另外则可能是子网掩码设置错误,对此只需要修改成正确的即可。
三、Unknown host
该提示表示无法识别的主机,出现这个问题之后是不是就表示目标主机一定有问题呢?当然不能!因为我们使用Ping命令去连接目标主机名称时,主要使用DNS来负责将名称转换成IP地址。例如“Pingwww.163.com”,我们看到的返回信息是“Reply from 220.181.28.42: bytes=32 time=59ms TTL=54”,而不是“Reply fromwww.163.com: bytes=32 time=59ms TTL=54”,这就说明我们IP设置中的DNS服务器将www.163.com成功转换为220.181.28.42。因此当我们看到这样的提示时,就应该检查DNS设置是否正确、DNS工作是否正常。
透过表面的现象,看清真实的问题,只有这样才能够找出故障的源头,从而对故障有正确的判断。
通过Ping检测网络故障的典型次序
正常情况下,当我们使用Ping命令来查找问题所在或检验网络运行情况时,我们需要使用许多Ping命令,如果所有都运行正确,我们就可以相信基本的连通性和配置参数没有问题;如果某些Ping命令出现运行故障,它也可以指明到何处去查找问题。下面就给出一个典型的检测次序及对应的可能故障:
·ping 127.0.0.1
这个Ping命令被送到本地计算机的IP软件,该命令永不退出该计算机。如果没有做到这一点,就表示TCP/IP的安装或运行存在某些最基本的问题。
·ping 本机IP
这个命令被送到我们计算机所配置的IP地址,我们的计算机始终都应该对该Ping命令作出应答,如果没有,则表示本地配置或安装存在问题。出现此问题时,局域网用户请断开网络电缆,然后重新发送该命令。如果网线断开后本命令正确,则表示另一台计算机可能配置了相同的IP地址。
·ping 局域网内其他IP
这个命令应该离开我们的计算机,经过网卡及网络电缆到达其他计算机,再返回。收到回送应答表明本地网络中的网卡和载体运行正确。但如果收到0个回送应答,那么表示子网掩码(进行子网分割时,将IP地址的网络部分与主机部分分开的代码)不正确或网卡配置错误或电缆系统有问题。
·ping 网关IP
这个命令如果应答正确,表示局域网中的网关路由器正在运行并能够作出应答。
·ping 远程IP
如果收到4个应答,表示成功的使用了缺省网关。对于拨号上网用户则表示能够成功的访问Internet(但不排除ISP的DNS会有问题)。
·ping localhost
localhost是个作系统的网络保留名,它是127.0.0.1的别名,每台计算机都应该能够将该名字转换成该地址。如果没有做到这一带内,则表示主机文件(/Windows/host)中存在问题。
·ping www.sina.com.cn
对这个域名执行Ping www.sina.com.cn 地址,通常是通过DNS 服务器 如果这里出现故障,则表示DNS服务器的IP地址配置不正确或DNS服务器有故障(对于拨号上网用户,某些ISP已经不需要设置DNS服务器了)。顺便说一句:我们也可以利用该命令实现域名对IP地址的转换功能。
如果上面所列出的所有Ping命令都能正常运行,那么我们对自己的计算机进行本地和远程通信的功能基本上就可以放心了。但是,这些命令的成功并不表示我们所有的网络配置都没有问题,例如,某些子网掩码错误就可能无法用这些方法检测到。