TCP/IP具體解釋--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> 終點不可達:終點不可達分為:網絡不可達。主機不可達,協議不可達。port不可達,須要分片但DF比特已置為1,以及源路由失敗等六種情況,其代碼字段分別置為0至5。
當出現以上六種情況時就向源站發送終點不可達報文。
說明:
port不可達:UDP的規則之中的一個是:假設收到UDP數據報並且目的port與某個正在使用的進程不相符。那麽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個字節是為了得到運輸層的port號(對於TCP和UDP)以及運輸層報文的發送序號(對於TCP)。
註:一下情況不發送ICMP差錯報告報文
三.ICMP詢問報文(40字節)
1.ICMP詢問報文有四種回送請求和回答,時間戳請求和回答,掩碼地址請求和回答,以及路由器詢問和通過。
1>ICMP回送請求報文是由主機或路由器向一個特定的目的主機發出的詢問。收到此報文的機器必須給源主機發送ICMP回送應答報文。這樣的詢問報文用來測試目的站是否可達以及了解其有關狀態。
2>ICMP時間戳請求同意系統向還有一個系統查詢當前的時間。
該ICMP報文的優點是它提供了毫秒級的分辨率,而利用其它方法從別的主機獲取的時間僅僅能提供秒級的分辨率。請求端填寫發起時間,然後發送報文。應答系統收到請求報文時填寫接收時間戳。在發送應答時填寫發送時間戳。大多數的實現是把後面兩個字段都設成同樣的值。
3>主機使用ICMP地址掩碼請求報文可向子網掩碼server得到某個接口的地址掩碼。
系統廣播它的ICMP請求報文。
ICMP報文中的標識符和序列號字段由發送端隨意選擇設定。這些值在應答中將被返回,這樣,發送端就能夠把應答與請求進行匹配。
4>主機使用ICMP路由器詢問和通過報文可了解連接在本網絡上的路由器是否正常工作。主機將路由器詢問報文進行廣播(或多播)。
收到詢問報文的一個或幾個路由器就使用路由器通過報文廣播其路由選擇信息
四.Ping程序
1.概述
1>Ping程序是為了測試還有一臺主機是否可達。該程序發送一份ICMP回顯請求報文給主機,並等待返回ICMP回顯應答。
2>Ping程序還能測出到這臺主機的往返時間,以表明該主機離我們有多遠。
2.我們將發送回顯請求的ping程序為客戶。而稱被ping的主機為server。
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報文中的時間值,即是往返時間。
TCP/IP具體解釋--ICMP報文分析