1. 程式人生 > >TCP/IP協議之ICMP協議

TCP/IP協議之ICMP協議

一、定義

ICMP協議(Internet Control Message Protocol)是Internet控制訊息協議,用於在IP主機、路由器之間傳遞控制訊息。這些控制訊息雖然不是使用者資料,但是,對於保證使用者資料的正確傳輸有著重要的作用。

二、特點

1、ICMP出現的背景

IP協議完成了資料在各主機間的遞交,但是,IP協議是一種無連線的不可靠的資料交付,IP協議不提供任務錯誤校驗和恢復機制。因此,設計了ICMP協議彌補上訴缺陷。

2、ICMP報文封裝

 ICMP封裝在IP報進行傳輸。ICMP報文字身被封裝在IP資料報的資料區中,而這個IP資料報又被封裝在幀資料中。在IP資料報報頭中的協議(Protocol)欄位設定成1,表示該資料是ICMP報文。


三、ICMP報文格式

1、ICMP報文格式各種型別的ICMP報文由下圖所示。由報文中的型別欄位和程式碼欄位共同決定了ICMP報文的型別。     (1)型別(Type)欄位,長度是1位元組,用於定義報文型別。
     (2)程式碼(Code)欄位,長度是1位元組,表示傳送這個特定報文型別的原因。
     (3)校驗和(Checksum)欄位,長度是2位元組,用於資料報傳輸過程中的差錯控制。與IP報頭校驗和的計算方法類似,不同的是其是對整個ICMP報文進行校驗。
     (4)報頭的其餘部分,其內容因不同的報文而不同。
     (5)資料欄位,其內容因不同的報文而不同。對於差錯報告報文型別,資料欄位包括ICMP差錯資訊和觸發ICMP的整個原始資料報,其長度不超過576位元組。
ICMP報文包含:ICMP首部(8位元組)+IP資料報首部+IP資料報資料區的前8個位元組。

具體如下圖:

IP包首部要被傳回的原因,因為IP首部中包含了協議欄位,使得ICMP可以知道如何解釋後面的8個位元組。而IP首部後面的8位元組(UDP的首部或者TCP首部,UDP和TCP首部的8個位元組分別包含了16位的目的埠號和源埠號),根據源埠號就可以把差錯報文與某個特定的使用者程序關聯。2、ICMP報文型別從功能上劃分,ICMP報文可分為2大類:ICMP差錯報文和ICMP查詢報文。其中,差錯報告報文包括:目的不可達、源主機消亡、超時、引數問題、重定向。查詢報文包括:迴應請求和應答(ping)、資訊請求和應答(已棄用)、時間戳和時間戳應答、地址掩碼請求和應答、路由器通告和請求。如下圖所示,圖中的最後兩列表明ICMP報文是一份查詢報文還是一份差錯報文。
 (1)常用的差錯報文詳解

1)目的站不可達報文

當路由器不能給資料報找到合適的路由路徑,或者主機不能將資料報遞交給上層協議時,相應的IP資料報就會被丟棄,然後產生一個目的站不可達差錯控制報文給源主機。

2)資料報超時報文

       在資料報的傳輸過程中,首部的TTL值用於防止資料報因路由表的問題而無休止地在網路中傳輸。當TTL值為0時,路由器會丟棄當前的資料報,併產生一個 ICMP資料報超時報告。另外在信宿進行分片重組時會啟動重組定時器,一旦重組 定時器超時,信宿就會丟棄當前正在重組的資料報,然後產生一個ICMP資料報超 時報告,並向信源傳送該超時報告。 

       資料報超時報告的型別和程式碼的含義如表所示。型別值11表示是資料報超時報文,程式碼“0”表示TTL超時,程式碼“1”表示分片重組超時。


(2)常見的查詢報文詳解

只講述回送請求或會送應答報文。

該報文用於確定兩個網路裝置之間是否能夠正常通訊。主機或路由器向某個目的主機發送ICMP回送請求報文,任何收到回送請求的目的主機都會生成一個回送應答報文,併發返回給源主機。

3、不會導致產生ICMP差錯報文的情況

⑴ ICMP差錯報文(ICMP查詢報文可能會產生ICMP差錯報文)⑵ 目的地址是廣播地址或多播地址的IP資料報⑶ 作為鏈路層廣播的資料報⑷ 不是IP分片的第一片⑸ 源地址不是單個主機的資料報。這些規則是為了防止ICMP差錯報文對廣播分組響應所帶來的廣播風暴。四、ICMP應用例項

1、ping原理

ping的本質是ICMP回送請求報文和回送應答報文。

2、tracert原理

tracert程式的設計是利用ICMP及IP header的TTL(Time To Live)欄位。

首先,Tracert送出一個TTL是1的IP datagram(其實,每次送出的為3個40位元組的包,包括源地址,目的地址和包發出的時間標籤)到目的地,當路徑上的第一個路由器(router)收到這個datagram時,它將TTL減1。此時,TTL變為0了,所以該路由器會將此datagram丟掉,並送回一個「ICMP time exceeded」訊息(包括髮IP包的源地址,IP包的所有內容及路由器的IP地址),Tracert收到這個訊息後,便知道這個路由器存在於這個路徑上,接著Tracert再送出另一個TTL是2 的datagram,發現第2 個路由器...... Tracert每次將送出的datagram的TTL 加1來發現另一個路由器,這個重複的動作一直持續到某個datagram 抵達目的地。當datagram到達目的地後,該主機並不會送回ICMP time exceeded訊息,因為它已是目的地了。