在TCP/IP協議族中,ICMP協議是一個介於網絡層和傳輸層中間的一個協議,許多材料都會認為ICMP是網絡層的一個部分,但是ICMP協議的報頭是被包裹在IP協議之中的,而UDP協議又可以被ICMP協議包裝,所以不妨認為它是在一個所謂的“中間層”。
一.首先看一下ICMP報文的類型來概括了解一下ICMP的主要功能:
當類型代碼為0的時候,ICMP用於返回“不可達”差錯;而當類型代碼為5的時候,表示該ICMP報文表達“重定向”的操作。其余的類型代碼皆可以和圖中描述一一對應。
下列圖是ICMP不同類型的報文的具體格式:
(1)ICMP時間戳請求和應答報文
(2)ICMP不可達報文
(3)路由器答報文
(4)ICMP超時報文
二.有幾種情況不會導致產生ICMP差錯報文:
(1)ICMP差錯報文(不然有可能會一直循環)
(2)目的地址是廣播地址或者多播地址的IP數據報
(3)作為鏈路層廣播的數據報(ARP,RARP)
(4)不是IP分片的第一片
(5)源地址不是單個主機的數據報。源地址不能為零地址,loopback或者廣播,多播地址。
三.ICMP報文是在主機之間交換的,不需要端口號
四.traceroute工具的實質:
首先發送一份TTL字段為1的IP數據給目的主機,處理這份數據的第一個路由器將TTL值減1,丟棄該份數據報,並發回一份超時ICMP報文,這樣就得到了該路徑中的第一個路由器的地址,然后traceroute程序發送一份TTL值為2的數據報(這里因為IP協議的connectionless特性,有可能是前后兩個ICMP報文來自不同的路徑),這樣我們就得到了第二個路由器的地址,繼續這個過程直到該份數據報到達目的主機,但是目的主機哪怕接收到TTL值為1的IP數據報,也不會丟棄該數據並產生一ICMP報文,traceroute程序發送一份UDP數據報給目的主機,並選擇一個不能的端口作為UDP端口,使目的主機的任何一個應用程序都不可能使用該端口,從而返回一份“不可達”ICMP報文。