PING是利用ICMP协议的一求一答来完成目的主机可达性探寻的。而ICMP(Internet网控制协议)素来被称为信使协议,来弥补IP协议在设计上的缺陷。ICMP按功能可以分为:差错报告和查询两类。差错报文用来传递报文网络处理过程中目的不可达,超时等信息。而查询报文的典型代表就是今天要说到的PING请求及应答报文。

    PING的原理就是源主机向目的主机发送ICMP请求报文,如果目的主机能够接收便会向源主机返回一ICMP应答报文告诉源主机,该主机目的可达,可以发送信息。而如果连续发送若干ICMP请求(例如5个)还收不到ICMP应答而连续收到time out报文,则源主机认为目的地不可达。利用PING还可以根据返回信息判断网络环境,比如是否存在等价路由,可以根据TTL判断两个站之间的距离等,是否存在不可达路由还是该报文需要被重定向等等。所以PING才成为被如此重视的网络测试协议。

    经过ARP协议的地址解析之后,我们在发送ICMP请求报文之前查询ARP高级缓存可以根据目的IP查询到对应的MAC地址,这样便可以发送ICMP请求报文了。首先我们先来看看ICMP协议的报文结构及其封装:

                                   clip_image001[4]

                                  图1 ICMP封装在IP数据报内部

   clip_image001[6]

 

 

 

 

 

                                  图2 ICMP报文

       图1说明了ICMP的报文封装结构,可以看出为什么ICMP经常被看做是IP的一个组成部分。图2则表明了ICMP报文的结构,其中类型和代码字段可以唯一的标识一种ICMP差错或查询报文。16为校验和是ICMP必须的,且覆盖整个ICMP报文,确保在传输过程中不被篡改,最后一部分说明了出现该种差错的原因或者是查询结果。

    PING使用了ICMP的请求报文(Type=8,Code=0)和回显应答报文(Type=0,Code=0),这两个报文都是查询类报文。也就是说PING后源主机发送Type=8,Code=0的ICMP请求报文给目的主机(由IP报头中的目的IP及目的MAC标识),然后在网络上或进行二三层的转发,查询FIB及RIB表项转发报文,最后等目的主机收到请求报文之后,便会返回一个ICMP应答报文,其中用Type=0,Code=0标识。源主机收到该ICMP应答报文之后就可一判断目的主机是否可达。

   所以PING是将自己的请求与应答信息装在ICMP信封之内完成所有的操作的,从这个意义上说ICMP作为PING传情的鸿雁一点也不夸张。