ICMP協議全解析
1. ICMP簡介
ICMP全名為(INTERNET CONTROL MESSAGE PROTOCOL)網絡控制消息協議。
ICMP的協議號為1。
ICMP報文就像是IP報文的小弟,總頂著IP報文的名頭出來混。
因為ICMP報文是在IP報文內部的,如圖:
ICMP屬于TCP/IP協議族,工作在網絡層(第三層),用于在IP主機、路由器之間傳遞控制消息。
控制消息是指網絡通不通、主機是否可達、路由是否可用等網絡本身的消息。這些控制消息雖然并不傳輸用戶數據,但是對于用戶數據的傳遞起著重要的作用。
2. ICMP典型運用—ping
ICMP的一個典型應用是Ping。
Ping是檢測網絡連通性的常用工具,同時也能夠收集其他相關信息。
用戶可以在Ping命令中指定不同參數,如ICMP報文長度、發送的ICMP報文個數、等待回復響應的超時時間等,設備根據配置的參數來構造并發送ICMP報文,進行Ping測試。
Ping常用的配置參數說明如下:
- -a source-ip-address指定發送ICMP ECHO-REQUEST報文的源IP地址。如果不指定源IP地址,將采用出接口的IP地址作為ICMP ECHO-REQUEST報文發送的源地址。
- -c count指定發送ICMP ECHO-REQUEST報文次數。缺省情況下發送5個ICMP ECHO-REQUEST報文。
- -h ttl-value指定TTL的值。缺省值是255。
- -t timeout指定發送完ICMP ECHO-REQUEST后,等待ICMP ECHO-REPLY的超時時間。
Ping命令的輸出信息中包括目的地址、ICMP報文長度、序號、TTL值、以及往返時間。序號是包含在Echo回復消息(Type=0)中的可變參數字段,TTL和往返時間包含在消息的IP頭中。
3. ICMP典型運用—Tracert
ICMP的另一個典型應用是Tracert。
Tracert基于報文頭中的TTL值來逐跳跟蹤報文的轉發路徑。
為了跟蹤到達某特定目的地址的路徑,源端首先將報文的TTL值設置為1。
該報文到達第一個節點后,TTL超時,于是該節點向源端發送TTL超時消息,消息中攜帶時間戳。
然后源端將報文的TTL值設置為2,報文到達第二個節點后超時,該節點同樣返回TTL超時消息,以此類推,直到報文到達目的地。
這樣,源端根據返回的報文中的信息可以跟蹤到報文經過的每一個節點,并根據時間戳信息計算往返時間。
Tracert是檢測網絡丟包及時延的有效手段,同時可以幫助管理員發現網絡中的路由環路。
Tracert常用的配置參數說明如下:
- -a source-ip-address指定tracert報文的源地址。
- -f first-ttl指定初始TTL。缺省值是1。
- -m max-ttl指定最大TTL。缺省值是30。
- -name使能顯示每一跳的主機名。
- -p port指定目的主機的UDP端口號。
4. ICMP類型
ICMP報文主要有兩大功能:查詢報文和差錯報文。
對于查詢報文,常用的ping命令,以及用于無盤系統啟動獲取網絡子網掩碼查詢報文,以及時間戳報文,目標主機收到返回相應的格式的回應包;
對于差錯報文在一些情況下目標主機不會返回對應的數據包:
5. 目的不可達(Destination Unreachable Message)
日常生活中,郵寄包裹會經過多個傳遞環節,任意一環如果無法傳下去,都會返回寄件人,并附上無法郵寄的原因。
同理,當路由器收到一個無法傳遞下去的IP報文時,會發送ICMP目的不可達報文(Type為3)給IP報文的源發送方。
報文中的Code就表示發送失敗的原因。
- Code
- 0 = net unreachable;
- 1 = host unreachable;
- 2 = protocol unreachable;
- 3 = port unreachable;
- 4 = fragmentation needed and DF set;
- 5 = source route failed.
6. 超時(Time Exceeded Message)
網絡傳輸IP數據報的過程中,如果IP數據包的TTL值逐漸遞減為0時,需要丟棄數據報。
這時,路由器需要向源發送方發送ICMP超時報文(Type為11),Code為0,表示傳輸過程中超時了。
一個IP數據報可能會因為過大而被分片,然后在目的主機側把所有的分片重組。
如果主機遲遲沒有等到所有的分片報文,就會向源發送方發送一個ICMP超時報文,Code為1,表示分片重組超時了。
7. 參數錯誤報文(Parameter Problem Message)
當路由器或主機處理數據報時,發現因為報文頭的參數錯誤而不得不丟棄報文時,需要向源發送方發送參數錯誤報文(Type為12)。
當Code為0時,報文中的Pointer表示錯誤的字節位置。
8. 源冷卻(Source Quench Message)
路由器在處理報文時會有一個緩存隊列。
如果超過最大緩存隊列,將無法處理,從而丟棄報文。
并向源發送方發一個ICMP源冷卻報文(Type為4),告訴對方:“嘿,我這里客滿了,你遲點再來。”
9. 重定向(Redirect Message)
想像一下,在公司中,有人來你的項目組問你某某某在哪兒。
你一想,我們組沒有這人啊。
你肯定就會說,我們組沒有這號人,你去其他組看看。
當路由收到IP數據報,發現數據報的目的地址在路由表上沒有,它就會發ICMP重定向報文(Type為5)給源發送方,提醒它想要發送的地址不在,去其他地方找找吧。
10. 請求回顯或回顯應答(Echo or Echo Reply Message)
- Type(8)是請求回顯報文(Echo);
- Type(0)是回顯應答報文(Echo Reply)。
- 請求回顯或回顯應答報文屬于查詢報文。
- Ping就是用這種報文進行查詢和回應。
11. 時間戳或時間戳請求(Timestamp or Timestamp Reply Message)
時間戳報文是用來記錄收發以及傳輸時間的報文。
- Originate Timestamp記錄的是發送方發送報文的時刻;
- Receive Timestamp記錄的是接收方收到報文的時刻;
- Transmit Timestamp表示回顯這最后發送報文的時刻。
12. 信息請求或信息響應
這種報文是用來找出一個主機所在的網絡個數(一個主機可能會在多個網絡中)。
報文的IP消息頭的目的地址會填為全0,表示this,源地址會填為源IP所在的網絡IP。
好了,今天的分享就到這了~