ping 是一个基础的网络命令,所有主流操作系统都支持该命令。ping可用于检验网络上主机之间的连通性,找出活动主机。

8.3.1 实战演练

ping命令使用Internet控制消息协议(Internet Control Message Protocol,ICMP)中的echo分组检验网络上两台主机之间的连通性。当向某台主机发送echo分组时,如果分组能够送达且该主机处于活动状态,那么它就会返回一条回应(reply)。如果没有通往目标主机的路由或是目标主机不知道如何将回应返回给请求方,ping命令则执行失败。

检查某台主机是否可达:

  1. $ ping ADDRESS

ADDRESS可以是主机名、域名或者IP地址。

默认情况下,ping会连续发送分组,回应信息将被打印在终端上。可以用Ctrl+C来停止ping命令。

来看下面的例子。

  • 如果主机可达,那么会输出如下信息: ```bash $ ping 127.0.0.1 PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.162 ms 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.052 ms 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.047 ms 64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.055 ms 64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.056 ms 64 bytes from 127.0.0.1: icmp_seq=6 ttl=64 time=0.049 ms

$ ping www.baidu.com PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data. 64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=1 ttl=55 time=8.13 ms

  1. - 如果主机不可达,则输出如下信息:
  2. ```bash
  3. $ ping 192.168.0.99
  4. PING 192.168.0.99 (192.168.0.99) 56(84) bytes of data.
  5. From 192.168.0.82 icmp_seq=1 Destination Host Unreachable
  6. From 192.168.0.82 icmp_seq=2 Destination Host Unreachable

在主机不可达时,ping返回错误信息Destination Host Unreachable

网络管理员通常会对网络设备(如路由器)进行配置,使其不响应ping命令。这样做是为了降低安全风险,因为ping可以被攻击者(使用蛮力)用来获取主机的IP地址。

8.3.2 补充内容

除了检查网络主机之间的连通性,ping命令还可以获取其他信息。往返时间和分组丢失率报告可用于确定网络是否正常运行。

往返时间

ping命令可以显示出每个分组的往返时间(Round Trip Time,RTT)。RTT的单位是毫秒。在内部网络中,RTT基本上还不到1ms。在Internet上,RTT通常在10ms400ms之间,有可能还会超过1000ms

  1. --- google.com ping statistics ---
  2. 5 packets transmitted, 5 received, 0% packet loss, time 4000ms
  3. rtt min/avg/max/mdev = 118.012/206.630/347.186/77.713 ms

其中,最小的RTT118.012ms,平均RTT206.630ms,最大的RTT347.186msping输出中的mdev(77.713ms)代表的是平均偏差(mean deviation)。

序列号

ping发出的每个分组都有一个序列号,从1开始,直到ping命令结束。如果网络接近饱和,分组可能会因为冲突、重试或被丢弃的原因,以乱序的形式返回:

  1. $> ping example.com
  2. 64 bytes from example.com (1.2.3.4): icmp_seq=1 ttl=37 time=127.2 ms
  3. 64 bytes from example.com (1.2.3.4): icmp_seq=3 ttl=37 time=150.2 ms
  4. 64 bytes from example.com (1.2.3.4): icmp_seq=2 ttl=30 time=1500.3 ms

在这个例子中,第二个分组被丢弃了,超时之后又进行了重发,因此在返回的时候出现了乱序,RTT时间也更长。

生存时间

ping命令发送的每个分组都有一个可以在被丢弃前完成的跳数,这个值是预先定义好的。分组途径的每个路由器会将该值减1。它表明了发出ping命令的主机和目的主机之间相隔了多少个路由器。依据你所使用的系统或ping命令版本的不同,生存时间(Time To Live,TTL)的初始值也不尽相同。你可以通过向环回接口发起ping命令来确定TTL的初始值:

  1. $> ping 127.0.0.1
  2. 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.049 ms
  3. $> ping www.google.com
  4. 64 bytes from 173.194.68.99: icmp_seq=1 ttl=45 time=49.4 ms

在本例中,我们向环回地址发起ping命令,以此决定 TTL的值。因为是环回地址,所以跳数不会发生变化(仍是64)。然后向远程站点发起ping命令,使用TTL的初始值减去回应中的TTL值,就得到了两个位置之间的跳数。在这里是19跳(64-45)。

TTL的值就是跳数。

两个位置之间的TTL值通常是固定的,但如果路径发生了变化,TTL的值也会随之变化。

限制发送的分组数量

ping命令会不停地发送echo分组并等待回复,直到按下Ctrl+C为止。我们可以用选项-c限制所发送的echo分组的数量。用法如下:

  1. -c COUNT

例如:

  1. $ ping 192.168.0.1 -c 2
  2. PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
  3. 64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=4.02 ms
  4. 64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=1.03 ms
  5. --- 192.168.0.1 ping statistics ---
  6. 2 packets transmitted, 2 received, 0% packet loss, time 1001ms
  7. rtt min/avg/max/mdev = 1.039/2.533/4.028/1.495 ms

在上面的例子中,ping命令发送了两个echo分组后就停止发送。如果我们需要通过脚本ping 一组IP地址来检查主机的状态,那么这个技巧就能派上用场了。

ping 命令的返回状态

ping命令如果执行顺利,会返回退出状态0;否则,返回非0。执行顺利意味着目标主机可达,执行失败意味着目标主机不可达。

返回状态可以通过下面的方法获得:

  1. $ ping domain -c2
  2. if [ $? -eq0 ];
  3. then
  4. echo Successful ;
  5. else
  6. echo Failure