【5】TCP/IP協議族詳解-ICMP協議

聲明:本博客參考《TCP/IP詳解卷一:協議》

1. 概述

ICMP通常被認爲是IP層的一部分。它傳遞差錯報文以及其它需要注意的信息。ICMP報文在IP報文內部被傳輸,它們之間的關係如下圖:

2. ICMP

ICMP報文的格式如下圖所示,前4個字節都是一樣的,但是剩下的其他字節互不相同。

說明:

①類型字段可以有15個不同的值,以描述特定類型的ICMP報文。某些ICMP報文還使用代碼字段的值來進一步描述不同的條件。

②檢驗和字段覆蓋整個ICMP報文。可以檢測整個ICMP報文的正確性。

各種類型的ICMP報文的格式如下圖所示,不同類型由報文中的類型字段和代碼字段來共同決定。圖中的最後兩列表明報文的查詢或者差錯類型。

當發送一份差錯報文的時候,報文始終包含IP首部和產生ICMP差錯報文的IP數據報的前8個字節(一般會包含端口信息),這樣就可以將差錯報文和特定的協議、特定的用戶進程關聯起來。

過去曾運行ICMP差錯報文響應廣播分組,這導致了嚴重的廣播風暴,如是定下了一些不產生ICMP差錯報文的情況

①ICMP差錯報文(但是,ICMP查詢報文可能產生ICMP差錯報文)

②目的地址是廣播地址或多播地址的IP數據報。

③作爲鏈路層廣播的數據報(ARP請求報文)。

④不是IP分片的第一片。因爲只有IP分配的第一片有端口信息,所以不是第一片的報文產生ICMP差錯報文沒有應用程序處理。

⑤源地址不是單個主機的數據報。

3. ICMP報文舉例

3.1 ICMP地址掩碼請求與應答報文

ICMP地址掩碼請求用於無盤系統在引導過程中獲取自己的子網掩碼。無盤系統還可以通過BOOTP協議獲取子網掩碼。下圖顯示了ICMP地址掩碼請求和應答報文的格式:

ICMP報文中的標識符和序列號字段由發送端任意選擇設定,這些值在應答中將被返回,發送端可以把應答與請求進行匹配。

3.2 ICMP時間戳請求與應答

ICMP時間戳請求與應答允許系統向另一個系統查詢當前的時間。返回的建議值是自午夜開始計算的毫秒數,協調統一時間。它可以提供毫秒級的分辨率。下圖是ICMP時間戳請求和應答報文的格式。

3.3 ICMP端口不可達差錯

如果系統收到一份UDP數據報而目的端口與某個正在使用的進程不相符,那麼返回一個ICMP不可達報文。注意ICMP報文是在主機間交換,而不用端口號,而UDP數據報的交互是需要數據報的。下圖顯示了一般ICMP差錯報文的格式:

ICMP差錯報文必須包含產生差錯報文的IP首部和後面的8個字節。跟在IP首部後面的8個字節一般是UDP首部,而UDP首部中包含源端口和目的端口地址。使得ICMP知道如何去解釋錯誤。

下圖是ICMP端口不可達報文的格式:

我們在前面的圖中瞭解到不可達差錯的類型爲3,代碼從0到15。儘管圖中顯示ICMP報文中的第二個32bit字必須爲0,但是當代碼爲4時(“需要分片但設置了不分片比特”),路勁MTU發現機制允許路由器把外出接口的MTU填到這個32bit的低16bit上。

4.ping程序

4.1 說明

ping程序發送一份ICMP回顯應答給主機,並等待ICMP回顯應答,用來判斷主機是否可達。下圖顯示的ICMP回顯請求與應答報文的格式:

ping程序一般是在內核中實現的,它不是一個用戶進程。前面描述的ICMP地址掩碼和ICMP時間戳都是在內核中進行處理的。對於Unix系統實現的ping程序會把ICMP的標識符設置成進程ID,而序號從0開始,沒發送一次回顯請求加1。允許我們查看分組丟失、失序和重複。而windows系統則不同,它將標識符設置成指定值,而序號是將本機上所有回顯請求一起排序的結果,也就是說,你打開多個命令行窗口,運行ping程序,回顯請求的序號可能不是連續的。這兩種實現方式都可以完成目的。

4.2 IP記錄路由選項

ping程序爲我們查看IP記錄路由(RR)選項的機會。一般在ping後面加上-R即可實現。記錄路由選項可以讓每個處理數據報的路由器都將它們出口的IP地址放入IP首部的選項字段中。當數據報到達目的端時,IP地址清單會被複制到ICMP回顯應答中,這樣返回圖中所經過的路由器地址也會被放入清單中。

由於IP首部固定長度爲20字節,選項部分總共剩餘40字節,RR選項用去3個字節,這樣就剩下37個字節來存放IP地址清單了,換算下來最多隻能存放9個IP地址,這是非常有限的。現在我們要記錄路由一般會使用traceroute(非windows系統)這個命令。

下圖顯示了IP數據報中RR選項的一般格式:

 

①code字段指明IP選項的類型。對於RR來說是7。len字段是RR選擇總字節長度,在這種情況下是39。

②ptr稱爲指針字段。它是一個基於1的指針,指向存放下一個IP地址的位置。

③後面的其它字段記錄的都是IP地址。

IP路由選項舉例

該例子是從svr4去ping主機slip,並設置了路由選項,可以看到RR選擇記錄的都是路由器的出口地址。

4.3 IP時間戳選項

IP時間戳選項與記錄路由選項類似,其一般格式如下:

①code在時間戳選項中爲0x44,len和ptr的作用與記錄路由選項相同。

②OF字段表示溢出,如果路由器由於IP數據報沒有空間而不能增加時間戳選項,那麼它將增加溢出字段的值。

③FL表示標誌字段,標誌的描述如下:

時間戳的取值一般爲自UTC午夜開始計算的毫秒數,與ICMP請求與應答類型。

5 總結

ICMP是互聯網的控制報文協議。ICMP地址掩碼報文和ICMP時間戳報文是兩種典型的請求-應答型報文。它們都可以通過標識符和序列號來唯一識別一個進程。ICMP端口不可達報文是一種典型的ICMP差錯報文,ICMP差錯報文中一般攜帶IP數據報的首部和首部後的8個字節,這樣就可以去定位唯一的進程,這樣用戶程序就能夠準確反應。

ping程序是一個典型的使用ICMP回顯請求和應答報文的程序。ping服務器一般在內核中實現ICMP的功能。ping的記錄路由和記錄時間戳的選項可以記錄數據報經過的路由和各個路由上的時間戳。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章