2021-05-12 14:32:11
ICMP協定圖文詳解
一:ICMP簡介
1.ICMP全名為(INTERNET CONTROL MESSAGE PROTOCOL)網路控制訊息協定。
2.ICMP屬於TCP/IP協定族,工作在網路層(第三層),用於在IP主機、路由器之間傳遞控制訊息。
3.控制訊息是指網路通不通、主機是否可達、路由是否可用等網路本身的訊息。這些控制訊息雖然並不傳輸使用者資料,但是對於使用者資料的傳遞起著重要的作用。
4.ICMP協定與ARP協定不同,ICMP靠IP協定來完成任務,所以ICMP報文中要封裝IP頭部。它與傳輸層協定(如TCP和UDP)的目的不同,一般不用來在端系統之間傳送資料,不被使用者網路程式直接使用,除了想Ping和Tracert這樣的診斷程式。
5.ICMP的主要作用是主機探測,路由維護,路由選擇,流量控制。
二:ICMP協定
ICMP協定封裝在IP協定中,ICMP有很多報文型別,每一個報文型別又各自不相同,所以無法找到一個統一的報文格式來進行說明,但是他們的前四個位元組的報文格式是相同的。
1.ICMP常見的報文型別
CMP的報文分為兩類,一類是ICMP詢問報文,一類是ICMP差錯報告報文
2.ICMP報文包含在IP資料包中,IP報頭在ICMP報文的最前面。一個ICMP報文包括IP報頭(至少20位元組)、ICMP報頭(至少八位元組)和ICMP報文(屬於ICMP報文的資料部分)。當IP報頭中的協定欄位值為1時,就說明這是一個ICMP報文。ICMP報頭如下圖所示。
各欄位說明
型別: 佔一位元組,標識ICMP報文的型別,目前已定義了14種,從型別值來看ICMP報文可以分為兩大類。第一類是取值為1~127的差錯報文,第2類是取值128以上的資訊報文。
程式碼: 佔一位元組,標識對應ICMP報文的程式碼。它與型別欄位一起共同標識了ICMP報文的詳細型別。
校驗和: 這是對包括ICMP報文資料部分在內的整個ICMP資料包的校驗和,以檢驗報文在傳輸過程中是否出現了差錯。其計算方法與在我們介紹IP報頭中的校驗和計算方法是一樣的。
標識: 占兩位元組,用於標識本ICMP進程,但僅適用於回顯請求和應答ICMP報文,對於目標不可達ICMP報文和超時ICMP報文等,該欄位的值為0。
3.常見的ICMP報文
相應請求: 我們日常進行的Ping操作中就包括了相應請求(型別欄位值為8)和應答(型別欄位值為0)ICMP報文。一台主機向一個節點傳送一個型別欄位值為8的ICMP報文,如果途中沒有異常(如果沒有被路由丟棄,目標不回應ICMP或者傳輸失敗),則目標返回型別欄位值為0的ICMP報文,說明這台主機存在。
目標不可達,源抑制和超時報文: 這三種報文的格式是一樣的。目標不可到達報文(型別值為3)在路由器或者主機不能傳遞資料時使用。例如我們要連線對方一個不存在的系統埠(埠號小於1024)時,將返回型別欄位值3、程式碼欄位值為3的ICMP報文。常見的不可到達型別還有網路不可到達(程式碼欄位值為0)、主機不可達到(程式碼欄位值為1)、協定不可到達(程式碼欄位值為2)等等。
源抑制報文(型別欄位值為4,程式碼欄位值為0): 則充當一個控制流量的角色,通知主機減少資料包流量。由於ICMP沒有回復傳輸的報文,所以只要停止該報文,主機就會逐漸恢復傳輸速率。最後,無連線方式網路的問題就是資料包回丟失,或者長時間在網路遊蕩而找不到目標,或者擁塞導致主機在規定的時間內無法重組資料包分段,這時就要觸發ICMP超時報文的產生。
超時報文 (型別欄位值為11)的程式碼域有兩種取值:程式碼欄位值為0表示傳輸超時,程式碼欄位值為1表示分段重組超時。
時間戳請求: 時間戳請求報文(型別值欄位13)和時間戳應答報文(型別值欄位14)用於測試兩台主機之間資料包來回一次的傳輸時間。傳輸時,主機填充原始時間戳,接受方收到請求後填充接受時間戳後以型別值欄位14的報文格式返回,傳送方計算這個時間差。有些系統不響應這種報文。
三:ICMP典型運用--ping
ICMP的一個典型應用是Ping。Ping是檢測網路連通性的常用工具,同時也能夠收集其他相關資訊。使用者可以在Ping命令中指定不同引數,如ICMP報文長度、傳送的ICMP報文個數、等待回復響應的超時時間等,裝置根據設定的引數來構造並行送ICMP報文,進行Ping測試。
ping命令執行的時候,源主機首先會構建一個ICMP請求封包,ICMP封包內包含多個欄位。最重要的是兩個,第一個是型別欄位,對於請求封包而言該欄位為8;另外一個是順序號,主要用於區分連續ping的時候發出的多個封包。每發出一個請求封包,順序號就會自動加1.為了能夠計算往返時間RTT,它會在報文的資料部分插入傳送時間。
然後,由ICMP協定將這個封包連同地址192.168.1.2一起交給IP層,IP層將以192.168.1.2作為目的地址,本機IP地址作為源地址,加上一些其它控制資訊,構建一個IP封包。
接下來,需要加入MAC頭。如果在本機ARP對映表中找出IP地址192.168.1.2所對應的MAC地址,則可以直接使用;如果沒有,則需要傳送ARP協定查詢MAC地址,獲得MAC地址後,由資料鏈路層構建一個資料框,目的地址是IP層傳過來的MAC地址,源地址則是本機的MAC地址;還要附加上一些控制資訊,依據乙太網的媒介存取規則,將他們傳送出去。
主機B收到這個資料框後,先檢查它的目的MAC地址,並和本機的MAC地址對比,如果符合則接收,否則就丟棄。接收後檢查該資料框,將IP封包從幀中提取出來,交給本機的IP層。同樣IP層檢查後,將有用的資訊提取後交給ICMP協定。
主機B會構建一個ICMP應答包,應答封包的型別欄位為0,順序號為接收到的請求封包中的順序號,然後再傳送出去給主機A。
在規定的時間內,源主機如果沒有接到ICMP的應答包,則說明目標主機不可達,如果接收到了ICMP應答包,則說明目標主機可達。
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的超時時間。
Ping命令的輸出資訊中包括目的地址、ICMP報文長度、序號、TTL值、以及往返時間。序號是包含在Echo回複訊息(Type=0)中的可變引數欄位,TTL和往返時間包含在訊息的IP頭中。
四:ICMP的典型運用--Traceroute
ICMP的另一個典型應用是Traceroute。Traceroute基於報文頭中的TTL值來逐跳跟蹤報文的轉發路徑。為了跟蹤到達某特定目的地址的路徑,源端首先將報文的TTL值設定為1。該報文到達第一個節點後,TTL超時,於是該節點向源端傳送TTL超時訊息,訊息中攜帶時間戳。然後源端將報文的TTL值設定為2,報文到達第二個節點後超時,該節點同樣返回TTL超時訊息,以此類推,直到報文到達目的地。這樣,源端根據返回的報文中的資訊可以跟蹤到報文經過的每一個節點,並根據時間戳資訊計算往返時間。Traceroute是檢測網路丟包及時延的有效手段,同時可以幫助管理員發現網路中的路由環路。
Traceroute常用的設定引數說明如下:
1. -a source-ip-address指定Traceroute報文的源地址。
2. -f first-ttl指定初始TTL。預設值是1。
3. -m max-ttl指定最大TTL。預設值是30。
4. -name使能顯示每一跳的主機名。
5. -p port指定目的主機的UDP埠號。
相關文章