首先简单介绍下ARP和ICMP协议。ARP,即地址解析协议,实现通过IP地址得知其物理地址。ICMP协议是一种面向无连接的协议,用于传输出错报告控制信息以及查询

ping流程_ping

                           网络拓扑

        如上图的拓扑,PC1和PC2不在同一网段,PC1想要ping通PC2必须要经过路由器Router。先说说正常能ping通的情况,在这种拓扑结构下,PC1上会把10.3.3.1配置成默认网关,PC1会先向路由器的这个端口发送ARP报文,请求它的物理地址,即MAC地址,这个ARP报文会以广播的形式发出,目的IP地址是10.3.3.1,路由器收到后,发现要找的是自己,会向其返回一个单播的ARP报文,告知PC1自己的MAC地址并且在自己的MAC表中添加一条对应关系,表示自己的10.3.3.1这个端口对应着IP地址为10.3.3.3的PC1。PC1拿到路由器的MAC地址后,会通过物理层,发送一个ICMP报文,将数据包传输到路由器。到达路由器后,路由器拆掉报文的以太帧头,查看IP报文,发现PC1要找的IP和自己另一个端口10.3.4.1是同一个网段,此时会向PC2发出ARP报文,向其请求MAC地址。PC2收到报文后,会向路由器返回自己的MAC地址,路由器拿到此MAC地址后会向PC2发出ICMP数据报文。PC2拿到数据报文后,会向自己的默认网关10.3.4.1也就是路由器发出ICMP回应的报文,然后路由器根据MAC映射表中的映射关系将此ICMP报文转发给PC1,一个ping流程就结束了。回去的过程不再需要ARP报文,因为这条路已经走过了,返回时就知道路了,除非过了老化时间,路由器上缓存的路线丢弃。

       现在说说ping不通的情况,如果这里的路由器和PC2不通,路由器就无法转发报文,就会把PC1发来的报文丢弃,并向PC1返回一个ICMP报文,告知PC1”Destination Unavailable“,这是ping的一种常见报错。另一种常见的报错是”Request Timed Out“,这种情况下,路由器将报文转发了出去,是PC2那边出了状况,有很多种可能性,比如说PC2关机,PC2设置了ICMP过滤防火墙等等,都会导致路由器等待超时,而向PC1返回ICMP报文,通知其无法ping通。