ping命文件尺寸所限,详细见下面链接令是检测源和目的ip间ip层导通性的icmp协议,属于ip层协议。源主机ping发出含一串数据的包(如123456789abcde之类),封装在ip层里,对方收到后,把这串包原路送回来,源pc收到后,认为是对方可达。所以它涉及二层的mac地址和ip层的交互。当对方存在问题时(ip地址不存在,没有路由等),对方的ip或者经过的网络节点会返回icmp的差错消息给终端源ip。
ping的过程是,输完命令后,根据目的ip,先查路由表,看目的主机ip是否走直连路由,是的话就去检查mac地址缓存表,看是否有该地址的mac地址缓存,没有的话,是用直连路由的一个本机接口去发出请求目的ip的mac地址的arp请求request消息,收到arp响应后,用这个mac地址封装二层数据,发出icmp协议的ping请求消息。mac地址缓存里有,直接封装ping的request消息。arp消息没有得到mac地址,不发出ping的request消息,回显端口不可达。
查路由表发现不是直连路由和静态路由的话,走默认路由的话,就去查是否有默认网关的mac地址,没有去请求网关的mac地址,有就直接封装ping的request消息。
局域网内网中ping不通,有几种情况:
一,一种情况是目的ip和源ip是同一网段的,ping的结果是“无法访问目标主机”,这时用arp -a | findstr ip地址,看是否获取到对应的ip地址的mac,没有的话,应该是ping命令执行时,发出的请求对方的mac地址的arp消息没有得到应答,此时根本没有发出ping的request消息。这时,要检查对方是否开机?ip是否存在?有跨交换机vlan的话,检查对应的中间trunk链路是否导通?arp消息是否能到达目的ip侧?对方是否收到arp请求消息?最好能在对方pc上抓包,看arp请求消息是否到达目的地址的主机,再逐级排查。
ping的过程,同网段的查询路由表,发现是直连路由,查询arp缓冲没有发现目的ip的mac地址,就用直连接口的ip作为源ip去查询目的ip的mac地址,如果得到响应,会用此mac地址作为目的mac组成icmp请求包发出。没有响应,arp请求消息会发出多次在ping的过程中。
如下图:我们用windump抓包,去ping一个不存在的地址。
cmd下用ipconfig/all去查看网卡的信息如下:

去ping一个ip为192.168.1.105去看看结果如何?同时用windump进行抓包观察:


正常的ping消息有响应的抓包如下:

若是同网段,ping后显示time out超时,检查arp -a有对应的目的ip的mac地址,证明网络层的ping的request消息已经发出,而且已经到达目的主机的网络,要么没回ping的reply消息,要么回到其他地方去了?前者检查对应主机的防火墙是否设置,禁止了对ping的request进行响应?放开就行了或者关闭防火墙。后者检查路由表,是否因为掩码问题,发给其他地方?
二,目的ip和源ip不是同一网段
ping命令发出后,提示“无法访问目标主机”,跨网段ping消息,没有直连路由的话,会首先检查是否有配置默认网关,有的话,检查arp缓存是否有网关的mac地址,没有的话,会发出arp查询网关的mac地址,有的并且响应后,直接组包发给网关的mac。出问题时:应该去检查路由表是否有缺省的路由?检查arp表是否有网关的mac地址?没有路由,添加对应的网关地址;没有获得网关mac,检查到网关通道是否通畅?还有一种情况目的ip是不存在的ip,经过目的ip网关给回了主机不可达的icmp消息,过程是这边ping的request消息发到目的ip的网关,目的ip的网关没有对应的ip的mac地址,就会用自己的ip和mac发起arp查询,没有得到响应的话,就会向源ip地址发出host unreachable的icmp消息。源ip就显示无法访问目的主机。
模拟过程:用pc192.168.205.201(网关是205.1)去ping局域网内另一主机192.168.206.10(网关206.1,192.168.206.10此主机不存在)的情况:

用wireshark抓包发现,205网段的网关192.168.205.1发给192.168.205.201一个主机不可达消息。

发现网关给回了主机不可达,交换机上查询主机地址,发现没有此主机。在206网段的其他pc上抓包,过滤对应c0-a8-ce-0a的arp广播消息,能发现网关每隔一秒发出一次arp的广播查询消息,因为没有响应,所以会发出多次。

Arp查询没有成功,所以交换机给源主机回主机不可达的icmp消息。

若显示time out,表示ping的request消息已经发出,这时应该在被叫侧检查ping的request是否到达,若是windows系统,可以使用wireshark进行抓包,过滤对应源ip或者icmp消息,看是否到达,若到达,看是否有回报发出,有的话,检查回程路由,看回报的mac地址是否和ping的request来包是否一致,不一致,检查回程路由和节点回程路由。没有回包,检查防火墙和回程路由。
去ping一台内网的pc192.168.206.110的情况:

若没有到达目的ip地址,就检查经过节点的路由是否正确,能通道是否导通?
在目的主机上抓包看到,包已经到目的主机,但目的主机没有回。

检查网关的mac地址和路由表里都正常,检查防火墙发现防火墙开启,关闭后正常。

关闭防火墙后正常:

没有回程路由的仿真:
如图,ping 172.103.201.105一台内网centos7.0的服务器。在目的主机侧执行tcpdump的结果tcpdump -i em1 -nne icmp:

Ping的request已经收到,为啥没有回?检查防火墙是否开启和回程路由是否存在?

防火墙未打开,检查回程路由是否存在?

发现没有对应的回程路由,192.168.205.0。添加后观察:

添加路由后,ping观察。


结论:
Ping出现无法访问目标主机时,一般是本机或者网关没有获得对方主机的mac地址,要么ip不存在或者没有开机或者arp消息对方没有收到。Ping出现time out时,是对方没有应答,一般检查防火墙是否打开,或者回程路由是否存在,或者回程路由有误,回包发向了错误的地方。还有的情况是对方是另一个vlan下的ip,当整个vlan接口状态是down的情况下,会受到网关发来的ttl exceed的回显。没有路由的情况下,也会出现类似的回显。
总之:ping不通,要根据回显判断可能的情况来确定问题,并进行相应的处理。