目录


前言
Ping 的由来
Ping 的原理
  Round Trip Time (RTT)
  丢包率 (Packet Loss %)
  Time to Live (TTL)
End-to-end Delay
  Processing Delay
  Queuing Delay
  Transmission Delay
  Propagation Delay
  其他因素
Traceroute

前言

任何靠 IT 行业讨饭吃的人,无论在哪个范畴工作,都一定懂得 Ping 这个指令。差不多任何作业系统都具备 Ping 这支程式,用来做简单的 Troubleshooting。但究竟 Ping 在背後帮我们做了些什麽呢?本篇文章就从 Ping 说起,并会涉及关於 End-to-end Delay 的理论。

Ping 的由来

众所周知,Ping 的作用是发讯息给一个设备,要求对方回应,从而知道对方的状态,是生是死?也可以凭它回应的速度和成功率来判断网络状态。为什麽叫 Ping 呢?笔者翻查过一些资料,原来和另一门科学有着莫大关系 - 声纳探测!

所谓声纳探测就是潜艇在水底发出声波,声波遇到障碍物时反弹给潜艇,於是潜艇就可以知道障碍物的位置了,而这个方法就是叫 Ping。声纳探测的 Ping 操作上与网络的 Ping 很类似,所以当初程式人员把这工具命名为 Ping 实在很有心思!

end-to-end delay

图片来源

Ping 的原理

Ping 是一支程式,这程式所发出的 Packet 就叫做 ICMP Packet。ICMP 结构简单,被包在 IP Packet 里面,每个 ICMP 都包含一些简单的讯息。

在 ICMP Packet 里面常见的讯息有:

讯息类形意思
Echo Request 要求对方回应
Echo Reply 对 Echo Request 作出回应
Destination Unreachable 当一个 Echo Request 因为没办法到达目的地而被丢弃 (很大可能是 Route 出了问题,Router 找不到路径),Router 就会回应这个讯息。
Time Exceeded 当一个 Echo Request 因为 TTL 被扣减至 0 没法到达目的地而被丢弃,Router 会回应这个讯息。关於 TTL 将於稍後说明。

ICMP 也提供一些 Troubleshoot 以外的功能,在此不详述,有兴趣的读者可以 Google 一下 ICMP 这个 Protocol。

任何设备收到 Echo Request 通常都会回应 (Echo Reply),除非故意做了设定不回应 (例如:Firewall 设定) 或者 ICMP Traffic 被 Access-List 之类挡下来。当发送方收到对方回应後就可以计算出一些结果。

[root@Linux ~]# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=46 time=15.6 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=46 time=15.6 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=46 time=14.8 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=46 time=15.8 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=46 time=14.8 ms
^C
--- 8.8.8.8 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4713ms
rtt min/avg/max/mdev = 14.870/15.392/15.839/0.449 ms

Round Trip Time (RTT)

Ping 通常会做多次 Echo Request,并记录每一个 Echo Request 与 Echo Reply 之间的时间差,这个时间差称为 Round Trip Time (RTT),也可称 End-to-end Delay。由於每一个 Ping 的 RTT 都不同,所以在 Ping 的 Result 中会看到最大(max)丶最小(min)和平均(avg) RTT 等数据。

丢包率 (Packet Loss %)

Ping 不一定每次都成功,刚才说过,失败的原因可能是 Destination Unreachable 或者 Time Exceeded。也可能是 Timeout,即过了一定时间也收不到对方回应。Packet Loss % 就是收不到回应的机率,极具参考价值,是反映网络是否稳定的重要指标。

Time to Live (TTL)

Ping 程式送出 Packet 时会设定一个 TTL (Time to Live) 的数值,预设 TTL 值各作业系统有所不同。Packet 每次被 Route,Packet 里面的 TTL 值都会被减 1。当 Packet 到达目的地时只要看看 Packet 的 TTL 就知道 Packet 经历过多少个 Hop 才到达。如不幸 TTL 在传送中途被扣减至 0 仍未到达目的地,则会被丢弃。而丢弃 Packet 的 Router 会回应 Time Exceeded,这样发 ICMP 的一方就知道致死原因是 TTL 被减至 0 了。

End-to-end Delay

试想想,当你发 ICMP 给一台设备,该设备可能在世界的另一端,Packet 到达目的地需要一点时间,而这段时间名为 End-to-end Delay。在网络的角度来看,构成 End-to-end Delay 的因素主要有以下 4 个:

end-to-end delay

Processing Delay

当一个 Packet 到达 Router 时,Router 需要进行运算去找出 Packet 应该被送到那里,称为 Routing Decision。而这运算的时间就是 Processing Delay。Processing Delay 的长短取决於 Router 的作业系统丶运算速度甚至硬体结构等。

Queuing Delay

透过 Routing Decision,Router 决定了 Packet 的出口,就会把 Packet 移送到该 Interface,这时 Packet 会在 Interface 的 Output Queue 排队,等待被处理,等待的时间就是 Queuing Delay 了。Queuing Delay 的长短则要看当时网络的状况,简单来说就是前面有多少 Packet 在排队。而且 Output queue 是有截龙机制的,即是说如果发现 queue buffer 即将爆满,有些 Packet 会被丢弃,不一定是队尾的 Packet 被丢弃,可以在整条 Queue 里面抽一些 Packet 弃掉来腾出空间,这就是 Packet Drop。不过,这涉及 QoS 的设定,留待日後 QoS 环节再详谈。

Transmission Delay

有幸生存下来的 Packet 就会慢慢移至 Output Queue 的最前头,Interface 会把 Packet 一个一个的送上传送媒介 (就是网络线啦)。但 Interface 不能疯狂地把 Packet 送走,它只能按预先设定好的 Interface Speed (例如:100Mbps 或 1Gbps) 速度来送出。要慢慢送出去的原因是要考虑传送媒介所能承受的 Bandwidth,大家可以参考以下两篇文章:Optical Fiber Cable 和 Copper Twisted Network Cable。因此,如果要在 100Mbps Bandwidth 的 Interface 送出一个 1500 Bits 的 Packet,其 Transmission Delay 就是:

1500 bits / 100 Mbps = 15 ns

Propagation Delay

Packet 终於上路了,变成电子讯息或光讯息在传送媒介上高速行走。有多高速?如果用 Copper Cable 的话,电子讯息在铜线上传送速度约为每秒 2 x 108 公尺,如果使用光纤线,光的速度为每秒 3 x 108 公尺。假设用光纤线传送 10 公里,Propagation Delay 为:

10 km / 3 x 108 ms-1 = 33.36 ns

其他因素

尚有其他因素会影响 End-to-end Delay。例如:

目标设备的系统状况

Packet 到达目标设备,需要由作业系统与硬件资源(例如 CPU 和 RAM)处理,因此设备繁忙会减慢回应速度。

QoS (Quality of Service)

QoS 设定会影响 Packet 处理的优先次序。ICMP 的优先度通常被设定得较低,如当时有大量高优先度的 Packet 流动会增加 Ping 的回应时间,甚至因传送中途被丢弃而导致 Packet Loss。

Collision

如果网络中有网段仍在使用 Half Duplex 的话,Layer 2 Collision 也会增加 Ping 的回应时间。

Traceroute

利用 TTL 机制,有人发明了一个很有用的工具 - Traceroute (有些系统称为 Trace 或 Tracert)。Traceroute 在发 ICMP 时故意把 TTL 设为 1,当 Packet 到达第一个 Hop 时,就会回应 Time Exceeded。收到回应後,Traceroute 又再发 TTL 为 2 的 ICMP,於是今次就收到来自第二个 Hop 的回应。如是者,Traceroute 把所有结果记下来,直至能收到 Echo Reply。这样子,我们就可以知道 Packet 由出发直至到达目的地所走过的路了。

以下是一个 Traceroute Result。

[root@Server ~]# traceroute www.google.com.hk
traceroute to www.google.com.hk (216.58.200.3), 30 hops max, 60 byte Packets
 1  192.168.1.1 (192.168.1.1)  0.530 ms  0.488 ms  0.533 ms
 2  ㊙️㊙️㊙️㊙️㊙️.ctinets.com (㊙️㊙️㊙️㊙️㊙️)  6.992 ms  7.150 ms  7.308 ms
 3  10.239.9.89 (10.239.9.89)  2.632 ms  2.946 ms  3.100 ms
 4  014199254173.ctinets.com (14.199.254.173)  6.074 ms  6.140 ms  6.211 ms
 5  014136129214.ctinets.com (14.136.129.214)  5.189 ms  5.254 ms  5.334 ms
 6  72.14.196.85 (72.14.196.85)  5.480 ms  5.150 ms  5.130 ms
 7  108.170.241.97 (108.170.241.97)  5.698 ms  4.532 ms  4.139 ms
 8  209.85.240.9 (209.85.240.9)  3.518 ms 209.85.240.11 (209.85.240.11)  2.492 ms *
 9  hkg12s11-in-f3.1e100.net (216.58.200.3)  4.004 ms  4.061 ms  4.053 ms