ICMP:Internet控制報文協議
ICMP報文通常被IP層或更高層協議(TCP或UDP)使用,用於傳遞差錯報文以及其他需要注意的資訊。ICMP報文是在IP資料報內部被傳輸的,1所示。
圖1 ICMP封裝在IP資料報內部
ICMP的正式規範參見RFC 792。ICMP報文格式2所示。類型欄位可以有15個不同的值,以描述特定類型的ICMP報文。某些ICMP報文還使用代碼欄位的值進一步描述不同的條件。校正和欄位計算覆蓋整個ICMP報文。
圖2 ICMP報文格式
ICMP報文的各種類型3所示,不同類型由報文中的類型欄位和代碼欄位共同決定。
當發送一份ICMP差錯報文時,報文始終包含IP首部和產生ICMP差錯報文的IP資料報中資料部分的前8個位元組。這樣,接收ICMP差錯報文的模組就會把它與某個特定的協議(根據IP資料報首部中的協議欄位來判斷)和使用者進程(根據包含在IP資料報前8個位元組中的TCP或UDP報文首部中的TCP或UDP連接埠號碼來判斷)聯絡起來。
下面各種情況都不會產生ICMP差錯報文:
- ICMP差錯報文(但是,ICMP查詢報文可能產生ICMP差錯報文);
- 目的地址是廣播位址或多播地址(D類地址)的IP資料報;
- 作為鏈路層廣播的資料報;
- 不是IP分區的第一片;
- 源地址不是單個主機的資料報。也就是說,源地址不能為零地址、迴路位址、廣播位址或多播地址。
這些規則是為了防止過去允許ICMP差錯報文對廣播分組響應所帶來的廣播風暴。
ICMP連接埠不可到達差錯
ICMP差錯報文(4所示),即連接埠不可到達報文,它是ICMP目的不可到達報文中的一種,以此來看一看ICMP差錯報文中所附加的資訊,使用UDP來查看它。
UDP的規則之一是,如果收到一份UDP資料報而目的連接埠與某個正在使用的進程不相符,那麼UDP返回一個ICMP不可達報文。
(BSD系統不把從socket接收到的ICMP報文中的UDP資料通知給使用者進程,除非該進程已經發送一個connect命令給該socket。)
圖3 ICMP報文類型
圖4 ICMP不可達報文格式
4.4BSD中對每個可能的ICMP報文的處理方法5所示。
圖5 4.4BSD系統對ICMP報文的處理