首先介紹一下ping 指令的基本過程:(這部分摘自網絡)html
咱們如下面一個網絡爲例:有A、B、C、D四臺機子,一臺路由RA,子網掩碼均爲255.255.255.0,默認路由爲192.168.0.1web
1.在同一網段內緩存
在主機A上運行「Ping 192.168.0.5」後,都發生了些什麼呢?服務器
(1)首先,Ping命令會構建一個固定格式的ICMP請求數據包,//構建ICMP的數據包網絡
(2)而後由ICMP協議將這個數據包連同地址「192.168.0.5」一塊兒交給IP層協議(和 ICMP同樣,其實是一組後臺運行的進程);//ICMP+IP地址(目的主機)學習
(3)IP層協議將以地址「192.168.0.5」做爲目的地址,本機IP地址做爲源地址,加上一些其餘的控制信息,構建一個IP數據包,並想辦法獲得192.168.0.5的MAC地址(物理地址,這是數據鏈路層協議構建數據鏈路層的傳輸單元——幀所必需的),以便交給數據鏈路層構建一個數據幀。關鍵就在這裏,IP層協議經過機器B的IP地址和本身的子網掩碼,發現它跟本身屬同一網絡,就直接在本網絡內查找這臺機器的MAC,若是之前兩機有過通訊,在A機的ARP緩存表應該有B機IP與其MAC的映射關係,若是沒有,就發一個ARP請求廣播,獲得B機的MAC, 一併交給數據鏈路層。後者構建一個數據幀,目的地址是IP層傳過來的物理地址,源地址則是本機的物理地址,還要附加上一些控制信息,依據以太網的介質訪問規則,將它們傳送出去。spa
主機B收到這個數據幀後,先檢查它的目的地址,並和本機的物理地址對比,如符合,則接收;不然丟棄。接收後檢查該數據幀,將IP數據包從幀中提取出來,交給本機的IP層協議。一樣,IP層檢查後,將有用的信息提取後交給ICMP協議,後者處理後,立刻構建一個ICMP應答包,發送給主機A,其過程和主機A發送ICMP請求包到主機B如出一轍。code
總結步驟:orm
(1) A主機構建一個ICMP格式的數據包;htm
(2) ICMP協議+B主機的IP地址 交給IP協議;
(3) IP層構建一個數據包(A主機的IP地址+控制信息+B主機的IP地址),得到B主機的MAC地址,以便構建一個數據幀;
(IP協議會根據B主機的IP地址和本身的子網掩碼判斷是否是屬於同一層網絡。若是是屬於同一層網絡的話,就會得到B主機的MAC地址)
(4) 主機B接受到主機A的發過來的數據幀之後,先檢查該幀中包含的B的IP地址,並和本地的物理地址進行比對,若是符合的話,就接受,不然,就拋棄。一樣,須要將該數據幀交由本身的IP層協議,IP層檢查之後,再交由ICMP協議,構建一個ICMP的應答包,發送給主機A。
2.不在同一網段內
在主機A上運行「Ping 192.168.1.4」後,開始跟上面同樣,到了怎樣獲得MAC地址時,IP協議經過計算髮現D機與本身不在同一網段內,就直接將交由路由處理,也就是將路由的MAC取過來,至於怎樣獲得路由的MAC,跟上面同樣,先在ARP緩存表找,找不到就廣播吧。路由獲得這個數據幀後,再跟主機D進行聯繫,若是找不到,就向主機A返回一個超時的信息。
對Ping後返回信息的分析
1.Request timed out
這是你們常常碰到的提示信息,不少文章中說這是對方機器置了過濾ICMP數據包,從上面工做過程來看,這是不徹底正確的,至少有下幾種狀況。
(1) 對方已關機,或者網絡上根本沒有這個地址:好比在上圖中主機A中PING 192.168.0.7 ,或者主機B關機了,在主機A中PING 192.168.0.5 都會獲得超時的信息。
(2)對方與本身不在同一網段內,經過路由也沒法找到對方,但有時對方確實是存在的,固然不存在也是返回超時的信息。
(3)對方確實存在,但設置了ICMP數據包過濾(好比防火牆設置)。
怎樣知道對方是存在,仍是不存在呢,能夠用帶參數 -a 的Ping命令探測對方,若是能獲得對方的NETBIOS名稱,則說明對方是存在的,是有防火牆設置。若是得不到,多半是對方不存在或關機,或不在同一網段內。
(4)錯誤設置IP地址
正常狀況下,一臺主機應該有一個網卡,一個IP地址,或多個網卡,多個IP地址(這些地址必定要處於不一樣的IP子網)。但若是一臺電腦的「撥號網絡適配器」(至關於一塊軟網卡)的TCP/IP設置中,設置了一個與網卡IP地址處於同一子網的IP地址,這樣,在IP層協議看來,這臺主機就有兩個不一樣的接口處於同一網段內。當從這臺主機Ping其餘的機器時,會存在這樣的問題:
A.主機不知道將數據包發到哪一個網絡接口,由於有兩個網絡接口都鏈接在同一網段。
B.主機不知道用哪一個地址做爲數據包的源地址。所以,從這臺主機去Ping其餘機器,IP層協議會沒法處理,超時後,Ping 就會給出一個「超時無應答」的錯誤信息提示。但從其餘主機Ping這臺主機時,請求包從特定的網卡來,ICMP只須簡單地將目的、源地址互換,並更改一些標誌便可,ICMP應答包能順利發出,其餘主機也就能成功Ping通這臺機器了。 2.Destination host Unreachable
(1)對方與本身不在同一網段內,而本身又未設置默認的路由,好比上例中A機中不設定默認的路由,運行Ping 192.168.0.1.4就會出現「Destination host Unreachable」。
(2)網線出了故障
這裏要說明一下「destination host unreachable」和 「time out」的區別,若是所通過的路由器的路由表中具備到達目標的路由,而目標由於其餘緣由不可到達,這時候會出現「time out」,若是路由表中連到達目標的路由都沒有,那就會出現「destination host unreachable」。
3.Bad IP address
這個信息表示您可能沒有鏈接到DNS服務器,因此沒法解析這個IP地址,也多是IP地址不存在。
4.Source quench received
這個信息比較特殊,它出現的機率不多。它表示對方或中途的服務器繁忙沒法迴應。
5.Unknown host——不知名主機
這種出錯信息的意思是,該遠程主機的名字不能被域名服務器(DNS)轉換成IP地址。故障緣由多是域名服務器有故障,或者其名字不正確,或者網絡管理員的系統與遠程主機之間的通訊線路有故障。
6.No answer——無響應
這種故障說明本地系統有一條通向中心主機的路由,但卻接收不到它發給該中心主機的任何信息。故障緣由多是下列之一:中心主機沒有工做;本地或中心主機網絡配置不正確;本地或中心的路由器沒有工做;通訊線路有故障;中心主機存在路由選擇問題。
7.Ping 127.0.0.1:127.0.0.1是本地循環地址
若是本地址沒法Ping通,則代表本地機TCP/IP協議不能正常工做。
8.no rout to host:網卡工做不正常。
9.transmit failed,error code:10043網卡驅動不正常。
10.unknown host name:DNS配置不正確。
總結:咱們把出現的情況列出以下的表格:
Bad IP address | 這個信息表示您可能沒有鏈接到DNS服務器,因此沒法解析這個IP地址,也多是IP地址不存在 |
Source quench received | 這個信息表示您可能沒有鏈接到DNS服務器,因此沒法解析這個IP地址,也多是IP地址不存在。 |
Unknown host | 該遠程主機的名字不能被域名服務器(DNS)轉換成IP地址。故障緣由多是域名服務器有故障,或者其名字不正確,或者網絡管理員的系統與遠程主機之間的通訊線路有故障。 |
No answer | 這種故障說明本地系統有一條通向中心主機的路由,但卻接收不到它發給該中心主機的任何信息。故障緣由多是下列之一:中心主機沒有工做;本地或中心主機網絡配置不正確;本地或中心的路由器沒有工做;通訊線路有故障;中心主機存在路由選擇問題。 |
no rout to host | 網卡工做不正常 |
unknown host name | DNS配置不正確 |
下面咱們講解一下TCP/IP詳解上的問題:
關於LAN和WAN的輸出咱們再也不解釋,二者的區別主要在於對方主機返回數據幀時間不一樣,以及廣域網存在數據包的丟失。
介紹幾個比較新鮮的名詞:
IP時間戳:
下一個步驟是學習ping的代碼,給出一個連接:
http://www.cnblogs.com/ggjucheng/archive/2012/02/17/2355564.html