網路層:轉送與 IP

網際網路控制訊息協定(ICMP)

/ I-C-M-P /

ICMP,網際網路控制訊息協定,是網路層回送狀態與錯誤回報的方式——IP 內建的回饋通道。由於 IP 本身只是嘗試、然後保持沉默,ICMP 就是路由器能說出「我送不出去」「那個封包太大了」或「它的存活時間用完了」的管道。可以把它想成郵局的退件單和「無法投遞」戳章:它不載運你平常的信件,它載運的是關於你的信件發生了什麼事的消息。

一個 ICMP 訊息本身是裝在一個 IP 資料報裡傳遞的(IPv4 協定號碼是 1,ICMPv6 是 58),並帶有一個類型(type)與一個代碼(code)。最重要的錯誤類型有:目的不可達(無路由、連接埠關閉,或需要分段卻被禁止)、超過時間(TTL 歸零)、以及封包太大(在 IPv6 中用於路徑 MTU 探索)。也有資訊/診斷類型——回應請求(echo request)與回應回覆(echo reply),這正是 ping 工具用來檢查主機是否存活、量測往返時間所用的。ICMP 錯誤訊息很貼心地附上原始出問題封包的開頭,好讓傳送端能分辨是自己哪個封包觸發了這份回報。

有兩個著名工具建立在 ICMP 之上。ping 送出回應請求、為回覆計時。traceroute 送出刻意採用極小、逐步遞增 TTL(1、2、3……)的封包,使每個封包都在再往前一跳的地方死亡,而每個死亡的封包都觸發來自不同路由器的「超過時間」ICMP——從而一跳一跳地揭露路徑。一個提醒:許多網路會對 ICMP 限速或封鎖,所以一台不回應 ping 的主機未必當機,而封鎖了錯誤的 ICMP 類型(如「封包太大」)會悄悄破壞路徑 MTU 探索。

對某伺服器執行 traceroute:第一個封包(TTL 1)死在你的路由器,它回送 ICMP 超過時間;第二個(TTL 2)死在再往前一跳;依此類推。每個回覆的來源位址就是路徑上的下一台路由器,一行一行地把整條路線畫出來。

traceroute 把 TTL 與 ICMP 超過時間當成工具,來描繪出路徑。

ICMP 載運的是控制與診斷,不是你的應用程式資料。被封鎖的 ping 不能證明主機當機,而封鎖了錯誤的 ICMP 類型,會悄悄破壞像路徑 MTU 探索這樣的功能。

又称
Internet Control Message ProtocolICMPICMPv6網際網路控制訊息協定