ping命令详解:工作原理、使用方法及故障排查
ping命令详解:工作原理、使用方法及故障排查
ping(Packet Internet Groper)是一种计算机网络管理应用,该程序通常被用于确认因特网上的一台主机是否可达。
基本信息
ping用于确定本地主机是否能与另一台远程主机成功交换(发送与接收)数据包,再根据返回的信息,就可以推断TCP/IP参数是否设置正确,以及运行是否正常、网络是否通畅等。Ping命令可以进行以下操作:
- 通过将ICMP(Internet控制消息协议)回显(Echo)数据包发送到计算机并侦听回显回复数据包来验证与一台或多台远程计算机的连接。
- 每个发送的数据包最多等待一秒。
- 打印已传输和接收的数据包数。
需要注意的是,Ping成功并不一定就代表TCP/IP配置正确,有可能还要执行大量的本地主机与远程主机的数据包交换,才能确信TCP/IP配置的正确性。如果执行ping成功而网络仍无法使用,那么问题很可能出在网络系统的软件配置方面,ping成功只保证当前主机与目的主机间存在一条连通的物理路径。
历史由来
ping程序是由Mike Muuss编写的,ping程序的命名源自声纳系统在进行回声定位时发出的声音。ping程序的作者将ping程序对“网络空间”的探测与声纳系统对物理空间的探测类比,因其原理的范式是相同的:ping使用定时IP/ICMP协议回显请求(ECHO_REQUEST)和回显应答(ECHO_REPLY)数据包探测到目标主机的“距离”。
实现方式
ICMP Ping
ICMP是一种将差错与控制集于一体的协议,不仅用于传输差错报文,还用于消息控制报文。它与IP协议相互依赖:IP在发送一个差错或控制报文时要用到ICMP,而ICMP利用IP来传递报文。
ICMP报文分为信息报文、差错报文、控制报文。信息报文一般由客户端发出,例如用于测试目的地址可达性的回应请求/应答报文;而差错报文一般由服务器或是路由器发出,表示网络或主机不能完成要求的服务。当发送一份ICMP差错报文时,文始终包含了IP首部和产生ICMP差错报文的IP数据报的前8个字节。
ICMP Ping就是向目标主机发送ICMP信息报文,目标主机(有时是路由器)回应ICMP信息报文或差错报文,Ping程序根据这些收到的ICMP报文,以知道目标主机的可达性。可用于Ping的信息报文有:回应请求与响应报文、时间戳请求与响应报文和掩码请求与响应报文。
TCP Ping
在进行ICMP Ping的时候,如果在目标主机的网络网关过滤了ICMP Ping包,ICMP Ping的结果就不准确了。此时,应该考虑其他方式,如TCP Ping、LIDP Ping。TCP的功能是在一对ULP(Upper Layer Protocol,高层协议)之间提供的数据报服务基础上,建立可靠的端对端连接,并提供虚电路服务和面向数据流的传输服务。TCP中的基本传输单元是段(Segment),一个TCP段由段头和数据流两部分组成。
在TCP协议中,SYN包用来表示建立连接请求。如果对方端口处在listening状态,就会回送ACK包,并附上自己的ISN。但是如果对方端口是关闭的,它会发回一个RST包,表示应该马上断开连接(少数情况下会发回一个同时置SYN和ACK位的包)。如果我们向一个端口发送ACK包,而事先没有与此端口建立连接,那么,无论端口是否打开,它都会回送一个RST包。所以可以看出,无论这个端口是否打开,总会有某一种数据包返回,以此可以判定目标主机可达。而目标主机如果不可达,路由器就会向扫描主机发送目的地不可达的ICMP报文。这样,通过向目标主机发送TCP SYN包或TCP ACK包就可以准确判断目标主机是否可达,而且根据RFC793(TCP),目标主机(或路由器)都无法屏蔽TCP SYN包和TCP ACK包,因此,TCP Ping的准确性比ICMP Ping的准确性要高。在实现的时候,需要利用RAW Socket,定制TCP包并封装在IP包中。在Linux系统下,非root用户是没有此项权利的,同样Windows的非.Administrator组用户也不能直接填写TCP包头和IP包头。
UDP Ping
在TCP/IP协议组中,用户数据报协议(UDP)提供应用进程之间数据报传送的基本机制。每个UDP报文不仅传送用户数据,而且还包括发送方和接收方的协议端口号。
UDP Ping与TCP Ping的原理类似,通过RAW Socket定制UDP包,主要是格式化UDP包中的目的端口号,一般指定一个数量值很大的目的端口号(比如31558),很少应用程序用到数量值入的端口号,也就是说该端口很有可能是处于关闭状态。首先构建好UDP报文,然后递交给IP实体发送。如果目标主机不可达(网络不通或主机未打开),则路由器将发送一个目的不可达ICMP报文。而如果目标主机可达,在其接收数据时,其UDP实体首先判断接收到的目的端口号是否与当前使用的某端口号匹配,如果匹配,则将数据报放入到对应的接收队列,否则如果目的端口号对应的端口关闭则丢弃该数据报,并回送一个“端口不可达”的ICMP报文,因此,只要目标主机可达,UDP Ping程序将收到一个UDP回应包(也可能没有)或者“端口不可达”的ICMP报文而目标主机不可达,将收到“目的不可达”的ICMP报文。
工作原理
ping命令示意图
Ping命令本质上是一种发送Internet控制消息协议(ICMP)回显请求和响应消息的命令组合。ICMP协议是一种构建在IP协议之上的网络协议,其报头封装在IP层报头之内。
当网络管理员在命令提示符下输入ping命令时,主机会向目标设备或指定的IP地址发送ICMP回显请求消息(ICMP Echo Request Message),这些请求消息是最多64字节的小数据包(在ping命令中一般为32字节),用于判断数据包是否成功到达对端。然后,发送请求的本地计算机将等待远程主机的响应。如果远程主机正在运行且网络可达,目标计算机收到回显请求消息后,会将ICMP回显响应消息(ICMP Echo Reply Message)送回原始计算机。
回显请求消息(Echo Request)报文格式
8比特 8比特 16比特
Type = 8(IPv4,ICMP)128(IPv6,ICMP6) Code = 0 Checksum
Identifier Sequence Number
Payload(可选)[5]
回显应答消息(Echo Reply)报文格式
8比特 8比特 16比特
Type = 0(IPv4,ICMP)129(IPv6,ICMP6) Code = 0 Checksum
Identifier Sequence Number
Payload(可选)[5]
ping程序会在传出的回显请求(Echo Request)的可选数据区(Payload)中包含一份本地时间拷贝。这个时间和数据区域中的剩余内容均包含在返回的回显应答(Echo Reply)报文中。当应答被发出ping的收到时,ping程序注意到当前的时间,并用它减去应答中的时间,便得到了一个达到被ping主机的往返时间(RTT)估计值。由于只用到了原始发送者记录的时间,因此这个特征不会涉及到发送者和接收者之间的时钟同步。
通常,在ping网络测试中发送多个回显请求,以评估远程主机的可用性。例如,在Windows中,发送到IP地址的回显请求数通常为4个。命令提示符会显示每个请求的结果,并帮助网络管理员确定它是否得到了响应。它还显示发送/接收的总字节数、丢失数据包率(丢包率)、平均往返时间(RTT, round trip time)和生存时间(TTL, time to live),以帮助网络管理员评估网络状态。
平均往返时间(RTT)是衡量网络链路延迟的指标。该过程以毫秒(ms)为单位,从浏览器向服务器发送请求时开始,在收到来自服务器的响应时完成。RTT是Web应用程序的关键性能指标,反应了数据包从主机到另一台主机的延迟。丢包率则描述了链路中传输的数据包丢失的比例,描述了链路的传输质量。生存时间(TTL)描述了从主机到目标设备的网络链路中的跳数,它的值随着每经过一次路由器就会减1,直到减到0时该IP包会被丢弃。
Ping百度网站示例
以下是一个ping的例子:
可以看到测试的是主机和百度服务器(220.181.38.149)的连接性,ping程序收到4条回显应答消息,每个消息32字节,以及估计的往返时间、TTL和丢失(丢包率)。
使用Ping命令探测服务器可访问性
若没有ping响应,则表明目标设备不可用或脱机。如果ping网络测试结果显示数据包丢失,则可能是网络连接不良。同样,在ping网络测试中频繁出现回显请求超时通常是由于IP地址输入不正确。
ICMP报文类型
类型 代码 描述 种类
0 0 回显应答(echo reply) 查询报文
3 0-15 目标不可达(destination unreachable) 差错报文
4 0 原点抑制(source quench) 差错报文
5 0-3 重定向或改变路由(redirect) 差错报文
8 0 回显请求(echo request) 查询报文
9 0 路由器通告(router advertisement) 查询报文
10 0 路由器请求(router solicitation) 查询报文
11 0-1 超时(time exceeded) 差错报文
命令用法
在个人电脑Windows中使用ping:
在Windows系列的操作系统中,我们都可以使用ping命令来解决网络中出现的路由问题,方法如下:
- 进入命令提示符(可通过win+R键并输入cmd进入)。
- 输入命令:
C:\Users\用户>ping 网址(www.xxx.com)/IP地址(xxx.xxx.xxx.xxx)
例如:
Ping 127.0.0.1(回送地址,用于测试本机tcp/ip配置是否正常)
Ping 10.207.255.254(网关地址,可通过在命令行中输入ipconfig查询)
Ping 8.8.8.8(DNS服务器地址)
Ping www.baidu.com(测试访问远程服务器和域名解析是否正常)
当ping一个网址时,主机会访问DNS服务器获得该网址的IP地址解析。
在路由器中使用ping命令:
- 用户Ping
在路由器的用户模式下,也可以使用ping命令,它是一个简单的全局命令,用法同Windows下相同,只是返回代码不同。其形式是:Router>ping 169.254.104.10路由器缺省使用IP协议。
- 扩展Ping
在路由器的特权模式下,可以使用其他几个选项,这就是所谓的扩展ping,它是交互形式工作的。扩展ping的可用其他选项包括:使用不同大小的数据包;增加应答等待时间间隔;一次发送多于5个数据包;在IP报头设置“不分段”位;在其他协议中使用ping,例如IPX和AppleTalk。方法是:在enable模式下输入ping并按回车键即可启动扩展ping,ping工具将提示输入各种变量值。其形式是:
Router#ping
Protocol[ip]:***
TargetIPaddress:****
…………
检查网络故障
正常情况下,当你使用Ping命令来查找问题所在或检验网络运行情况时,你需要使用许多Ping命令,如果所有都运行正确,你就可以相信基本的连通性和配置参数没有问题;如果某些Ping命令出现运行故障,它也可以指明到何处去查找问题。下面就给出一个典型的检测次序及对应的可能故障:
- ping 127.0.0.1——这个Ping命令被送到本地计算机的IP软件,该命令永不退出该计算机。如果没有做到这一点,就表示TCP/IP的安装或运行存在某些最基本的问题。
- ping本机IP——这个命令被送到你计算机所配置的IP地址,你的计算机始终都应该对该Ping命令做出应答,如果没有,则表示本地配置或安装存在问题。出现此问题时,局域网用户请断开网络电缆,然后重新发送该命令。如果网线断开后,本命令正确,则表示另一台计算机可能配置了相同的IP地址。
- ping局域网内其他IP——这个命令应该离开你的计算机,经过网卡及网络电缆到达其他计算机,再返回。收到回显(Echo)应答表明本地网络中的网卡和载体运行正确。但如果收到0个回显(Echo)应答,那么表示子网掩码(进行子网分割时,将IP地址的网络部分与主机部分分开的代码)不正确或网卡配置错误或电缆系统有问题。
- ping网关IP——这个命令如果应答正确,表示局域网中的网关路由器正在运行并能够作出应答。
- ping远程IP——如果收到4个应答,表示成功的使用了缺省网关。对于拨号上网用户则表示能够成功的访问Internet(但不排除ISP的DNS会有问题)。
- ping localhost——localhost是个操作系统的网络保留名,它是127.0.0.1的别名,每台计算机都应该能够将该名字转换成该地址。如果没有做到这一条,则表示主机文件(/Windows/host)中存在问题。
- ping www.baidu.com——对这个域名执行Ping命令,你的计算机必须先将域名转换成IP地址,通常是通过DNS服务器。如果这里出现故障,则表示DNS服务器的IP地址配置不正确或DNS服务器有故障。
如果上面所列出的所有Ping命令都能正常运行,那么计算机可以进行本地和远程通信。但是,这些命令的成功并不表示所有的网络配置都没有问题,例如,某些子网掩码错误就可能无法用这些方法检测到。
影响因素
在物理链路连通和路由设置正确的情况下,使用Ping命令仍然屏不通,可能有以下几个问题:
- 网线刚插到交换机上就Ping通网关,忽略了生成树的收敛时间。当然,较新的交换机都支持快速生成树,或者有的管理员干脆把用户端口(access port)的生成树协议关掉,问题就解决了。
- 不管中间经过了多少个节点,只要有节点(包括端节点)对ICMP信息包进行了过滤,Ping不通是正常的。最常见的就是防火墙的行为。
- 某些路由器端口是不允许用户Ping的。
- 网络因设备间的超时,造成ICMP报文无法在缺省时间(2秒)内收到。超时的原因有:主机没有足够的时间和资源来响应;路径太长,没到达目的地时TTL的值为0,最后一个路由器将发回ICMP超时信息;使用扩展Ping,增加应答等待时间间隔等。
- 引入NAT的场合会造成单向Ping通。NAT可以起到隐蔽内部地址的作用,当由内Ping外时,可以Ping通是因为NAT表的映射关系存在,当由外发起Ping内网主机时,就无从查找边界路由器的NAT访问列表了。
安全漏洞
基于ICMP的Ping洪泛
网络攻击者可以以很快的速度向目标发送ping请求,从而可能使受害者不堪重负。为了进行拒绝服务攻击,攻击者只需不断地向攻击目标发送Ping,一旦ICMP数据包超过最大上限时,就会出现内存分配错误,导致TCP/IP堆栈崩溃,致使攻击的目标死机或导致网络阻塞。此技术称为ping洪泛攻击。
ICMP回显扫描(ping扫描)
Ping主机扫描可以使用一个ICMP回显数据包来探测主机地址是否存活,对多个地址进行ping请求可以获取网络上所有主机的列表,此技术称为ICMP回显(Echo)扫描。