PING命令與ICMP協議


概述

不管是開發中,還是電腦日常使用,常常遇到網絡不通的問題。這時你就會習慣性的使用一個命令ping,查看問題出在哪里,那它是如何工作的哪?

ICMP協議

ICMP就是互聯網控制報文協議,網絡包在復雜的網絡環境傳輸時,常常遇到各種各樣的問題。當遇到問題的時候,總不能讓這個網絡包死的不明不白,要傳出消息來,報個情況,是怎么死的,為什么死的,這樣才可以調整傳輸的策略。所以ICMP的功能主要有兩種,確認IP包是否成功到底目標地址,通知在發送過程中IP被丟棄的原因。

ICMP報文是封裝在IP包里的,一個ICMP報文包括IP報頭,ICMP報頭和ICMP報文,若IP報頭中的協議字段為1時,說明是一個ICMP報文。

類型:占一個字節,標識ICMP報文的類型,不同類型有不同的代碼,它有分為兩大類,一類為差錯報文,一類為查詢報文。

代碼:與類型字段一起標識ICMP報文的詳細類型。

校驗和:檢驗報文在傳輸過程中是否出現差錯,和IP報頭中的校驗和是一樣的。

查詢報文類型

ping就是查詢報文,一種主動的請求,並且獲得主動應答的ICMP協議。ping發起請求命令,會發送一個ICMP Echo Request給對端,請求得到回復,就叫ICMP Echo Reply,它對比原生的ICMP,多了兩個字段,一個是標識符,一個是序號。並且ping命令會統計響應時間和TTL(生存周期)來計算往還時間,說明路程的長短。

假定我們在一個子網內,主機A的IP為192.168.6.1,主機B的IP為192.168.6.2,。在主機A運行ping 192.168.6.2

  1. ping命令執行的時候,源主機會構建一個ICMP請求的數據包。里頭有兩個重要的字段,就是我們前面說的標識符和序號,對於請求數據包而言該字段的類型為8(回送請求),另一個就是順序號,區分連續ping的時候發出的多個數據包,每發出一個請求數據包,順序號會自動加1,並且會在報文的數據部分插入發送時間。
  2. ICMP協議將這個數據包連同192.168.6.2交給IP層,IP層將會以192.168.6.2作為目標地址,本機IP地址作為源地址,還有一些控制信息構建為一個IP數據包
  3. 加入MAC頭,先判斷一下是不是在一個子網內,如果是就在ARP映射表中查找IP地址192.168.6.2對應的MAC地址,則可以直接使用。如果沒有,就要發送ARP協議查詢MAC地址,獲取MAC地址后。構建一個數據幀在附加上一些控制信息,依據以太網的介質訪問規則,將數據包發送出去。
  4. 192.168.6.2收到這個數據幀后,檢查下MAC目標地址,和本機的MAC地址對比,符合就接收,不符丟棄。檢查該數據幀,將IP數據包從幀中提取出來,交給本機IP層,IP層檢查完后,有用信息提取后交給ICMP協議。
  5. 192.168.6.2收到后,會構建一個ICMP應答包,應答的類型字段為0,順序號為接收到的請求包的序號,發給主機192.168.6.1
  6. 在規定時限內,源主機也就是192.168.6.1沒有接到ICMP的應答包,就說明目標主機不可達,如果接收到ICM應答包,則說明目標主機可達。然后檢查當前時刻減去該數據最初從源主機發出的時刻,也就是ICMP數據包的時間延遲。

注意:有很多中間設備都是禁止ping的,並不是說網絡不通。這個時候我們就要使用其他協議來檢查網絡是否通暢,如telnet等

差錯報文類型

這是ICMP協議的另一個報文種類,差錯報文中常用的類型主要有5種。終點不可達,端口不可達,源點抑制,超時,參數問題,改變路由

  1. 假定主機A給主機B發送一個郵件,網絡傳輸中要經過很多台路由器,若R1接到郵件后,發生了故障,不知道下一步該發給哪個路由設備或那台主機設備,這封郵件也就沒法到達主機B,這時路由R1就會把數據包丟棄並向主機A發回一個終點不可達的數據報文。這時數據報文,類型標號為3,表示是不可達的錯誤類型。
  2. 目標系統收到一個IP數據報某個服務請求時,本地沒有此服務,會向源頭返回ICMP端口不可達信息。
  3. 假定主機A給主機B發送一個視頻,主機A傳輸非常快,主機B接收慢的話,可能導致數據都擁塞在某一台設備上,這台設備解決不了擁塞問題,會給源主機發送一個源點抑制報文反饋給源主機,告訴源主機數據擁塞了,在發送就會丟數據,告訴他放慢發送數據。類型標號為4,
  4. 如果超過網絡包生存周期還是沒到,就是超時,主機A給主機B發送一個數據報文時,該數據報文在網絡會有一個TTL生存時間字段,沒經過一台路由,TTL字段就會減1,路由器收到數據報文后TTL字段值減1后為0的話,該路由器就會把數據包丟棄並向主機A發送一個ICMP超時報文,類型是為11
  5. 當路由器后目標追收到數據報的首部中有的字段值不正確時,就會丟棄數據報,向源點發送參數問題的報文,類型為12
  6. 路由器改變路由報文發送給主機,讓主機知道下次應將數據報文發送給另外的路由器。類型為5

traceroute

traceroute的應用就是差錯報文類型使用,它的目的就打印出可執行的程序主機,一直到目標主機之前要經歷多少路由器,也就是路由追蹤。traceroute使用ICMP的規則,故意制造一些能產生錯誤的場景,就是故意設置特殊的TTL,追蹤去往目的地時沿途經過的路由器。

======================================================

如發現錯誤,請及時留言,lz及時修改,避免誤導后來者。感謝!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM