【網路協議】ICMP協議、Ping、Traceroute

蘭亭風雨發表於2014-06-12

    ICMP協議

    ICMP經常被認為是IP層的一個組成部分,它是網路層的一個協議,它傳遞差錯報文以及其他需要注意的資訊,ICMP報文通常被IP層或更高層(TCP、UDP等)使用,它是在IP資料包內傳輸的。

    ICMP報文大致分為兩類:查詢報文和差錯報文。

    先來看差錯報文。當傳送IP資料包發生錯誤時(比如主機不可達、網路不可達等),ICMP協議將會傳送一個ICMP差錯報文給源主機,好讓主機做出相應的處理,也因此IP層以上的一些協議有可能做到可靠傳輸。書中給出了ICMP差錯報文中的一些組合(型別和程式碼的組合)描述:如網路不可達、網路不可達、協議不可達、埠不可達等。這裡說下埠不可達的意思:UDP的規則之一是,如果收到一份UDP資料包而目的埠與某個正在使用的程式不相符,那麼UDP返回一個ICMP不可達報文,將報文中的型別和程式碼的組合設定為埠不可達。Traceroute程式就是利用埠不可達來產生ICMP差錯報文的。

    另外,在大多數情況下,傳送IP資料包發生錯誤,會產生一個ICMP錯誤報文,但下面各種情況都不會導致產生ICMP差錯報文:

  • ICMP差錯報文不會產生差錯報文(ICMP查詢報文可能會產生ICMP差錯報文);
  • 目的地址是廣播地址和多播地址的IP資料包;
  • 作為鏈路層廣播的資料包;
  • 不是IP分片的第一片
  • 源地址不是單個主機的資料包。
    這些規則是為了防止過去允許ICMP差錯報文對廣播分組影響所帶來的廣播風暴。
    再來看ICMP查詢報文,查詢報文主要用途有:
  • 子網掩碼查詢;
  • 時間戳查詢;
  • ping查詢。

    ping程式

    ping是ICMP的一個很著名的應用。ping程式時對兩個TCP/IP系統連通性進行測試的基本工具,它只利用ICMP回顯請求和回顯應答報文,而不用經過傳輸層,ping伺服器一般在核心中試下ICMP的功能。當某一個網站訪問不了時,我們就可以ping一下這個網站,看下連通情況。比如下圖:


    這裡先ping到google的伺服器,我們可以看到連通性不是很好,丟包率為50%,而我們又ping了下Github的伺服器,連通性比較好,丟包率為0%。

    Traceroute程式

    Traceroute是ICMP協議的另一個重要應用,主要用來偵測源主機到目的主機之間所經過的路由的情況。Traceroute使用ICMP報文和IP首部中的TTL欄位,其原理很簡單,開始時傳送一個TTL欄位為1的UDP資料包,而後每次收到ICMP超時報文後,再傳送一個TTL欄位加1的UDP資料包,以確定路徑中的每個路由器,而每個路由器在丟棄UDP資料包時都會返回一個ICMP超時報文,最終到達目的主機後,由於ICMP選擇了一個不可能的值作為UDP埠(大於30000)。這樣目的主機就會傳送一個埠不可達的ICMP差錯報文。

   

相關文章