網絡ping不通到底有多少原因?一文搞明白!
1、引言
網絡ping不通是網絡中出現頻率最高的故障之一,同時也是最讓人抓狂的故障,誰沒遇到過?今天就和你細說下ping不通的原因,看看能不能和你遇到的情況對上號。
技術交流:

- 移動端IM開發入門文章:《新手入門一篇就夠:從零開發移動端IM》
- 開源IM框架源碼:https://github.com/JackJiang2011/MobileIMSDK(備用地址點此)
(本文已同步發布于:http://www.52im.net/thread-4857-1-1.html)
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不通的原因。
尤其是這arp、tracert、route這三個命令的用法,解決故障非常方便。
11、參考資料
[7] 假如你來設計網絡,會怎么做?
[8] 你真的了解127.0.0.1和0.0.0.0的區別?
[10] 深入操作系統,徹底搞懂127.0.0.1本機網絡通信
[11] 冰山之下,一次網絡請求背后的技術秘密
[12] 得物自研移動端弱網診斷工具的技術實踐分享
作者:Jack Jiang (點擊作者姓名進入Github)
出處:http://www.52im.net/space-uid-1.html
交流:歡迎加入即時通訊開發交流群 215477170
討論:http://www.52im.net/
Jack Jiang同時是【原創Java
Swing外觀工程BeautyEye】和【輕量級開源移動端即時通訊框架MobileIMSDK】的作者,可前往下載交流。
本博文
歡迎轉載,轉載請注明出處(也可前往 我的52im.net 找到我)。


浙公網安備 33010602011771號