什麼是ipv6網路協議

ICMPv6概述

ICMPv6是IPv6的基礎協議之一,協議型別號(即IPv6 Next Header)為58,用於向源節點傳遞報文轉發的資訊或者錯誤。

在IPv6中,ICMPv6除了提供ICMPv4的對應功能之外,還有其它一些功能的基礎,如鄰居發現、無狀態地址配置、重複地址檢測、PMTU發現等。

報文解釋:

  • Type:表明訊息的型別,0至127表示差錯報文型別,128至255表示訊息報文型別。
  • Code:表示此訊息型別細分的型別。
  • Checksum:表示ICMPv6報文的校驗和。

ICMPv6 message Type(兩大類)

  • 錯誤類訊息(error messages),也稱為差錯報文,8bits型別欄位中的最高bit為0,也就是ICMPv6 Type=[0,127]
  • 資訊類訊息(information messages) ,也稱為資訊報文, 8bits型別欄位中的最高bit為1,也就是ICMPv6 Type=[128,255]

訊息型別

TYPE

名稱

CODE

差錯訊息

1

目的不可達

0 無路由

1 因管理原因禁止訪問

2 未指定

3 地址不可達

4 埠不可達

2

資料包過長

0

3

超時

0 跳數到0

1 分片重組超時

4

引數錯誤

0 錯誤的包頭欄位

1 無法識別的下一包頭型別

2 無法識別的ipv6選項

資訊訊息

128

Echo request

0

129

Echo reply

0

IPv6鄰居發現協議 - NDP

NDP(Neighbor Discovery Protocol,鄰居發現協議)在RFC2462及RFC4861中定義。NDP實現了IPv6中諸多重要機制,如下圖所示:

NDP使用ICMPv6的相關報文如下圖所示:

  • RS(Router Solicitation):路由器請求報文
  • RA(Router Advertisement):路由器通告報文
  • NS(Neighbor Solicitation):鄰居請求報文
  • NA(Neighbor Advertisement):鄰居通告報文

地址解析

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

鄰居請求 (Neighbor Solicitation,NS)格式如下圖所示:

  • Type=135,Code=0。
  • Target Address是需要解析的IPv6地址。

鄰居通告 (Neighbor Advertisement,NA)格式如下圖所示:

  • Type=136,Code=0
  • R標誌(Router flag)表示傳送者是否為路由器,如果1則表示是;
  • S標誌(Solicited flag)表示傳送鄰居通告是否是響應某個鄰居請求,如果1則表示是;
  • O標誌(Overide flag)表示鄰居通告中的訊息是否覆蓋已有的條目資訊,如果1則表示是;
  • Target Address表示所攜帶的鏈路層地址對應的IPv6地址。
  • 被請求的鏈路層地址被放在Options欄位中,其格式仍然採用TLV格式

PC1現要請求2001::2的地址,解析過程如下:

1、PC1傳送鄰居請求報文,傳送者的源鏈路層地址會被放在NS的Options欄位中。NS的Target address是需要解析的IPv6地址2001::2。

2、 PC2收到這個資料幀後,進行如下處理

  • 由於本地網絡卡接收目的MAC地址為3333-FF00-0002的資料幀,因此在對資料幀做校驗之後從幀頭的型別欄位得知裡頭是個IPv6報文,於是將幀頭拆掉,把IPv6報文上送IPv6協議棧處理。
  • IPv6協議棧從報文的IPv6頭部中的目的IPv6地址得知這個資料包是發往一個被請求節點組播地址FF02::1:FF00:2,而本地網絡卡加入了這個組播組。繼續處理該報文
  • 接著,從IPv6包頭的NextHeader欄位得知IPv6包頭後面封裝著一個ICMPv6的報文,因此將IPv6包頭拆除,將ICMPv6報文交給ICMPv6協議去處理。
  • 最後ICMPv6發現這是個NS報文,要請求自己2001::2對應的MAC地址,於是回送一個NA報文給PC1,在該報文中就包含著PC2的MAC地址。

重複地址檢測DAD

介面在啟用任何一個單播IPv6地址前都需要先進行DAD,確認是否有其它的節點使用了該地址。

一個IPv6單播地址在分配給一個介面之後且通過重複地址檢測之前稱為試驗地址(Tentative Address)。此時該介面不能使用這個試驗地址進行單播通訊,但是仍然會加入兩個組播組:ALL-NODES組播組和實驗地址所對應的Solicited-Node組播組。

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

DAD檢測過程如下:

  1. PC1的IPv6地址2001::FFFF為新配置地址,即2001::FFFF為PC1的試驗地址。
  2. PC1向2001::FFFF的Solicited-Node組播組傳送一個以2001::FFFF為請求的目標地址的NS報文進行重複地址檢測,由於2001::FFFF並未正式指定,所以NS報文的源地址為未指定地址。
  3. 當PC2收到該NS報文後,有兩種處理方法:
  • 如果PC2發現2001::FFFF是自身的一個實驗地址,則PC2放棄使用這個地址作為介面地址,並且不會傳送NA報文。
  • 如果PC2發現2001::FFFF是一個已經正常使用的地址,那麼PC2會向該地址的ALL-NODES組播組傳送一個NA報文,該訊息中會包含2001::FFFF。這樣,PC1收到這個訊息後就會發現自身的實驗地址是重複的,從而棄用該地址。

鄰居狀態

在實際的IPV6通訊過程中不僅僅是地址解析這麼簡單,而是需要維護一張鄰居表,每個鄰居都有相應的狀態,狀態之間可以遷移。鄰居狀態有5種:

  • INCOMPLETE:未完成,鄰居請求已經傳送到目標節點的請求組播地址,但沒有收到鄰居的通告;
  • REACHABLE:可達,收到確認,不需再發包確認;
  • STALE:陳舊,從收到上一次可達性確認後過了超過30s;
  • DELAY:延遲,在stale狀態後傳送過一個報文,並且5s內沒有可達性確認;
  • PROBE:探查,每隔1s重傳鄰居請求來主動請求可達性確認,直到收到確認。

下面以A、B兩個節點之間相互通訊過程的A節點的鄰居狀態變化,假設A、B兩個節點之前沒有任何通訊:

  1. A先傳送NS,並生成鄰居快取條目,狀態為Incomplete;
  2. 若B回覆NA,則Incomplete->Reachable,否則10s後Incomplete->Empty,即刪除條目;
  3. 經過ReachableTime(預設30s),條目狀態Reachable->Stale;或者在Reachable狀態,收到B的非請求NA,且鏈路層地址不同,則馬上->Stale;
  4. 在Stale狀態若A需要向B傳送資料,則Stale->Delay,同時傳送NS請求;
  5. 在Delay_First_Probe_Time(預設5秒)後,Delay->Probe,其間若有NA應答,則Delay->Reachable;
  6. 在Probe狀態,每隔RetransTimer(預設1秒)傳送單播NS,傳送MAX_UNICAST_SOLICIT個後再等RestransTimer,有應答則->Reachable,否則進入Empty,即刪除表項。

檢視IPv6鄰居路由表

IPv6不像IPv4那樣使用ARP表來快取IP與MAC地址的對映,而是維護一個IPv6鄰居表。在華為數通裝置上則使用display ipv6 neighbors命令來檢視IPv6鄰居表。

說明:

在windows作業系統裡,可以使用netsh interface ipv6 show neighbors命令檢視鄰居快取的內容。

路由器發現

路由器發現功能用來發現與本地鏈路相連的裝置,並獲取與地址自動配置相關的字首和其他配置引數。路由器發現功能主要通過以下兩種報文實現:

  • RA(Router Advertisement,路由器通告)報文:每臺裝置為了讓二層網路上的主機和裝置知道自己的存在,可以定時以組播方式傳送RA報文,RA報文中會帶有網路字首資訊,及其他一些標誌位資訊。RA報文的Type欄位值為134。
  • RS(Router Solicitation,路由器請求)報文:很多情況下主機接入網路後希望儘快獲取網路字首進行通訊,此時主機可以立刻傳送RS報文給路由器。網路上的路由器收到該RS報文後會立即向相應的主機單播迴應RA報文,告知主機該網段的預設路由器和相關配置引數。RS報文的Type欄位值為133。

RA

鏈路上的路由器會定期的傳送RA(Router Advertisement)訊息。

  • 收到RA的主機將加入預設路由器列表中。
  • 收到RA的路由器將檢查RA內容的一致性。

RS

主機介面初始化時發RS(Router Solicitation)訊息,路由器迴應RA。

IPv6無狀態地址自動配置

IPv6支援無狀態地址自動配置,無需使用諸如DHCP之類的輔助協議,主機即可獲取IPv6字首並自動生成介面ID。路由器發現功能是IPv6地址自動配置功能的基礎,主要通過以下兩步驟獲取:

  • 網路節點向相連的路由器傳送RS,請求地址字首資訊。
  • 路由器通過傳送路由器通告RA,回覆地址字首資訊。

如上圖所示,IPv6無狀態地址自動配置的工作過程如下:

  1. 主機根據本地介面ID自動產生網絡卡的鏈路本地地址。
  2. 主機對鏈路本地地址進行DAD檢測, 如果該地址不存在衝突則可以啟用。
  3. 主機傳送RS報文嘗試在鏈路上發現IPv6路由器,該報文的源地址為主機的鏈路本地地址。
  4. 路由器回覆RA報文(攜帶IPv6字首資訊,路由器在未收到RS時也能夠配置主動發出RA報文)。
  5. 主機根據路由器迴應的RA報文,獲得IPv6地址字首資訊,使用該地址字首,加上本地產生的介面ID,形成單播IPv6地址。
  6. 主機對生成的IPv6地址進行DAD檢測,如果沒有檢測到衝突,那麼該地址才能夠啟用。

重定向報文

當閘道器路由器知道更好的轉發路徑時,會以重定向報文的方式告知主機,讓報文傳送者選擇另一個閘道器路由器。

重定向報文的結構如下:

  • 報文格式中Type為137,Code為0;
  • Target Address是更好的路徑下一跳地址;
  • Destination Address是需要重定向轉發的報文的目的地址。

如下圖所示,假設主機A想與主機B通訊,主機A的預設閘道器路由器是RTA,那麼當A傳送報文給B時報文會被送到RTA。RTA接收到A傳送的報文以後會發現實際上主機A直接傳送給路由器RTB更好,它將傳送一個ICMPv6重定向報文給主機A,其中Target Address為RTB,Destination Address為主機B。

主機A接收到了重定向報文之後,會在預設路由表中新增一個主機路由,以後發往主機B的報文就直接給RTB。

這就是重定向的一個簡單過程,其中會有個問題:RTA如何知道去往主機B的路徑通過RTB更好呢?

其實這個很簡單,因為RTA會發現報文進入的介面就是報文路由得出介面,也就是說發往主機B的路由實際上只是在RTA上轉了一圈出來了,然後轉發到RTB,據此,RTA能判斷出直接給RTB是更好的路徑。

Path MTU

在IPv6中,為了減少中間轉發裝置的處理壓力,中間轉發裝置不對IPv6報文進行分片,報文的分片將在源節點進行。

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

如下圖所示整條傳輸路徑需要通過4條鏈路,每條鏈路的MTU分別是1500、1500、1400、1300,當源節點傳送一個分片報文的時候,Path MTU工作過程如下:

  • 首先按照PMTU為1500進行分片併傳送分片報文,當到達MTU為1400的出介面時,路由器返回Packet Too Big錯誤,同時攜帶MTU值為1400的資訊。
  • 源節點接收到之後會將報文重新按照PMTU為1400進行分片並再次傳送一個分片報文,當分片報文到達MTU值為1300的出介面時,同樣返回Packet Too Big錯誤,攜帶MTU值為1300的資訊。
  • 之後源節點重新按照PMTU為1300進行分片併傳送分片報文,最終到達目的地,這樣就找到了該路徑的PMTU。