网络 ping 不通到底有多少原因?一文搞明白!

1、引言
网络 ping 不通是网络中出现频率最高的故障之一,同时也是最让人抓狂的故障,谁没遇到过?今天就和你细说下 ping 不通的原因,看看能不能和你遇到的情况对上号。
2、系列文章
本文是系列文章中的第 20 篇,本系列文章的大纲如下:
《不为人知的网络编程(一):浅析 TCP 协议中的疑难杂症(上篇)》
《不为人知的网络编程(二):浅析 TCP 协议中的疑难杂症(下篇)》
《不为人知的网络编程(三):关闭 TCP 连接时为什么会 TIME_WAIT、CLOSE_WAIT》
《不为人知的网络编程(四):深入研究分析 TCP 的异常关闭》
《不为人知的网络编程(五):UDP 的连接性和负载均衡》
《不为人知的网络编程(六):深入地理解 UDP 协议并用好它》
《不为人知的网络编程(七):如何让不可靠的 UDP 变的可靠?》
《不为人知的网络编程(八):从数据传输层深度解密 HTTP》
《不为人知的网络编程(九):理论联系实际,全方位深入理解 DNS》
《不为人知的网络编程(十):深入操作系统,从内核理解网络包的接收过程(Linux 篇)》
《不为人知的网络编程(十一):从底层入手,深度分析 TCP 连接耗时的秘密》
《不为人知的网络编程(十二):彻底搞懂 TCP 协议层的 KeepAlive 保活机制》
《不为人知的网络编程(十三):深入操作系统,彻底搞懂 127.0.0.1 本机网络通信》
《不为人知的网络编程(十四):拔掉网线再插上,TCP 连接还在吗?一文即懂!》
《不为人知的网络编程(十五):深入操作系统,一文搞懂 Socket 到底是什么》
《不为人知的网络编程(十六):深入分析与解决 TCP 的 RST 经典异常问题》
《不为人知的网络编程(十七):冰山之下,一次网络请求背后的技术秘密》
《不为人知的网络编程(十八):UDP 比 TCP 高效?还真不一定!》
《不为人知的网络编程(十九):能 Ping 通,TCP 就一定能连接和通信吗?》
《不为人知的网络编程(二十):网络 ping 不通到底有多少原因?一文搞明白!》(☜ 本文)
3、ping 命令技术原理
了解 ping 命令原因,我们来通过一个实例来了解。
假定主机 A 的 IP 地址是 192.168.1.1 ,主机 B 的 IP 地址是 192.168.1.2 ,都在同一子网内,则当你在主机 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 层传过来的物理地址,源地址则是本机的物理地址,还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。

主机 B 收到这个数据帧后,先检查它的目的地址,并和本机的物理地址对比,如符合则接收,否则丢弃。接收后检查该数据帧,将 IP 数据包从帧中提取出来,交给本机的 IP 层协议。
同样:IP 层检查后,将有用的信息提取后交给 ICMP 协议,后者处理后,马上构建一个 ICMP 应答包,发送给主机 A,其过程和主机 A 发送 ICMP 请求包到主机 B 一模一样。
直接说:就是利用网络上机器 IP 地址的唯一性,给目标 IP 地址发送一个数据包,再要求对方返回一个同样大小的数据包来确定两台网络机器是否连接相通,时延是多少。
上面的过程就是 ping 命令的原理:主机 A 收到了主机 B 的一个应答包,说明两台主机之间的去、回通路均正常,但也并不是所有网络都是正常的,下面我们来看 ping 不通的原因。
4、同网段 ping 不通的原因概述
ping 命令不通,主要有两种情况:
1)同网段内的 ip 地址 ping 不通;
2)不同网段的 ip 地址 ping 不通。
各个情况不一样,我们首先来看同网段 ping 不通的两种情况。
5、同网段 ping 不通的情况 1:“无法访问目标主机”
目的 ip 和源 ip 是同一网段的,ping 的结果是“无法访问目标主机”,属于 ping 的请求没有发出。
我们来看下,ping 同网段不存的 ip 地址:

ping 的请求发出后,返回显示“无法访问目标主机"。
什么原因呢?说明此时 ping 的需求并没有成功发出。
这时要检查:
1)对方是否开机?ip 是否存在?
2)有跨交换机 vlan 的话,检查对应的中间 trunk 链路是否导通?
3)走直连路由是否正确?是否应该走默认路由,而走了直连路由;
4)子网掩码是否错误;
5)默认网关是否填写正确。
6、同网段 ping 不通的情况 2:“超时(time out)”
目的 ip 和源 ip 是同一网段的,ping 的结果是“超时或者 time out” ,属于 ping 的请求已经成功发出了,但目标主机没有回复。
ping 的请求发出后,返回显示“超时":

什么原因呢?这种情况是 ping 已经成功发出了,到达了主机,但是没有得到响应。
要检查:
1)检查下防火墙,防火墙禁止了对 ping 的回应;
2)子网掩码的设置错误,导致不在同一个网段;
3)设备硬件故障,导致设备没有对应的 mac 地址,无法生成路由表,而走默认路由;
4)ip 冲突,或 ip 地址与直联路由不在同一个网段;
5)网关没有设置好。
7、 跨网段 ping 不通的原因概述
不同网段 ping 不通,通常的表现有“无法访问目标主机”、“time out”,但具体分析起来其实可能的原因是比较多的,我们还是一起来看下跨网段常见的原因吧。
8、 跨网段 ping 不通的情况 1:“无法访问目标主机”
跨网段出现无法访问目标主机,说明请求没有成功发出,获取不了目的 ip 地址与 mac 地址。

可能出现的原因是:
1)目的 ip 地址不存在;
2)检查路由表是否有缺省的路由;
3)检查 arp 表是否有网关的 mac 地址;
4)有网关设置错误;
5)走了默认路由。
9、 跨网段 ping 不通的情况 2:“time out”
若显示 time out,表示 ping 的 request 消息已经发出,目的 ip 的网关已经获取到目的 ip 的 mac 地址,但是目的主机没有回复,或源主机无法收到。
这些应该检查回程路由和节点回程路由。

可能的原因有:
1)检查下防火墙,是否拦截了 ping 的请求消息;
2)检查经过节点的路由是否正确,或者是否有回程路由;
3)回程路由的硬件网卡出口和 ping 的 request 的入口网卡不是同一个;
4)交换机 vlan 对应的接口全部 down 了,导致 vlan 状态 down,vlan 的对应路由没有生成。
10、本文小结
当我们网络 ping 不通时,首先要看 ping 显示的结果是”无法访问目标主机“还是”超时“,再看是同网段,还是不同网段,采取相应的分析方法。
另外在分析与解决网络故障时,我们要熟练的了解 ping、arp、tracert、route 这几个命令的用法,可以快速的定位 ping 不通的原因。(本文已同步发布于:http://www.52im.net/thread-4857-1-1.html)
尤其是这 arp、tracert、route 这三个命令的用法,解决故障非常方便。
11、参考资料
[1] 史上最通俗的集线器、交换机、路由器功能原理入门
[2] 通俗讲解,有了 IP 地址,为何还要用 MAC 地址?
[3] 外行也能读懂的网络硬件设备功能原理速成
[4] 每天都在用的 Ping 命令,它到底是什么?
[5] 能 Ping 通,TCP 就一定能连接和通信吗?
[6] 什么是公网 IP 和内网 IP?NAT 转换又是什么鬼?
[7] 假如你来设计网络,会怎么做?
[8] 你真的了解 127.0.0.1 和 0.0.0.0 的区别?
[9] 一文搞懂 localhost 和 127.0.0.1
[10] 深入操作系统,彻底搞懂 127.0.0.1 本机网络通信
[11] 冰山之下,一次网络请求背后的技术秘密
[12] 得物自研移动端弱网诊断工具的技术实践分享
评论