icmp 報文詳解


以下內容轉載自: http://blog.csdn.net/tigerjibo/article/details/7356936

寫的很好的 icmp 報文詳解:


一.概述:

1.   ICMP允許主機或路由報告差錯情況和提供有關異常情況。ICMP是因特網的標準協議,但ICMP不是高層協議,而是IP層的協議。通常ICMP報文被IP層或更高層協議(TCP或UDP)使用。一些ICMP報文把差錯報文返回給用戶進程。

2.   ICMP報文作爲IP層數據報的數據,加上數據報的首部,組成數據報發送出去。

3.   ICMP報文的種類有兩種,即ICMP差錯報告報文和ICMP詢問報文。

二.ICMP報文的格式


1.   類型:佔8位

2.   代碼:佔8位

3.   檢驗和:佔16位

說明:ICMP所有報文的前4個字節都是一樣的,但是剩下的其他字節則互不相同。

4.   其它字段都ICMP報文類型不同而不同。

1>  ICMP報文的前4個字節是統一的格式,共有三個字段:即類型,代碼和檢驗和。

2>  8位類型和8位代碼字段一起決定了ICMP報文的類型。

類型8,代碼0:表示顯請求(ping請求)。

類型0,代碼0:表示回顯應答(ping應答)

類型11,代碼0:超時

3>16位的檢驗和字段:包括數據在內的整個ICMP數據包的檢驗和;其計算方法和IP頭部檢驗和的計算方法一樣的。

ICMP報文具體分爲查詢報文和差錯報文(對ICMP差錯報文有時需要做特殊處理,因此要對其進行區分。如:對ICMP差錯報文進行響應時,永遠不會生成另一份ICMP差錯報文,否則會出現死循環)

.ICMP差錯報文(56字節)

1.   ICMP差錯報告報文共有5種

1>  終點不可達:終點不可達分爲:網絡不可達,主機不可達,協議不可達,端口不可達,需要分片但DF比特已置爲1,以及源路由失敗等六種情況,其代碼字段分別置爲0至5。當出現以上六種情況時就向源站發送終點不可達報文。

說明:

端口不可達:UDP的規則之一是:如果收到UDP數據報而且目的端口與某個正在使用的進程不相符,那麼UDP返回一個ICMP不可達報文。

2>  源站抑制:當路由器或主機由於擁塞而丟棄數據報時,就向源站發送源站抑制報文,使源站知道應當將數據報的發送速率放慢。

3>  時間超過:當路由器收到生存時間爲零的數據報時,除丟棄該數據報外,還要向源站發送時間超過報文。當目的站在預先規定的時間內不能收到一個數據報的全部數據報片時,就將已收到的數據報片都丟棄,並向源站發送時間超過報文。

4>  參數問題:當路由器或目的主機收到的數據報的首部中的字段的值不正確時,就丟棄該數據報,並向源站發送參數問題報文。

5>  改變路由(重定向)路由器將改變路由報文發送給主機,讓主機知道下次應將數據報發送給另外的路由器。

說明:

以下幾種情況都不會導致產生ICMP差錯報文

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

2>目的地址是廣播地址或多播地址的IP數據報

3>作爲鏈路層廣播的數據報

4>不是IP分片的第一片

5>源地址不是單個主機的數據報。即源地址不能爲零地址、環回地址、廣播地址或多播地址。

這些規則是爲了防止過去允許ICMP差錯報文對廣播分組響應所帶來的廣播風暴。

2.所有的ICMP差錯報告報文中的數據字段都具有同樣的格式。將收到的需要進行差錯報告IP數據報的首部和數據字段的前8個字節提取出來,作爲ICMP報文的數據字段。再加上響應的ICMP差錯報告報文的前8個字節,就構成了ICMP差錯報告報文。提取收到的數據報的數據字段的前8個字節是爲了得到運輸層的端口號(對於TCP和UDP)以及運輸層報文的發送序號(對於TCP)。


注:一下情況不發送ICMP差錯報告報文

三.ICMP詢問報文(40字節)


1.ICMP詢問報文有四種回送請求和回答,時間戳請求和回答,掩碼地址請求和回答,以及路由器詢問和通過。

1>ICMP回送請求報文是由主機或路由器向一個特定的目的主機發出的詢問。收到此報文的機器必須給源主機發送ICMP回送應答報文。這種詢問報文用來測試目的站是否可達以及瞭解其有關狀態。

2>ICMP時間戳請求允許系統向另一個系統查詢當前的時間。該ICMP報文的好處是它提供了毫秒級的分辨率,而利用其他方法從別的主機獲取的時間只能提供秒級的分辨率。請求端填寫發起時間,然後發送報文。應答系統收到請求報文時填寫接收時間戳,在發送應答時填寫發送時間戳。大多數的實現是把後面兩個字段都設成相同的值。

3>主機使用ICMP地址掩碼請求報文可向子網掩碼服務器得到某個接口的地址掩碼。系統廣播它的ICMP請求報文。ICMP報文中的標識符和序列號字段由發送端任意選擇設定,這些值在應答中將被返回,這樣,發送端就可以把應答與請求進行匹配。

4>主機使用ICMP路由器詢問和通過報文可瞭解連接在本網絡上的路由器是否正常工作。主機將路由器詢問報文進行廣播(或多播)。收到詢問報文的一個或幾個路由器就使用路由器通過報文廣播其路由選擇信息

四.Ping程序

1.概述

1>Ping程序是爲了測試另一臺主機是否可達。該程序發送一份ICMP回顯請求報文給主機,並等待返回ICMP回顯應答。

2>Ping程序還能測出到這臺主機的往返時間,以表明該主機離我們有多遠。

2.我們將發送回顯請求的ping程序爲客戶,而稱被ping的主機爲服務器。

3.ICMP回顯請求和回顯應答報文格式:


1>Unix系統在實現ping程序時把ICMP報文中的標識符字段置成發送進程的ID號。這樣即使在同一臺主機上同時運行了多個ping程序實例,ping程序也可以識別出返回的信息。

2>序列號從0開始,每發送一次新的回顯請求就加1。ping程序打印出返回的每個分組的序列號,允許我們查看是否有分組丟失,失序或重複。.

3>ping程序通過在ICMP報文中存放發送請求的時間值來計算往返時間。當應答返回時,用當前時間減去存放在ICMP報文中的時間值,即是往返時間。

4>當返回ICMP回顯應答時,要打印出序列號和TTL,並計算往返時間。TTL位於IP首部的生存時間字段。ping程序通過在ICMP報文數據段中存放發送請求的時間值來計算往返時間。當應答返回時,用當前時間減去存放在ICMP報文中的時間值,即是往返時間。


增加:

抓包看過icmp ping 請求包(類型8,代碼0) 和 響應包(類型0,代碼0)後,發現 請求包 和 響應包的 標識符 和 序號 以及 選項數據完全一致。這樣可能是爲了一 一 對應。


截圖:



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