計算機網絡(五)——ICMP協議


Internet控制消息協議ICMP(Internet Control Message Protocol)是網絡層的一個重要協議。使用IP的基本支持,但是ICMP實際上是IP的一個組成部分,必須由每個IP模塊實現。

ICMP協議用來在網絡設備之間傳遞各種差錯和控制信息,並對於收集各種網絡信息、診斷和排除各種網絡故障等方面起着至關重要的作用。當遇到IP數據無法訪問目標、IP路由器無法按當前的傳輸速率轉發數據包等情況時,會自動發送ICMP消息。

控制信息是指網絡通不通、主機是否可達、路由是否可用等網絡本身的消息。這些控制消息雖然並不傳輸用戶數據,但是對於用戶數據的傳遞起着重要的作用。

ICMP的工作原理

ICMP提供一致易懂的出錯報告信息。發送的出錯報文返回到發送原數據的設備,因為只有發送設備才是出錯報文的邏輯接受者。發送設備隨后可根據ICMP報文確定發生錯誤的類型,並確定如何才能更好地重發失敗的數據包。

ICMP唯一的功能是報告問題而不是糾正錯誤,糾正錯誤的任務由發送方完成。

ICMP的功能

1.重定向

 ICMP重定向報文是ICMP控制報文中的一種。在特定的情況下,當路由器檢測到一台機器使用非優化路由的時候,它會向該主機發送一個ICMP重定向報文,請求主機改變路由。路由器也會把初始數據報向它的目的地轉發.

1.當主機A向服務器A請求訪問,如圖可知主機A的IP地址時10.0.0.1/24,服務器A的IP地址時20.0.0.1/24,不是在同一網段,不能直接通信;因此主機A將數據包傳輸給其默認網關RTB 10.0.0.100/24,讓其進行轉發;

2.路由器RTB接收到數據包后,檢查自己的路由表,發現下一跳到RTA 10.0.0.200/24 ,轉發數據的接口與當時接收數據的接口相同,這時默認網關會給主機A發送一個ICMP重定向報文,

3.主機A會根據默認網關回饋的重定向報文將數據包傳送給RTA 10.0.0.200/24,讓RTA進行轉發。

發生ICMP重定向通常有兩種情況:

1)當路由器從某個接口收到數據還需要從相同接口轉發該數據時;
2)當路由器從某個接口到發往遠程網絡的數據時發現源ip地址與下一跳屬於同一網段時。

2.差錯檢測

檢測兩台主機之間能否正常的進行收發,使用的命令就是PingICMP Echo Request和ICMP Echo Replay分別用來查詢和響應某些信息,進行差錯檢測。

3.錯誤報告

當網絡設備無法訪問目標時,中間設備會自動發送ICMP目的不可達報文到發送端。

ICMP定義了各種錯誤消息,用於診斷網絡連接性問題;根據這些錯誤消息,源設備可以判斷出數據傳輸失敗的原因。

舉例:

  • 如果網絡中發生了環路,導致報文在網絡中循環,最終TTL超時,這種情況下網絡設備會發送TTL超時消息給發送端設備。
  • 如果目的不可達,則中間的網絡設備會發送目的不可達消息給發送端設備。
  • 目的不可達的情況有多種,如果是網絡設備無法找到目的網絡,則發送目的網絡不可達消息; 如果網絡設備無法找到目的網絡中的目的主機,則發送目的主機不可達消息。

ICMP數據包結構

ICMP消息的格式取決於Type和Code字段, 其中Type字段為消息類型,Code字段包含該消息類型的具體參數。后面的校驗和字段用於檢查消息是否完整。

  • 在ICMP Redirect消息中,這個字段用來指定網關IP地址,主機根據這個地址將報文重定向到指定網關。
  • 在Echo請求消息中,這個字段包含標識符和序號,源端根據這兩個參數將收到的回復消息與本端發送的Echo請求消息進行關聯。尤其是當源端 目的端發送了多個Echo請求消息時,需要根據標識符和序號將Echo 請求和回復進行一一對應。

ICMP消息類型和編碼類型

完整ICMP消息類型和編碼類型列表

ICMP定義了多種消息類型,用於不同的場景。有些消息不需要Code字段來描述具體類型參數,僅用Type字段表示消息類型。

  • 比如,ICMP Echo回復消息的Type字段設置為0。 有些ICMP消息使用Type字段定義消息大類,用Code字段表示消息的具體類型。
  • 比如,類型為3的消息表示目的不可達,不同的Code值表示不可達的原因,包括目的網絡不可達(Code=0)、目的主機不可達(Code=1) 、協議不可達(Code=2)、目的TCP/UDP端口不可達(Code=3) 等。

其中網絡不可達指的是沒有這個網段;主機不可達指的是有這個網段,但是網段里頭沒有這台主機;端口不可達指的是主機沒有開放這個端口(最常用);協議不可達指的是不支持這個協議號。

ICMP應用

ping應用

ICMP的一個典型應用是Ping。Ping是檢測網絡連通性的常用工具,同時也能夠收集其他相關信息。

用戶可以在Ping命令中指定不同參數,如ICMP報文長度、發送的ICMP報文個數、等待回復響應的超時時間等,設備根據配置的參數來構造並發送ICMP報文,進行Ping測試。

Ping常用的配置參數說明如下:

  1. -a     source-ip-address指定發送ICMP ECHO-REQUEST報文的源IP地址。如果不指定源IP地址,將采用出接口的IP地址作為ICMP ECHO-REQUEST報文發送的源地址。
  2. -c     count指定發送ICMP ECHO-REQUEST報文次數。缺省情況下發送5個ICMP ECHO-REQUEST報文。
  3. -h     ttl-value指定TTL的值。缺省值是255。
  4. -t      timeout指定發送完ICMP ECHO-REQUEST后,等待ICMP ECHO-REPLY的超時時間。

tracert應用

ICMP的另一個典型應用是Tracert。Tracert基於報文頭中的TTL值來逐跳跟蹤報文的轉發路徑

為了跟蹤到達某特定目的地址的路徑,源端首先將報文的TTL值設置為1。該報文到達第一個節點后,TTL超時,於是該節點向源端發送TTL超時消息,消息中攜帶時間戳。然后源端將報文的TTL值設置為2,報文到達第二個節點后超時,該節點同樣返回TTL超時消息,以此類推,直到報文到達目的地。

這樣,源端根據返回的報文中的信息可以跟蹤到報文經過的每一個節點,並根據時間戳信息計算往返時間。Tracert是檢測網絡丟包及時延的有效手段,同時可以幫助管理員發現網絡中的路由環路。

Tracert常用的配置參數說明如下:

  1. -a    source-ip-address指定tracert報文的源地址。
  2. -f    first-ttl指定初始TTL。缺省值是1。
  3. -m  max-ttl指定最大TTL。缺省值是30。
  4. -name使能顯示每一跳的主機名。
  5. -p   port指定目的主機的UDP端口號。
  1. 源端(RTA)向目的端(主機B)發送一個UDP報文,TTL值為1,目的UDP端口號是大於30000的一個數,因為在大多數情況下,大於30000的UDP端口號是任何一個應用程序都不可能使用的端口號。
  2. 第一跳(RTB)收到源端發出的UDP報文后,判斷出報文的目的IP地址不是本機IP地址,將TTL值減1后,判斷出TTL值等於0,則丟棄報文並向源端發送一個ICMP超時(Time Exceeded)報文(該報文中含有第一跳的IP地址10.0.0.2),這樣源端就得到了RTB的地址。
  3. 源端收到RTB的ICMP超時報文后,再次向目的端發送一個UDP報文,TTL值為2。
  4. 第二跳(RTC)收到源端發出的UDP報文后,回應一個ICMP超時報文,這樣源端就得到了RTC的地址(20.0.0.2)。
  5. 以上過程不斷進行,直到目的端收到源端發送的UDP報文后,判斷出目的IP地址是本機IP地址,則處理此報文。根據報文中的目的UDP端口號尋找占用此端口號的上層協議,因目的端沒有應用程序使用該UDP端口號,則向源端返回一個ICMP端口不可達(Destination Unreachable)報文。
  6. 源端收到ICMP端口不可達報文后,判斷出UDP報文已經到達目的端,則停止Tracert程序,從而得到數據報文從源端到目的端所經歷的路徑(10.0.0.2;20.0.0.2;30.0.0.2)。

Ping使用的是哪兩類ICMP消息?

lPing利用ICMP Echo請求消息(Type值為8)來發起檢測目的可達性。目的端收到ICMP Echo請求消息后,根據IP報文頭中的源地址向源端發送ICMP Echo回復消息(Type值為0)。

當網絡設備收到TTL值為0的IP報文時,會如何操作?

l如果IP數據包在到達目的地之前TTL值已經降為0,則收到IP數據包的網絡設備會丟棄該數據包,並向源端發送ICMP消息通知源端TTL超時。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM