ICMP是IP層的一個組成部分,它傳遞查詢報文和差錯報文,ICMP報文通常被IP層或更高層協議(TCP或UDP)使用,它是在IP數據包內被傳輸的,如圖1所示。

圖1:ICMP封裝在IP數據包內部
ICMP報文格式
如圖2所示,所有報文的前4個字節都是一樣的,但是剩下的其他字節則互不相同。

圖2:ICMP報文格式
類型字段可以有15個不同的值,以描述特定類型的ICMP報文。某些ICMP報文還使用代
碼字段的值來進一步描述不同的條件。
檢驗和字段覆蓋整個ICMP報文。使用的算法與前面介紹的IP首部檢驗和算法相同。ICMP的檢驗和是必需的。
ICMP報文的類型
各種類型的ICMP報文如3所示,不同類型由報文中的類型字段和代碼字段來共同決定。
圖中的最后兩列表明ICMP報文是一份查詢報文還是一份差錯報文。因為對ICMP差錯報
文有時需要作特殊處理,因此我們需要對它們進行區分。例如,在對ICMP差錯報文進行響應
時,永遠不會生成另一份ICMP差錯報文(如果沒有這個限制規則,可能會遇到一個差錯產生
另一個差錯的情況,而差錯再產生差錯,這樣會無休止地循環下去)。

圖3:ICMP報文類型
ICMP地址掩碼請求與應答
ICMP地址掩碼請求用于無盤系統在引導過程中獲取自己的子網掩碼。系統廣播它的ICMP請求報文(這一過程與無盤系統在引導過程中用RARP獲取IP地址是類似的)。無盤
系統獲取子網掩碼的另一個方法是BOOTP協議。ICMP地址掩碼請求和應答報文的格式如圖4所示。

圖4:ICMP地址掩碼請求與應答報文
ICMP報文中的標識符和序列號字段由發送端任意選擇設定,這些值在應答中將被返回。這樣,發送端就可以把應答與請求進行匹配。
ICMP時間戳請求與應答
ICMP時間戳請求允許系統向另一個系統查詢當前的時間。返回的建議值是自午夜開始計
算的毫秒數,協調的統一時間(Coordinated Universal Time, UTC)。
ICMP時間戳請求和應答報文格式如圖5所示。

圖5:ICMP時間戳請求和應答報文
請求端填寫發起時間戳,然后發送報文。應答系統收到請求報文時填寫接收時間戳,在發送應答時填寫發送時間戳。但是,實際上,大多數的實現把后面兩個字段都設成相同的值。
ICMP端口不可達差錯
上面介紹了ICMP兩種查詢報文—地址掩碼和時間戳查詢及應答?,F在來分析一種ICMP差錯報文,即端口不可達報文,它是ICMP目的不可到達報文中的一種,以此來看一看ICMP差錯報文中所附加的信息。
我們使用采用UDP協議的TFTP服務(默認端口號69),在客戶端使用TFTP客戶程序connect服務端的非69端口,這樣就會發生端口不可達錯誤。完整的差錯報文如圖6所示:

圖6:“UDP端口不可達”返回的ICMP報文
ICMP的一個規則是, ICMP差錯報文必須包括生成該差錯報文的數據報IP首部(包含任何選項),還必須至少包括跟在該IP首部后面的前8個字節(包含源端口和目的端口)。在我們的例子中,跟在IP首部后面的前8個字節包含UDP的首部。
posted on 2008-06-07 17:16
水 閱讀(3217)
評論(0) 編輯 收藏 引用 所屬分類:
tcp/ip