|
ping 工具是基于 ICMP 协议的常用排错工具,我们会经常使用它来判断远程主机是否存活并响应。下面浅析该工具的工作原理及其输出结果。
ping 的工作原理基于 “回送请求”(echo request) 和 “回送回答”(echo reply) 。主机或路由器可以给另一个主机或路由器发送“回送请求”报文,收到该报文的主机产生“回送回答”报文,并将其返回给发送者。回送请求和回送回答报文可用来确定 IP 这级是否能够正常通信。因为 ICMP 报文被封装成数据包,发送回送请求的机器在收到回送回答报文时,就证明了在发送端和接收端之间能够用 IP 数据包进行通信。此外,还证明了在一些中间的路由器能够接收,处理和转发数据包。
在我们运行 ping 时,源主机发送 ICMP 回送请求(echo request)报文(类型:8, 代码:0),这里的“类型”和“代码” 是 ICMP 数据包头的前两个字节,类型 8 表示发起”回送请求”。如果对方收到,那么就发一个回送回答报文以示响应。看一个 ping 的实例:beyes@linux-xh53:~> ping www.groad.net
PING www.groad.net (184.22.140.27) 56(84) bytes of data.
64 bytes from 184-22-140-27.static.hostnoc.net (184.22.140.27): icmp_seq=1 ttl=52 time=160 ms
64 bytes from 184-22-140-27.static.hostnoc.net (184.22.140.27): icmp_seq=2 ttl=52 time=161 ms
64 bytes from 184-22-140-27.static.hostnoc.net (184.22.140.27): icmp_seq=3 ttl=52 time=160 ms
64 bytes from 184-22-140-27.static.hostnoc.net (184.22.140.27): icmp_seq=4 ttl=52 time=161 ms
^C # 按下 Ctrl + C 键中断程序
--- www.groad.net ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 160.673/161.147/161.867/0.447 ms
ping 程序在回送请求和回送回答报文中设置了标识符字段,并使序号从 0 开始,每发送一个请求报文时该序号就加 1 ,该序号用 ICMP 数据报头中的第 7 和第 8 个字节来表示,序号的值正如上面输出结果中绿色部分 icmp_seq 所示。
需要注意的是,ping 能够计算往返时间,即发出请求到得到响应之间的这段时间。它在报文的数据部分插入发送时间,当分组到达时,它就从出发时间减去到达时间,这样就得到了往返时间(RTT),该时间就是上面输出结果中的 time 。
上面,ICMP 报文的 IP 数据包的 TTL (Time To Live 生存时间) 此处为 52 。这个字段用来控制数据报从一个机器到另一个机器的最大跳数。当源主机发送数据报时,它在这个字段存入一个数,这个数到底是多少,视主机的系统而定,比如 Linux 一般为 64,UNIX 可能见到的是 255,Windows 有些系统可能见到的是 128 。总之,系统认为它所内置的这个数值至少约为它和任何一个发送端主机之间的路由器数的两倍。当数据包每经过一个路由器时,该值便会减 1,如果减 1 后该值为 0 了,那么路由器就会丢弃这个数据报。
设置 TTL 这个字段是必须的,因为在因特网中的一些路由器可能会出现故障,如果发生了这种情况,那么数据报就可能在两个或更多的路由器之间停留很长的时间,并且数据报不会交付到目的主机。因此设这个字段用来限制数据报的寿命,不然的话会造成拥塞的。打个不太贴切的比方,就像人一样,如果不会死,那么就会在世上溜达着,这样这个世界就会有越来越多的人,那地球肯定受不了的,所以大自然也给每个人安排一个寿命,或长或短。
话说回来。上面的 TTL 值是 52。现在可以事先告知,www.groad.net 所在的服务器是 Linux ,它自身的 TTL 值也是 64,因此我们知道 64 - 52 + 1 = 13 ,这就是经过了 13 个跳数,即跨越了 13 个路由。这里可以用 tracert (Windows 下路由跟踪工具,如果是在 Linux 下,就用 traceroute 命令):C:\Users\Administrator>tracert www.groad.net
通过最多 30 个跃点跟踪
到 www.groad.net [184.22.140.27] 的路由:
1 1 ms 1 ms 1 ms 192.168.1.1
2 2 ms 3 ms 3 ms 183.15.104.1
3 2 ms 2 ms 2 ms 205.103.104.202.broad.sz.gd.dynamic.163data.com.cn [202.104.103.205]
4 4 ms 3 ms 3 ms 219.133.30.222
5 6 ms 5 ms 6 ms 121.34.242.222
6 26 ms 6 ms * 202.97.35.186
7 6 ms 6 ms 6 ms 202.97.60.62
8 179 ms 180 ms 179 ms 202.97.51.154
9 160 ms 160 ms * 202.97.50.26
10 160 ms 161 ms 161 ms ge5-15.br01.lax05.pccwbtn.net [63.218.73.33]
11 178 ms 178 ms 178 ms burstnet.tenge11-1.br01.lax05.pccwbtn.net [63.218.42.102]
12 161 ms 160 ms 164 ms ec0-59.1a0201.laca02.hostnoc.net [64.120.246.90]
13 160 ms 159 ms 161 ms 184-22-231-26.static.hostnoc.net [184.22.231.26]
14 159 ms 159 ms 160 ms 184-22-140-27.static.hostnoc.net [184.22.140.27]
跟踪完成。 上面,经过 13 个跳数后即到达了我们的网站服务器所在地,由于第一个路由我们认为是 0,因此最后得到的 TTL 值就是 64 - (13 - 1) = 52 。还可以验证一下另外一个网站,同样还是先 ping 一下:C:\Users\Administrator>ping www.phpwind.net
正在 Ping www.phpwind.net [110.75.167.178] 具有 32 字节的数据:
来自 110.75.167.178 的回复: 字节=32 时间=36ms TTL=245
来自 110.75.167.178 的回复: 字节=32 时间=36ms TTL=245
来自 110.75.167.178 的回复: 字节=32 时间=36ms TTL=245
来自 110.75.167.178 的回复: 字节=32 时间=31ms TTL=245
110.75.167.178 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 31ms,最长 = 36ms,平均 = 34ms 上面的 TTL 值为 245 。同样跟踪一下路由:C:\Users\Administrator>tracert www.phpwind.net
通过最多 30 个跃点跟踪
到 www.phpwind.net [110.75.167.178] 的路由:
1 1 ms 1 ms 1 ms 192.168.1.1
2 2 ms 3 ms 2 ms 183.15.104.1
3 2 ms 3 ms 3 ms 205.103.104.202.broad.sz.gd.dynamic.163data.com.cn [202.104.103.205]
4 2 ms 2 ms 4 ms 119.145.47.141
5 3 ms 2 ms 2 ms 119.145.45.249
6 28 ms 25 ms 25 ms 202.97.48.145
7 30 ms 29 ms 30 ms 202.97.68.234
8 31 ms 30 ms 30 ms 61.164.13.146
9 30 ms 29 ms 30 ms 122.224.213.193
10 36 ms 34 ms 35 ms 119.38.220.143
11 40 ms 36 ms 35 ms 119.38.220.155
12 37 ms 36 ms 36 ms 110.75.167.178
跟踪完成。 经过 11 个路由,故 245 + 11 -1 = 255 , 即目的主机的 TTL 值为 255,可以判断,该服务器一般为 UNIX 系统。
说明两点:
1. “回送请求” 数据报从源端到目的地端经过的路径和”回送回答“数据报所经过的路径是同一条路径。
2. ”回送回答“ 数据报中的 TTL 值为响应主机系统中定义的值。
因此,源端到目的端,目的端到源端所需的跳数 (hop count) 一样。
此外,上面 ping 输出结果中的 64 bytes 是 ICMP 数据报的大小,为数据报头 8 个字节 + 数据 56 字节。其中,数据部分在来回这个过程中不发生变化。 |
|