TCP/IP 協定與 Internet 網路:第五章 網際層協定  上一頁           下一頁

 

翻轉工作室:粘添壽

 

5-4 ICMP 協定

根據我們的瞭解 IP 網路是一種不可靠的傳輸方式,傳送中的封包必須經過多層路由器的轉送才能到達目的地,因此,在發送封包之前,我們很難預測該封包是否可以安全到達目的地。我們也很迫切地想知道目前網路的狀況,尤其在傳送失敗時,更想瞭解問題出在什麼地方。Internet 網路中提供一種稱之為『網際控制訊息協定』(Internet Control Message Protocol, ICMP的通訊軟體,用來偵測網路的狀況。在 IP 網路上,任何一部主機或路由器皆設置有 ICMP 協定,它們之間就可以利用 ICMP 來互相交換網路目前的狀況訊息,例如,主機不存在、網路斷線等等狀況。ICMP 訊息的產生有下列兩種情況:

(1) 障礙通知: IP 封包傳送當中,在某一網路上發生問題而無法繼續傳送,則會回應 ICMP 訊息給原封包傳送端。如圖 5-25 所示,訊號_1是由 Router_A 回應;或是由 Router_B 回應訊號_2;也有可能是由主機 B 回應訊號_3

(2) 狀況查詢:可以發送 ICMP 來查詢目前網路的情況。如圖 5-26 中,主機 A 發送 ICMP 查詢訊息,有可能由路由器回應(訊號_1 訊號_2),或由主機 B 回應訊號_3

5-25 ICMP 障礙通知

5-26 ICMP 網路狀況查詢

ICMP 封包無法直接傳送到網路上,必須如同 TCP 封包一樣被嵌入 IP 封包內(如表 5-1),以 IP 方式傳送,包裝在 IP 內的封包格式,如圖 5-27 所示。

5-27 ICMP 封包嵌入 IP 封包內傳送

        ICMP 封包的長度並不固定,隨著各種訊息型態而有不同的長度,圖 5-28 ICMP 封包格式,其各欄位功能如下:

訊息型態(Message Type):表示該 ICMP 所欲控制之訊息型態,共有 13 種型態,訊息型態之型態代表值如表 5-2 所示。

編碼(Code):對各種訊息型態進一步說明工作內容。

檢查集檢查碼(Checksum):對該封包檢查集錯誤偵測。

訊息說明(Message description):依照不同的控制訊息,而有不同的說明方式。

訊息資料(Message Data):依照不同的控制訊息,而有不同的資料表示。

 

5-28 ICMP 封包格式

5-2 ICMP 訊息型態

Message Type

ICMP 訊息功能

0

Echo Reply(回應答覆)

3

Destination Unreachable(目的地無法到達)

4

Source Quench(來源抑制)

5

Redirect(改變傳輸路徑)

8

Echo Request(回應要求)

9

Router Advertisement(路由器宣傳)

10

Router Solicitation(路由器懇請)

11

Time Exceeded for a Datagram(溢時傳輸)

12

Parameter Problem on a Datagram(參數問題)

13

Timestamp Request(時間標籤要求)

14

Timestamp Reply(時間標籤回覆)

15

Information Request(資訊要求)(停用)

16

Information Reply(資訊回覆)(停用)

17

Address Mask Request(位址遮罩要求)

18

Address Mask Reply(位址遮罩回覆)

以下分別說明各種不同型態的控制訊息:

5-4-1 回聲要求/回聲回應

『回聲要求』(Echo RequestType 8)是用來要求對方回聲,如有『回聲回應』(Echo ReplyType 0)表示對方主機或路由器工作正常。也可以用來測試網路路徑是否確實可以到達,被測試端用 Echo Reply ICMP 封包答覆對方的回聲要求。TCP/IP 的主機電腦(或路由器等設備)上皆有提供 "ping" 指令,用來實現 Echo Request 命令。例如,在主機電腦上執行 ping 163.15.2.1 指令,當 163.15.2.1 之網路設備接收到該訊號時,必須立即回應 Echo Reply,而在主機電腦上會顯示經歷時間,或主機電腦在溢時之後,未收到 Echo Reply 訊號,則會顯示 Request timed out 訊息。被測試端和測試端之間也許經過多個路由器(或網路閘門),但如果收到 Echo Reply 訊號,則表示該路徑是可到達的。以下為執行 ping 命令的結果範例:

[root@linux-1 /sbin]# ping 192.168.0.1

PING 192.168.0.1 (192.168.0.1) from 192.168.0.50 : 56(84) bytes of data.

64 bytes from 192.168.0.1: icmp_seq=0 ttl=64 time=1.8 ms

64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=1.6 ms

64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=1.6 ms

64 bytes from 192.168.0.1: icmp_seq=3 ttl=64 time=1.4 ms

--- 192.168.0.1 ping statistics ---

4 packets transmitted, 4 packets received, 0% packet loss

round-trip min/avg/max = 1.4/1.6/1.8 ms

        5-29 Echo Request Echo Reply 之封包格式,其中 Identifier(識別碼)和 Sequence Number(順序號碼)是用來檢查回聲回應封包是針對哪一個回聲要求所產生的。一般我們可以連續發送多個 Echo Request 給被測試端,每個回聲要求都給予一個順序編號放置在 Identifier 內,被測試端發送 Echo Reply 時將 Echo Request 內之 Identifier 的值放置於 Sequence Number 欄位內,告訴發送端是針對哪一個 Echo Request 的回聲回覆。另外,封包內之 Option Data 可有可無,如 Echo Request 有放置資料,回覆 Echo Replay 就依照該資料送回。

5-29 Echo Request/Reply 封包格式

        5-30 為執行 "ping 163.15.2.62" 所擷取封包的結果,由圖中可以看出 ICMP 封包是包裝在 IP 封包內(Protocol = ICMP = 01),而 IP 封包也包裝在 Ethernet 訊框內(Type = 0x0800)。ICMP Packet Type = Echo8)、Code = 0

5-30 擷取 ICMP Echo 之封包內容

5-4-2目的地無法到達

當路由器(或網路閘門)發現,某一個 IP 封包無法往下一個路徑傳送時,便發送 Destination Unreachable ICMP 封包(Type 3)給原始發送該封包者,並將封包丟棄。因此,在回應封包之 Message Data 欄位內必須註明是哪一個 IP 封包(原 IP 封包表頭和其資料前 8 個位元組)被丟棄,如圖 5-31 所示。又另封包內之 Code 欄位註明無法到達目的地的原因,其原因分類如下:

0: Network Unreachable(無法到達目的網路)

1: Host Unreachable(無法到達目的主機)

2: Protocol Unreachable(通訊協定不存在)

3: Port Unreachable(無法到達連接埠)

4: Fragmentation Needed and DF set(資料需分割並設定不可分割位元)

5: Source Route Failed(來源路徑選擇失敗)

6: Destination Network Unknown(無法識別目的地網路)

7: Destination Host Unknown(無法識別目的地主機)

8: Source Host Isolated(來源主機被隔離)

9: Communication with Destination Network Administratively Prohibited(管理上禁止和目的地網路通訊)

10: Communication with Destination Host Administratively Prohibited(管理上禁止和目的地主機通訊)

11: Network Unreachable for Type of Service(無法到達此型態的網路服務)

12: Host Unreachable for Type of Service(無法到達此型態的主機服務)

5-31 Destination Unreachable 封包格式

ICMP 目的無法到達訊息在 Internet 網路上扮演非常重要的角色,一般網路偵測各種異常狀況都會使用到它,我們以下列幾種較常用的訊息來介紹,其它未介紹之訊息的作業方式也大同小異。

(1) 無法到達目的網路或主機(Code 0/1

IP 封包被轉送到一部路由器(或主機),而該路由器(或主機)在路由表無法找到適當的路徑傳送時,如果是路由器,便傳送『無法到達網路』之訊息;如果是主機,則發送『無法到達主機』之訊息給該封包的原發送端。

(2) 通訊協定不存在(Code 2

當路由器(或主機)接收到某一封包,當拆封該封包時,發現其格式並不符合 IP 封包格式,便發送『通訊協定不存在』的訊息回原發送端。所發生的原因可能是封包在傳送過程中已被損壞,或不同網路之間封包格式轉換錯誤。

(3) 無法到達連接埠(Code 3

當主機接收到某一封包,該封包所承載之傳輸層(TCP UDP)所指定的埠口(Port)不存在(該埠口並未啟動執行),則回應『無法到達連接埠』訊息給原發送端。如果是 TCP 訊息,則回應如圖 5-32 之封包結構,其中原錯誤封包的 IP 表頭(如圖 5-10 所示)佔用 20 個位元組,另 8 個位元組為 TCP 表頭的前 8 位元組資料,原發送端收到該 ICMP 封包,便可由訊息欄位中得知哪一個埠口無法連接上。圖 5-33 是回應 UDP 訊息的格式,其中前 8 個位元組資料剛好是 UDP 的表頭。

5-32 無法到達連接埠(承載 TCP 表頭)

5-33 無法到達連接埠(承載 UDP 表頭)

(4) 資料需分割但已設定不可分割位元(Code 4

如路由器接收到一個需要分段的封包(MTU 太大),而該封包上已設定 DF(不可再分段),則會傳送一個 ICMP Fragmentation Needed and DF set 之訊息給原發送端,而 ICMP 封包上會標明下一個路徑的 MTU,請原發送端依照該 MTU 來分段封包。ICMP 封包格式如圖 5-34 所示。

5-34 ICMP Fragmentation Needed and DF set 封包格式

(5) 來源路徑選擇失敗(Code 5

路由器接收到IP 封包上有指定嚴格來源路徑選項(如 5-2-7 節),但所指定之下一路由器無法到達時,則發送 ICMP Source Route Failed 給原發送端。

5-4-3 來源抑制

當網路上路由器(或網路閘門)對於進入的封包速度過快,而來不及處理時(本身的緩衝器已溢滿),這時候會將再進入的封包丟棄,並發送一個來源抑制(Source Quench)之ICMP 封包(Type 4)給該 IP 封包的來源主機。原發送主機接收到 Source Quench 封包後會暫停或降低發出封包的速度,一直到沒有接收到路由器所發送的 Source Quench 後,再恢復原來的發送速度。Source Quench 之封包格式如圖 5-35 所示。

5-35 Source Quench 之封包格式

5-4-4 傳輸路徑改變

在某些情況下(如網路拓樸圖改變或網路斷線),路由器發現原來由它轉送的目的位址,經由別的路由器轉送會比較快速,則該路由器便利用ICMP Redirect 訊息(Type 5)通知原發送端,請它改變傳輸路徑,傳送到另一個路由器上。圖 5-36 Redirect 的封包格式,其中 "Gateway IP Address " 表示新轉向傳輸路徑的路由器之位址,Code 欄位表示轉向的原因:

0: Redirect Datagram for the Net(網路變更而轉向)

1: Redirect Datagram for the Host(主機變更而轉向)

2: Redirect Datagram for the Type of Service and Net(網路和服務型態變更而轉向)

3: Redirect Datagram for the Type of Service and Host(主機和服務型態變更而轉向)

 

5-36 Redirect 之封包格式

5-4-5 逾時傳輸

當路由器(或網路閘門)發現某一個 IP 封包內之 TTLTime to Live)為 0 時,會發送一個溢時傳輸(Time Exceeded)封包(Type 11)給原發送封包者,並將該封包丟棄。為了避免封包在網路上不停的環繞,封包發送之前會在 TTL 欄位設定一個值,表示該封包的存活時間。封包在傳送後,每經過一個路由器,就將 TTL 內的值減一。如果路由器發現某個封包內的 TTL 值為 0,便判斷該封包已在網路上環繞,找不到適當路徑到達目的地,而將其丟棄。另外一種情況,接收端也會發送 ICMP time exceeded 訊息給來源端,此情況是資料片重組(Fragment reassembly)發生問題。當 IP 封包被分為若干個資料片段傳送時,接收端收到一筆資料片段時會設定一個計時時間,如在溢時(timeout)後未收到下一筆資料片段,則將發送 ICMP time exceeded 給原傳送端。圖 5-37 Time Exceeded 之封包格式,其中 Code = 0 表示 TTL = 0 時發送該封包;而 Code = 1 表示資料片段重組失敗而發送封包。

5-37 Time Exceeded 之封包格式

5-4-6 參數問題

當路由器(或網路閘門)發現 IP 封包內的某些欄位的值(參數)不正確,而無法處理該封包時,便發送參數問題(ICMP parameter problem)封包(Type 12)給原發送者。封包格式如圖 5-38 所示,其中 Pointer 欄位表示錯誤參數之位址。

5-38 Parameter Problem 之封包格式

5-4-7 時間訊息要求及回覆

時間要求訊息(ICMP timestamp request)封包(Type 13)是用來詢問某部主機的系統時間;而時間訊息回應(ICMP timestamp reply)封包(Type 14)則用來回應系統時間,這兩個封包是用來使網路上各設備的時間達到同步。圖 5-39 Timestamp 的封包格式,其中 Originate Timestamp 表示詢問者自己的時間、Receive Timestamp 表示被詢問者接收到 ICMP timestamp request 封包的時間、Transmit Timestamp 為被詢問者發送回應的時間。前一項為詢問者的時間基準;後二項為被詢問者的時間基準。時間單位都是 millisecond,並以格林威治時間為基準。

5-39 Timestamp Request/Reply 之封包格式

5-4-8 遮罩位址要求及回覆

遮罩位址要求及回覆(ICMP address mask request/reply)(Type 17/18)是被用來要求獲得或回應某一個次網路(Subnet)的位址遮罩(mask)時所使用。圖 5-40 Address Mask Request/Reply 的封包格式。

5-40 Address Mask Request/Reply 之封包格式

 

 

<GOTOP>