其实对于 ping 这个命令,我们经常会使用到,我们常常用它来检测到目的站群服务器的是不是联通的,还有检视域名的解析,用处还是很多的,但是原理我们可能不是很熟悉,下面是关于原理的和报文格式的介绍,可以加深我们对这个命令的理解。

    ICMP 协议通过 IP 协议传送的,IP 协议是一种无连线的,不可靠的资料包协议。在 Unix/Linux,序列号从 0 开始计数,依次递增。而 Windows ping 程式的 ICMP 序列号是没有规律。
    ICMP 协议在实际传输中资料包:20 位元组 IP 首部 + 8 位元组 ICMP 首部+ 1472 位元组<资料大小>38 位元组
    ICMP 报文格式:IP 首部 (20 位元组)+8 位型别+8 位程式码+16 位校验和+(不同的型别和程式码,格式也有所不同)

Ping 工作过程——
假定 WordPress 主机 A 的 IP 地址是 192.168.1.1,WordPress 主机 B 的 IP 地址是 192.168.1.2,都在同一子网内,则当你在 WordPress 主机 A 上执行 “Ping 192.168.1.2” 后,都发生了些什么呢?
首先,Ping 命令会构建一个固定格式的 ICMP 请求资料包,然后由 ICMP 协议将这个资料包连同地址 “192.168.1.2” 一起交给 IP 层协议(和 ICMP 一样,实际上是一组后台执行的程序),IP 层协议将以地址 “192.168.1.2” 作为目的地址,本机 IP 地址作为源地址,加上一些其他的控制资讯,构建一个 IP 资料包,并在一个对映表中查询出 IP 地址 192.168.1.2 所对应的实体地址(也叫 MAC 地址,熟悉网络卡配置的朋友不会陌生,这是资料链路层协议构建资料链路层的传输单元——帧所必需的),一并交给资料链路层。后者构建一个资料帧,目的地址是 IP 层传过来的实体地址,源地址则是本机的实体地址,还要附加上一些控制资讯,依据乙太网的介质访问规则,将它们传送出去。
    其中对映表由 ARP 实现。 ARP(Address Resolution Protocol) 是地址解析协议, 是一种将 IP 地址转化成实体地址的协议。 ARP 具体说来就是将互联网层(IP 层,也就是相当于 OSI 的第三层)地址解析为资料连线层(MAC 层,也就是相当于 OSI 的第二层)的 MAC 地址。
WordPress 主机 B 收到这个资料帧后,先检查它的目的地址,并和本机的实体地址对比,如符合,则接收;否则丢弃。接收后检查该资料帧,将 IP 资料包从帧中提取出来,交给本机的 IP 层协议。同样,IP 层检查后,将有用的资讯提取后交给 ICMP 协议,后者处理后,马上构建一个 ICMP 应答包,传送给 WordPress 主机 A,其过程和 WordPress 主机 A 传送 ICMP 请求包到 WordPress 主机 B 一模一样。
即先由 IP 地址,在互联网层传输,然后再根据 mac 地址由资料链路层传送到目的 WordPress 主机

ICMP——

1.IMCP 协议介绍
前面讲到了,IP 协议并不是一个可靠的协议,它不保证资料被送达,那么,自然的,保证资料送达的工作应该由其他的模组来完成。其中一个重要的模组就是 ICMP(互联网控制报文) 协议。
当传送 IP 资料包发生错误--比如 WordPress 主机不可达,路由不可达等等,ICMP 协议将会把错误资讯封包,然后传送回给 WordPress 主机。给 WordPress 主机一个处理错误的机会,这 也就是为什么说建立在 IP 层以上的协议是可能做到安全的原因。 ICMP 资料包由 8bit 的错误型别和 8bit 的程式码和 16bit 的校验和组成。而前 16bit 就组成了 ICMP 所要传递的资讯。
尽管在大多数情况下,错误的包传送应该给出 ICMP 报文,但是在特殊情况下,是不产生 ICMP 错误报文的。如下

ICMP 差错报文不会产生 ICMP 差错报文(出 IMCP 查询报文)(防止 IMCP 的无限产生和传送)
目的地址是广播地址或多播地址的 IP 资料包。
作为链路层广播的资料包。
不是 IP 分片的第一片。
源地址不是单个 WordPress 主机的资料包。这就是说,源地址不能为零地址、环回地址、广播地 址或多播地址。

虽然里面的一些规定现在还不是很明白,但是所有的这一切规定,都是为了防止产生 ICMP 报文的无限传播而定义的。
ICMP 协议大致分为两类,一种是查询报文,一种是差错报文。其中查询报文有以下几种用途:

ping 查询
子网掩码查询(用于无盘工作站在初始化自身的时候初始化子网掩码)
时间戳查询(可以用来同步时间)

而差错报文则产生在资料传送发生错误的时候。就不赘述了。
2.ICMP 的应用–ping
ping 可以说是 ICMP 的最著名的应用,当我们某一个网站上不去的时候。通常会 ping 一下这个网站。 ping 会回显出一些有用的资讯。一般的资讯如下:
Reply from 10.4.24.1: bytes=32 time<1ms TTL=255 Reply from 10.4.24.1: bytes=32 time<1ms TTL=255 Reply from 10.4.24.1: bytes=32 time<1ms TTL=255 Reply from 10.4.24.1: bytes=32 time<1ms TTL=255 Ping statistics for 10.4.24.1: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 0ms, Maximum = 0ms, Average = 0ms ping这个单词源自声纳定位,而这个程式的作用也确实如此,它利用ICMP协议包来侦测另一个WordPress主机是否可达。原理是用型别码为0的ICMP发请 求,受到请求的WordPress主机则用型别码为8的ICMP回应。ping程式来计算间隔时间,并计算有多少个包被送达。使用者就可以判断互联网大致的情况。我们可以看到, ping给出来了传送的时间和TTL的资料。我给的例子不太好,因为走的路由少,有兴趣地可以ping一下国外的网站比如sf.net,就可以观察到一些 丢包的现象,而程式执行的时间也会更加的长。 ping还给我们一个看WordPress主机到目的WordPress主机的路由的机会。这是因为,ICMP的ping请求资料包在每经过一个路由器的时候,路由器都会把自己的ip放到该数 据报中。而目的WordPress主机则会把这个ip列表复制到回应icmp资料包中发回给WordPress主机。但是,无论如何,ip头所能纪录的路由列表是非常的有限。如果要观察路由, 我们还是需要使用更好的工具,就是要讲到的Traceroute(windows下面的名字叫做tracert)。 3.ICMP的应用–Traceroute Traceroute是用来侦测WordPress主机到目的WordPress主机之间所经路由情况的重要工具,也是最便利的工具。前面说到,尽管ping工具也可以进行侦测,但是,因为ip头的限制,ping不能完全的记录下所经过的路由器。所以Traceroute正好就填补了这个缺憾。 Traceroute的原理是非常非常的有意思,它受到目的WordPress主机的IP后,首先给目的WordPress主机传送一个TTL=1(还记得TTL是什么吗?)的UDP(后面就 知道UDP是什么了)资料包,而经过的第一个路由器收到这个资料包以后,就自动把TTL减1,而TTL变为0以后,路由器就把这个包给抛弃了,并同时产生 一个WordPress主机不可达的ICMP资料包给WordPress主机。WordPress主机收到这个资料包以后再发一个TTL=2的UDP资料包给目的WordPress主机,然后刺激第二个路由器给WordPress主机发ICMP资料 报。如此往复直到到达目的WordPress主机。这样,traceroute就拿到了所有的路由器ip。从而避开了ip头只能记录有限路由IP的问题。 有人要问,我怎么知道UDP到没到达目的WordPress主机呢?这就涉及一个技巧的问题,TCP和UDP协议有一个埠号定义,而普通的互联网程式只监控少数的几个号码较 小的埠,比如说80, 比如说23, 等等。而traceroute传送的是埠号>30000(真变态) 的 UDP 报,所以到达目的 WordPress 主机的时候,目的 WordPress 主机只能传送一个埠不可达的 ICMP 资料包给 WordPress 主机。 WordPress 主机接到这个报告以后就知道,WordPress 主机到了