Chapter 9 網際網路控制訊息 通訊協定
目標 本章結束後,您將能夠: 熟悉 ICMP 訊息的格式 知道錯誤回報訊息的各種類型 知道詢問訊息的各種類型 可以去計算 ICMP 的檢查碼 知道如何使用ping 和 traceroute 指令 了解 ICMP 套件中的各模組及其交互運作的情況
9.1 訊息類型 ICMP 的訊息可分為兩大類: 錯誤回報訊息 ( error-reporting message ) 詢問訊息 ( query message ) 錯誤回報訊息回報路由器或目的端主機在處理 IP 封包時可能遇到的問題。 詢問訊息協助一台主機或網路管理者獲得另一台主機或路由器的相關訊息。
9.2 訊息格式 ICMP 訊息包含一個 8 位元組的標頭及一個非固定長度的資料區。儘管每種訊息的標頭格式不盡相同,但前面 4 個位元組都是一樣的。
9.3 錯誤回報 IP 為一種非可靠性的通訊協定,也就是說,IP 並不關心錯誤檢查與錯誤控制。ICMP 的設計就是為了補足這些缺點,然而 ICMP 並不是改正錯誤,它只是回報而已,錯誤的更正留給上層的通訊協定來處理。 本節所討論的主題包括: 無法到達目的地 來源端放慢 時間超過 參數問題 轉址
ICMP 總是將錯誤訊息送回原始的傳送者。 請注意: ICMP 總是將錯誤訊息送回原始的傳送者。
請注意: 以下是 ICMP 錯誤訊息的相關重點: 針對攜帶 ICMP 錯誤訊息的資料包,不會再產生一個 ICMP 錯誤訊息。
請注意: 在無法到達目的地的訊息中,若其代碼為 2 或 3 者,只能由目的端主機產生。其他的無法到達目的地的訊息均由路由器產生。
路由器無法完全偵測到 所有妨礙封包傳送的問題。 請注意: 路由器無法完全偵測到 所有妨礙封包傳送的問題。
請注意: IP 協定沒有流量控制的機制。
請注意: 來源端放慢訊息告知來源端,資料包因為某個路由器或目的端主機發生壅塞的狀況而被移除,來源端應該放慢傳送的速度,直到壅塞情況有所改善。
對每個被移除的資料包, 都要送出一個來源端放慢訊息。 請注意: 對每個被移除的資料包, 都要送出一個來源端放慢訊息。
請注意: 當一台路由器接收到一個存活時間為 0 的資料包時,路由器就移除這個資料包並送出一個時間超過的訊息給原始的傳送端。
請注意: 如果目的端主機在設定的時間內,沒有收到全部的片段,則目的端主機就移除已收到的片段,並送出一個時間超過的訊息給原始的傳送端。
請注意: 在時間超過的訊息中,路由器使用代碼 0 來表示存活時間值是 0。目的端主機使用代碼 1 來表示有些片段沒有在預設的時間內到達。
參數問題訊息是由路由器或目的端主機產生。 請注意: 參數問題訊息是由路由器或目的端主機產生。
請注意: 一台主機通常在開機時,只有小小的路由表,再慢慢地更新與變大。而轉址訊息是可以達成此一結果的工具之一。
請注意: 轉址訊息是由路由器傳送給 在同一區域網路上的一台主機。
9.4 詢問 ICMP 也可以診斷某些網路問題,這是藉由詢問 ( query ) 訊息來完成。詢問訊息有四對。這些 ICMP 的詢問訊息是由一個節點送出,然後目的節點以特定格式加以回應。 本節所討論的主題包括: 回應要求與答覆 時間戳記要求與答覆 位址遮罩要求與答覆 路由器請求與公告
請注意: 一個回應要求訊息可由路由器或主機送出,而回應答覆的訊息由收到回應要求訊息的主機或路由器送出。
請注意: 網路管理者也可以用回應要求及回應答覆訊息來檢查 IP 通訊協定的運作。
請注意: 回應要求及回應答覆訊息可以用來測試能否到達某一台電腦,通常藉由 ping 指令來達成。
請注意: 即使兩台機器的時間不同步,時間戳記要求與時間戳記答覆訊息還是可以用來計算資料包在來源端與目的端機器之間的往返時間 (RTT)。
請注意: 如果已經知道正確的單程時間,則時間戳記要求與時間戳記答覆訊息可以用來同步雙方機器時鐘的時間。
9.5 檢查碼 以 ICMP 而言,檢查碼是以整個訊息來計算 ( 包括標頭與資料 )。 本節所討論的主題包括: 檢查碼的計算 檢查碼的測試
範例1 圖9.19 說明了計算檢查碼的過程,以回應要求訊息為例,整個訊息被分為多個 16 位元的字組,這些字組被加總起來後,求其補數而獲得檢查碼,即可放到檢查碼欄位內。
9.6 除錯工具 我們介紹兩種使用 ICMP 的除錯工具:ping 和traceroute。 本節所討論的主題包括: Ping
範例2 我們使用 ping 程式來測試 fhda.edu 伺服器,其結果如下: 接下一張投影片
範例2 (續)
範例3 在第2個範例中,我們想知道 adelphia.net 郵件伺服器是否還活著並可以正常運作,其結果如下: 接下一張投影片
範例3 (續)
範例4 我們使用 traceroute 程式來找出由 voyager.deanza.edu 電腦到fhda.edu 伺服器之間的路徑選擇,其結果如下: 在命令列之後未編號的那一行顯示了目的地為153.18.8.1,TTL的值為 30 個站台,封包包含了 38 個位元組 ( 20 個位元組的 IP 標頭、8 個位元組的 UDP 標頭、及 10 個位元組的應用層資料 )。Traceroute 程式使用 10 個位元組的應用層資料記錄封包。 接下一張投影片
範例4 (續) 第一行顯示了第一個經過的路由器,此路由器的名稱為 Dcore.fhda.edu、其 IP 位址為 153.18.31.254、第一次測試到的 RTT 為0.995 ms、第二次為 0.899 ms、第三次為 0.878 ms 。 第二行顯示了第二個經過的路由器,此路由器的名稱為 Dbackup.fhda.edu、其 IP 位址為 153.18.251.1、三次的 RTT 測試也顯示出來。 第三行顯示目地端主機。因為沒有下一行了,所以我們知道這是目地端主機。目的端主機應該是 fhda.edu 伺服器,但是此伺服器也被命名為 tiptoe.fhda.edu、其 IP 位址為153.18.8.1、三次的 RTT 測試也顯示出來。
範例5 在此範例中,我們追蹤一個更長的路徑選擇,此路徑到達xerox.com。 在此,來源端與目的端之間有 17 個站台。有一些 RTT 的值看起來很獨特 ( 更遠的站台之 RTT 值反而比較小 ),這有可能是因為路由器太過忙碌而無法立即處理封包的轉送所造成的結果。
範例6 有趣的一點是,主機可以傳送 traceroute 封包給它自己,這只要將主機自己指定為目的地即可。就我們預期一樣,此封包會送到迴路位址。
範例7 最後,我們使用 traceroute 程式來找出 fhda.edu 到 mhhe.com ( McGraw-Hill伺服器 ) 之間的路徑選擇。我們可以發現我們無法找出所有的路徑選擇,當 traceroute 程式在 5 秒之內沒有接收到任何回應時,它會顯示星號來告知有問題發生,並且嘗試下一個站台。
9.7 ICMP套件 為了說明 ICMP 如何傳送與接收 ICMP 訊息的概念,我們展示一個我們的版本的 ICMP 套件。此套件包括了兩個模組:輸入模組 ( input module ) 及輸出模組 ( output module ) 。 本節所討論的主題包括: 輸入模組 輸出模組