ICMPv6


ICMPv6

ICMPv6(Internet Control Message Protocol for the IPv6)是IPv6的基礎協議之一。

在IPv4中,Internet控制報文協議ICMP(Internet Control Message Protocol)向源節點報告關於向目的地傳輸IP數據包過程中的錯誤和信息。它為診斷、信息和管理目的定義了一些消息,如:目的不可達、數據包超長、超時、回應請求和回應應答等。在IPv6中,ICMPv6除了提供ICMPv4常用的功能之外,還是其它一些功能的基礎,如鄰接點發現、無狀態地址配置(包括重復地址檢測)、PMTU發現等。

ICMPv6的協議類型號(即IPv6報文中的Next Header字段的值)為58。

ICMPv6錯誤報文的分類

ICMPv6錯誤報文用於報告在轉發IPv6數據包過程中出現的錯誤。ICMPv6錯誤報文可以分為以下4種:

目的不可達錯誤報文

在IPv6節點轉發IPv6報文過程中,當設備發現目的地址不可達時,就會向發送報文的源節點發送ICMPv6目的不可達錯誤報文,同時報文中會攜帶引起該錯誤報文的具體原因。

目的不可達錯誤報文的Type字段值為1。根據錯誤具體原因又可以細分為:

Code=0:沒有到達目標設備的路由。

Code=1:與目標設備的通信被管理策略禁止。

Code=2:未指定。

Code=3:目的IP地址不可達。

Code=4:目的端口不可達。

數據包過大錯誤報文

在IPv6節點轉發IPv6報文過程中,發現報文超過出接口的鏈路MTU時,則向發送報文的源節點發送ICMPv6數據包過大錯誤報文,其中攜帶出接口的鏈路MTU值。數據包過大錯誤報文是Path MTU發現機制的基礎。

數據包過大錯誤報文的Type字段值為2,Code字段值為0。

時間超時錯誤報文

在IPv6報文收發過程中,當設備收到Hop Limit字段值等於0的數據包,或者當設備將Hop Limit字段值減為0時,會向發送報文的源節點發送ICMPv6超時錯誤報文。對於分段重組報文的操作,如果超過定時時間,也會產生一個ICMPv6超時報文。

時間超時錯誤報文的Type字段值為3,根據錯誤具體原因又可以細分為:

Code=0:在傳輸中超越了跳數限制。

Code=1:分片重組超時。

參數錯誤報文

當目的節點收到一個IPv6報文時,會對報文進行有效性檢查,如果發現問題會向報文的源節點回應一個ICMPv6參數錯誤差錯報文。

參數錯誤報文的Type字段值為4,根據錯誤具體原因又可以細分為:

Code=0:IPv6基本頭或擴展頭的某個字段有錯誤。

Code=1:IPv6基本頭或擴展頭的NextHeader值不可識別。

Code=2:擴展頭中出現未知的選項。

ICMPv6信息報文的分類

ICMPv6信息報文提供診斷功能和附加的主機功能,比如多播偵聽發現和鄰居發現。常見的ICMPv6信息報文主要包括回送請求報文(Echo Request)和回送應答報文(Echo Reply),這兩種報文也就是通常使用的Ping報文。

回送請求報文:回送請求報文用於發送到目標節點,以使目標節點立即發回一個回送應答報文。回送請求報文的Type字段值為128,Code字段的值為0。

回送應答報文:當收到一個回送請求報文時,ICMPv6會用回送應答報文響應。回送應答報文的Type字段的值為129,Code字段的值為0。

鄰居發現

鄰居發現協議NDP(Neighbor Discovery Protocol)是IPv6協議體系中一個重要的基礎協議。鄰居發現協議替代了IPv4的ARP(Address Resolution Protocol)和ICMP路由器發現(Router Discovery),它定義了使用ICMPv6報文實現地址解析,跟蹤鄰居狀態,重復地址檢測,路由器發現以及重定向等功能。

地址解析

在IPv4中,當主機需要和目標主機通信時,必須先通過ARP協議獲得目的主機的鏈路層地址。在IPv6中,同樣需要從IP地址解析到鏈路層地址的功能。鄰居發現協議實現了這個功能。

ARP報文是直接封裝在以太網報文中,以太網協議類型為0x0806,普遍觀點認為ARP定位為第2.5層的協議。ND本身基於ICMPv6實現,以太網協議類型為0x86DD,即IPv6報文,IPv6下一個報頭字段值為58,表示ICMPv6報文,由於ND協議使用的所有報文均封裝在ICMPv6報文中,一般來說,ND被看作第3層的協議。在三層完成地址解析,主要帶來以下幾個好處:

地址解析在三層完成,不同的二層介質可以采用相同的地址解析協議。

可以使用三層的安全機制避免地址解析攻擊。

使用組播方式發送請求報文,減少了二層網絡的性能壓力。

地址解析過程中使用了兩種ICMPv6報文:鄰居請求報文NS(Neighbor Solicitation)和鄰居通告報文NA(Neighbor Advertisement)。

NS報文:Type字段值為135,Code字段值為0,在地址解析中的作用類似於IPv4中的ARP請求報文。

NA報文:Type字段值為136,Code字段值為0,在地址解析中的作用類似於IPv4中的ARP應答報文。

 

Host A在向Host B發送報文之前它必須要解析出Host B的鏈路層地址,所以首先Host A會發送一個NS報文,其中源地址為Host A的IPv6地址,目的地址為Host B的被請求節點組播地址,需要解析的目標IP為Host B的IPv6地址,這就表示Host A想要知道Host B的鏈路層地址。同時需要指出的是,在NS報文的Options字段中還攜帶了Host A的鏈路層地址。當Host B接收到了NS報文之后,就會回應NA報文,其中源地址為Host B的IPv6地址,目的地址為Host A的IPv6地址(使用NS報文中的Host A的鏈路層地址進行單播),Host B的鏈路層地址被放在Options字段中。這樣就完成了一個地址解析的過程。

跟蹤鄰居狀態

通過鄰居或到達鄰居的通信,會因各種原因而中斷,包括硬件故障、接口卡的熱插入等。如果目的地失效,則恢復是不可能的,通信失敗;如果路徑失效,則恢復是可能的。因此節點需要維護一張鄰居表,每個鄰居都有相應的狀態,狀態之間可以遷移。

RFC2461中定義了5種鄰居狀態,分別是:未完成(Incomplete)、可達(Reachable)、陳舊(Stale)、延遲(Delay)、探查(Probe)。

鄰居狀態之間具體遷移過程如圖所示,其中Empty表示鄰居表項為空。

 

重復地址檢測

重復地址檢測DAD(Duplicate Address Detect)是在接口使用某個IPv6單播地址之前進行的,主要是為了探測是否有其它的節點使用了該地址。尤其是在地址自動配置的時候,進行DAD檢測是很必要的。一個IPv6單播地址在分配給一個接口之后且通過重復地址檢測之前稱為試驗地址(Tentative Address)。此時該接口不能使用這個試驗地址進行單播通信,但是仍然會加入兩個組播組:ALL-NODES組播組和試驗地址所對應的Solicited-Node組播組。

IPv6重復地址檢測技術和IPv4中的免費ARP類似:節點向試驗地址所對應的Solicited-Node組播組發送NS報文。NS報文中目標地址即為該試驗地址。如果收到某個其他站點回應的NA報文,就證明該地址已被網絡上使用,節點將不能使用該試驗地址通訊。

Host A的IPv6地址FC00::1為新配置地址,即FC00::1為Host A的試驗地址。Host A向FC00::1的Solicited-Node組播組發送一個以FC00::1為請求的目標地址的NS報文進行重復地址檢測,由於FC00::1並未正式指定,所以NS報文的源地址為未指定地址。當Host B收到該NS報文后,有兩種處理方法:

如果Host B發現FC00::1是自身的一個試驗地址,則Host B放棄使用這個地址作為接口地址,並且不會發送NA報文。

如果Host B發現FC00::1是一個已經正常使用的地址,Host B會向FF02::1發送一個NA報文,該消息中會包含FC00::1。這樣,Host A收到這個消息后就會發現自身的試驗地址是重復的。Host A上該試驗地址不生效,被標識為duplicated狀態。

路由器發現

路由器發現功能用來發現與本地鏈路相連的設備,並獲取與地址自動配置相關的前綴和其他配置參數。

在IPv6中,IPv6地址可以支持無狀態的自動配置,即主機通過某種機制獲取網絡前綴信息,然后主機自己生成地址的接口標識部分。路由器發現功能是IPv6地址自動配置功能的基礎,主要通過以下兩種報文實現:

路由器通告RA(Router Advertisement)報文:每台設備為了讓二層網絡上的主機和設備知道自己的存在,定時都會組播發送RA報文,RA報文中會帶有網絡前綴信息,及其他一些標志位信息。RA報文的Type字段值為134。

路由器請求RS(Router Solicitation)報文:很多情況下主機接入網絡后希望盡快獲取網絡前綴進行通信,此時主機可以立刻發送RS報文,網絡上的設備將回應RA報文。RS報文的Tpye字段值為133。

重定向

當網關設備發現報文從其它網關設備轉發更好,它就會發送重定向報文告知報文的發送者,讓報文發送者選擇另一個網關設備。重定向報文也承載在ICMPv6報文中,其Type字段值為137,報文中會攜帶更好的路徑下一跳地址和需要重定向轉發的報文的目的地址等信息。

Path MTU

在IPv4中,報文如果過大,必須要分片進行發送,所以在每個節點發送報文之前,設備都會根據發送接口的最大傳輸單元MTU(Maximum Transmission Unit)來對報文進行分片。但是在IPv6中,為了減少中間轉發設備的處理壓力,中間轉發設備不對IPv6報文進行分片,報文的分片將在源節點進行。當中間轉發設備的接口收到一個報文后,如果發現報文長度比轉發接口的MTU值大,則會將其丟棄;同時將轉發接口的MTU值通過ICMPv6報文的“Packet Too Big”消息發給源端主機,源端主機以該值重新發送IPv6報文,這樣帶來了額外流量開銷。PMTU發現協議可以動態發現整條傳輸路徑上各鏈路的MTU值,減少由於重傳帶來的額外流量開銷。

PMTU協議是通過ICMPv6的Packet Too Big報文來完成的。首先源節點假設PMTU就是其出接口的MTU,發出一個試探性的報文,當轉發路徑上存在一個小於當前假設的PMTU時,轉發設備就會向源節點發送Packet Too Big報文,並且攜帶自己的MTU值,此后源節點將PMTU的假設值更改為新收到的MTU值繼續發送報文。如此反復,直到報文到達目的地之后,源節點就能知道到達目的地的PMTU了。


免責聲明!

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



猜您在找 ICMPv6和IPv6 NDP
 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM