1. ICMP簡介(ICMPv4)
ICMP全稱爲Internet ControlMessage Protocol
ICMP爲IP協議提供控制信息和diagnostic
ICMP裝在IP數據包中,但是不是傳輸層協議(該層的協議爲應用進程提供端到端的通信服務)也不是網絡層協議(網絡層提供路由和尋址的功能),算2.5層
需要注意的是,路由器由於擁塞丟包的行爲不會生成ICMP message
Type表明ICMP類型,Code表明細分類型
2. ICMP功能
ICMP分爲兩類:errormessage 和 query/informationalmessage
ICMP錯誤消息中攜帶了發生錯誤的IP數據包的部分數據(包括IP header,大概500字節)
哪些些數據包不會引發ICMP error message
ICMPv4error message
IPv4目的地址爲廣播地址或者多播地址
數據鏈路層廣播
fragment數據包非第一個包(應該指的是IP分段四層包)
源地址(沒有指明是否爲IP地址,應該包括二層地址)不是指向單個host(比如廣播、全0地址,多播地址等)
當系統進行ICMP生成速率限制時也不會每個數據包都產生ICMP(避免ICMP佔用過多網絡資源)
3. 常用ICMP error message類型
3.1 Destination Unreachable(Type3)
Host Unreachable (Code1)
在direct delivery情況下,無法delivery 給目的IP(比如發送ARP消息,但是ARP的目標IP地址不存在)
Communication Administratively Prohibited (Code 13)
通信被管理員級別的對象阻止了,通常是防火牆導致的
Port Unreachable
數據包到達了目的host,但是端口不不可達,即沒有應用程序當前從這個端口接受數據包(如UDP協議的端口)
3.2 Redirect (Type 5)
host發送數據包時的下一跳路由器不是正確的路由器,當前路由器會將這個數據不傲轉發給正確的路由器,並使用ICMP將這個消息告訴host,讓host知道數據包下一跳應該是哪個路由器(IP地址),比如一個網絡中有兩個網關,一個host發錯網關了,這個時候就可以產生重定向了(沒有試驗過,看描述是這樣的)
3.3 Time Exceeded(Type 11)
ttl耗盡了,路由器丟掉這個數據包是就會發一個Time Exceeded ICMP
traceroute 使用這個ICMP來獲取路徑,traceroute先發一個ttl爲1的UDP包,的獲得第一跳(第一跳路由器就會吧這個包丟掉,併發ICMP),,然後發一個ttl爲2的UDP包,獲取第二跳路由器,以此類推,直到到達最終目的地。
3.4 Parameter Problem (Type 12)
如果IP包中有些域出錯了,並且沒有合適的ICMP消息去告知這個錯誤,就使用這個ICMP告訴源主機是哪個域出錯了
4. 常用ICMP query/informational message類型
Echo Request/Reply (Type 0/8) ,對,就是ping用的
發送一個Request 然後接收Reply,這就是ping
Request中使用Identifier域來標識不同的Echo Request包(通常用進程的pid來作爲identifier)
Reqeust包中存了發送時的時間,Reply時會複製Request的內容,所以一併複製了發送時的時間,Reply接收者(發送Request的人),讀取時間然後和當前時間相減就獲得RTT(round-trip time)了
Router DIscovery(type9,10)
用於路由發現,不過現在IPv4中基本由DHCP來做,Mobile IP中涉及到了這個消息類型,沒有細說,後面可能會看到吧。