人人熟知的IPV6竟然還有這麼多細節

IPv6

目錄

  1. IPV6簡介
  2. IPV4和IPV6對比

一、IPv6簡介

IPv6(Internet Protocol Version 6)是網絡層協議的第二代標準協議,也被稱爲IPng(IP Next Generation)。它是Internet工程任務組IETF(Internet Engineering Task Force)設計的一套規範,是IPv4(Internet Protocol Version 4)的升級版本。

二、IPV4和IPV6對比

針對問題 IPv4的缺陷 IPv6的改進
地址空間不足 Pv4地址採用32比特標識,理論上能夠提供的地址數量是43億(由於地址分配的原因,實際可使用的數量不到43億)。另外,IPv4地址的分配也很不均衡:美國佔全球地址空間的一半左右,而歐洲則相對匱乏;亞太地區則更加匱乏。與此同時,移動IP和寬帶技術的發展需要更多的IP地址。目前IPv4地址已經消耗殆盡。針對IPv4的地址短缺問題,也曾先後出現過幾種解決方案。比較有代表性的是無類別域間路由CIDR(Classless Inter-Domain Routing)和網絡地址轉換NAT(Network Address Translator)。但是CIDR和NAT都有各自的弊端和不能解決的問題,由此推動了IPv6的發展。 IPv6地址採用128比特標識。128位的地址結構使IPv6理論上可以擁有(43億×43億×43億×43億)個地址。近乎無限的地址空間是IPv6的最大優勢。
報文格式不合理 IPv4報頭包含可選字段Options,內容涉及Security、Timestamp、Record route等,這些Options可以將IPv4報頭長度從20字節擴充到60字節。攜帶這些Options的IPv4報文在轉發過程中往往需要中間路由轉發設備進行軟件處理,對於性能是個很大的消耗,因此實際中也很少使用。 IPv6和IPv4相比,去除了IHL、Identifier、Flag、Fragment Offset、Header Checksum、 Option、Padding域,只增加了流標籤域,因此IPv6報文頭的處理較IPv4更爲簡化,提高了處理效率。另外,IPv6爲了更好支持各種選項處理,提出了擴展頭的概念,新增選項時不必修改現有結構,理論上可以無限擴展,體現了優異的靈活性。
自動配置和重新編址 由於IPv4地址只有32比特,並且地址分配不均衡,導致在網絡擴容或重新部署時,經常需要重新分配IP地址,因此需要能夠進行自動配置和重新編址,以減少維護工作量。目前IPv4的自動配置和重新編址機制主要依靠DHCP協議。 IPv6協議內置支持通過地址自動配置方式使主機自動發現網絡並獲取IPv6地址,大大提高了內部網絡的可管理性。
路由聚合 由於IPv4發展初期的分配規劃問題,造成許多IPv4地址分配不連續,不能有效聚合路由。日益龐大的路由表耗用大量內存,對設備成本和轉發效率產生影響,這一問題促使設備製造商不斷升級其產品,以提高路由尋址和轉發性能。 巨大的地址空間使得IPv6可以方便的進行層次化網絡部署。層次化的網絡結構可以方便的進行路由聚合,提高了路由轉發效率。
對端到端的安全的支持 IPv4協議制定時並沒有仔細針對安全性進行設計,因此固有的框架結構並不能支持端到端的安全。 IPv6中,網絡層支持IPSec的認證和加密,支持端到端的安全。
對QoS(Quality of Service)的支持 隨着網絡會議、網絡電話、網絡電視迅速普及與使用,客戶要求有更好的QoS來保障這些音視頻實時轉發。IPv4並沒有專門的手段對QoS進行支持。 IPv6新增了流標記域,提供QoS保證。
對移動特性的支持 隨着Internet的發展,移動IPv4出現了一些問題,比如:三角路由,源地址過濾等。 IPv6協議規定必須支持移動特性。和移動IPv4相比,移動IPv6使用鄰居發現功能可直接實現外地網絡的發現並得到轉交地址,而不必使用外地代理。同時,利用路由擴展頭和目的地址擴展頭移動節點和對等節點之間可以直接通信,解決了移動IPv4的三角路由、源地址過濾問題,移動通信處理效率更高且對應用層透明。

PS:三角路由、源地址過濾問題、CIDR和NAT將在其他博文中給出。

三、IPV6基本報文結構

在這裏插入圖片描述

  1. 版本號Version:長度爲4bit。對於IPv6,該值爲6。
  2. 流類別Traffic Class:長度爲8bit用來標識對應IPv6的通信流類別,或者說是優先級別,主要應用於QoS。類似於IPv4中的ToS(服務類型)字段。
  3. 流標籤Flow Label:長度爲20bit。流標籤字段時IPv6數據報中新增的一個字段,佔20位,可用來標記報文的數據流類型,以便在網絡層區分不同的報文。流標籤字段有源節點分配,通過流標籤、源地址、目的地址三元組方式就可以唯一標識一條通信流,而不用像IPv4那樣需要使用五元組方式(源地址、目的地址、源端口、目的端口和傳輸層協議號)。這樣發動的最大好處有兩點:一是流標籤可以和任意的流關聯,需要標識不同類型的流(可以是非五元組)時,無需對流標籤做改動;二是流標籤在IPv6基本頭中,使用IPSec時此域對轉發路由器可見,因此轉發路由器可以在使用IPv6報文IPSec的情況下仍然可以通過三元組(流標籤、源地址、目的地址)針對特定的流進行QoS(質量服務)處理。
  4. 淨荷載長度Payload Length:長度爲16bit。有效載荷是指緊跟IPv6報頭的數據報的其它部分(即擴展報頭和上層協議數據單元)。該字段只能表示最大長度爲65535字節的有效載荷。如果有效載荷的長度超過這個值,該字段會置0,而有效載荷的長度用逐跳選項擴展報頭中的超大有效載荷選項來表示(該字段表述數值爲數據報長度減40)。
  5. 下一個ipv6首部Next Header:長度爲8bit,下一個頭部字段用來標識當前報頭(或者擴展報頭)的下一個頭部類型。每種擴展報頭都有其對應的值。下一個頭部字段內定義的擴展報頭類型與IPv4中的協議字段值類似,但在IPv6數據報中,緊接着IPv6報頭的可能不是上層協議頭部(當沒有擴展報頭或者爲最後一個擴展報頭時纔是上層協議頭),而是IPv6擴展報頭。這一機制下處理擴展報頭更高效,因爲標識了數據報中對應的上層協議或者擴展報頭類型,轉發路由器只需處理必須處理的擴展報頭,提高了轉發效率。
  6. 跳數限制Hop Limit:長度爲8bit。該字段類似於IPv4中的TTL字段,它定義了IP數據報所能經過的最大跳數。每經過一個設備,該數值減去1,當該字段的值爲0時,數據報將被丟棄。
  7. 源IP地址Source Address:長度爲128bit。表示發送節點的IPV6地址。
  8. 目的IP地址Destination Address:長度爲128bit。表示接收節點的IPV6地址。

PS:節點是主機和路由器的統稱。

四、IPV6擴展報頭結構

在這裏插入圖片描述

IPv6擴展報頭中主要字段解釋如下:

  1. Next Header:下一個報頭,長度爲8bit。與基本報頭的Next Header的作用相同。指明下一個擴展報頭(如果存在)或上層協議的類型。
  2. Extension Header Len:報頭擴展長度,長度爲8bit。表示擴展報頭的長度(不包含Next Header字段)。
  3. Extension Head Data:擴展報頭數據,長度可變。擴展報頭的內容,爲一系列選項字段和填充字段的組合。

在各字段介紹中我們講到了,IPv6報文中可以攜帶可選的IPv6擴展報頭。IPv6擴展報頭是跟在IPv6基本報頭後面的可選報頭。由於在IPv4的報頭中包含了幾乎所有的可選項,因此每個中間路由器都必須檢查這些選項是否存在。在IPv6中,這些相關選項被統一移到了擴展報頭中,這樣中間路由器不必處理每一個可能出現的選項(僅有**“逐跳選項”報頭是必須要處理**的),提高了處理器處理數據報文的速度,也提高了其轉發的性能。
IPv6擴展報頭附加在IPv6報頭目的IP地址字段後面,可以有0個,或者多個擴展報頭。主要的IPv6擴展報頭有一下幾類:

目前,RFC 2460中定義了6個IPv6擴展頭:逐跳選項報頭(0)、目的選項報頭(60)、路由報頭(43)、分段報頭(44)、認證報頭(51)、封裝安全淨載報頭(50)。

  1. 逐跳選項頭(Hop-by-hop Options Header)

    擴展報頭類型值爲0(在IPv6報頭下一個頭部字段中定義,下同)。此擴展報頭須被轉發路徑所有節點處理。目前在路由告警,資源預留(RSVP)和與Jumbo幀(Jumbo幀是長度超過65535字節的報文,傳輸這種報文需要轉發路徑中所有結點都能正常處理)處理中使用了逐跳選項頭,因爲路由告警需要通知到轉發路徑中所有結點。

  2. 目的選項頭(Destination Options Header)

    本擴展報頭類型值爲60。只可能出現在兩個位置:

    • 路由頭前,這是此選項頭被目的節點和路由頭中指定的結點處理;
    • 上層頭前(任何的ESP頭後),此時只能被目的結點處理。

    主要在移動IPv6中使用目的選項頭,稱爲家鄉地址選項。家鄉地址選項由目的選項頭攜帶,用以移動結點離開“家鄉”後通知接受節點此移動結點對應的家鄉地址。接受節點收到帶有家鄉地址選項的報文後,會把家鄉地址選項中的源地址(移動節點的家鄉地址)和報文中源地址(移動節點的轉交地址)交換,這樣上層協議始終認爲是在和移動節點的家鄉地址通信,實現了移動漫遊功能。

  3. 路由頭(Routing Header)

    本擴展報頭類型值爲43,用於源路由選項和移動IPv6。路由報頭和IPv4的Loose Source and Record Route選項類似,該報頭能夠被IPv6源節點用來強制數據包經過特定的設備。

  4. 分段報頭
    本擴展報頭類型值爲44,用於標識數據報的分段,在IPv4中就有對應的字段。當源節點發送的報文超過傳輸鏈路MTU(源節點和目的節點之間傳輸路徑的MTU)時,需要對報文進行分段時使用。

  5. 認證報頭:
    本擴展報頭類型值爲51,該報頭由IPsec使用,提供認證、數據完整性以及重放保護。它還對IPv6基本報頭中的一些字段進行保護。

  6. 封裝安全淨載報頭:

本擴展報頭類型值爲50,該報頭由IPsec使用,提供認證、數據完整性以及重放保護和IPv6數據報的加密,類似於認證報頭。

  1. 上層頭
    這是用來標識數據報中上層協議類型,如TCP、UDP、ICMP(58)等。

注意:目的選項頭最多出現兩次,一次在路由頭前,一次在上層協議頭前,其他選項頭最多隻能出現一次。IPv6節點必須能夠處理選項頭(逐跳選項頭除外,它固定只能緊隨基本報頭之後)在任意位置出現,以保證互通性。

同一個IPV6報頭中各字段出現順序

路由設備轉發時根據基本報頭中Next Header值來決定是否要處理擴展頭,並不是所有的擴展報頭都需要被轉發路由設備查看和處理的。當超過一種擴展報頭被用在同一個分組裏時,報頭必須按照下列順序出現:

  1. IPv6基本報頭
  2. 逐跳選項擴展報頭
  3. 目的選項擴展報頭(路由擴展頭前)
  4. 路由擴展報頭
  5. 分段擴展報頭
  6. 認證擴展報頭
  7. 封裝安全淨載荷擴展報頭
  8. 目的選項擴展報頭(上層頭前)
  9. 上層協議數據報文

該部分摘抄自:「曹世宏的博客」的原創文章並根據自我理解稍有改動。

五、IPv6地址

IPv6地址的表示方法:

IPv6地址總長度爲128比特,通常分爲8組,每組爲4個十六進制數的形式,每組十六進制數間用冒號分隔。例如:FC00:0000:130F:0000:0000:09C0:876A:130B,這是IPv6地址的首選格式。

爲了書寫方便,IPv6還提供了壓縮格式,以上述IPv6地址爲例,具體壓縮規則爲:

  • 每組中的前導“0”都可以省略,所以上述地址可寫爲:FC00:0:130F:0:0:9C0:876A:130B。
  • 地址中包含的連續兩個或多個均爲0的組,可以用雙冒號“::”來代替,所以上述地址又可以進一步簡寫爲:FC00:0:130F::9C0:876A:130B。
  • 需要注意的是,在一個IPv6地址中只能使用一次雙冒號“::”,否則當計算機將壓縮後的地址恢復成128位時,無法確定每個“::”代表0的個數。

IPv6地址的結構:

一個IPv6地址可以分爲如下兩部分:

  • 網絡前綴:n比特,相當於IPv4地址中的網絡ID
  • 接口標識:128-n比特,相當於IPv4地址中的主機ID

對於IPv6單播地址來說,如果地址的前三比特不是000,則接口標識必須爲64位;如果地址的前三位是000,則沒有此限制。

接口標識可通過三種方法生成:手工配置、系統通過軟件自動生成或IEEE EUI-64規範生成。其中,EUI-64規範自動生成最爲常用。

IEEE EUI-64規範是將接口的MAC地址轉換爲IPv6接口標識的過程。如下圖所示,MAC地址的前24位(用c表示的部分)爲公司標識,後24位(用m表示的部分)爲擴展標識符。從高位數,第7位是0表示了MAC地址本地唯一。轉換的第一步將FFFE插入MAC地址的公司標識和擴展標識符之間,第二步將從高位數,第7位的0改爲1表示此接口標識全球唯一
在這裏插入圖片描述

例如:MAC地址:000E-0C82-C4D4;轉換後020E:0CFF:FE82:C4D4。

這種由MAC地址產生IPv6地址接口標識的方法可以減少配置的工作量,尤其是當採用無狀態地址自動配置時,只需要獲取一個IPv6前綴就可以與接口標識形成IPv6地址。但是使用這種方式最大的缺點是任何人都可以通過二層MAC地址推算出三層IPv6地址。

IPv6的地址分類:

IPv6地址分爲單播地址、任意播地址(Anycast Address)、組播地址三種類型。和IPv4相比,取消了廣播地址類型,以更豐富的組播地址代替,同時增加了任意播地址類型。

IPv6單播地址:

IPv6單播地址標識了一個接口,由於每個接口屬於一個節點,因此每個節點的任何接口上的單播地址都可以標識這個節點。發往單播地址的報文,由此地址標識的接口接收。

IPv6定義了多種單播地址,目前常用的單播地址有:未指定地址、環回地址、全球單播地址、鏈路本地地址、唯一本地地址ULA(Unique Local Address)。

  • 未指定地址

    IPv6中的未指定地址即 0:0:0:0:0:0:0:0/128 或者::/128。該地址可以表示某個接口或者節點還沒有IP地址,可以作爲某些報文的源IP地址,例如在鄰居請求NS(Neighbor Solicitation)報文的重複地址檢測中會出現。源IP地址是::的報文不會被路由設備轉發

  • 環回地址

    IPv6中的環回地址即 0:0:0:0:0:0:0:1/128 或者::1/128。環回與IPv4中的127.0.0.1作用相同,主要用於設備給自己發送報文。該地址通常用來作爲一個虛接口的地址(如Loopback接口)。實際發送的數據包中不能使用環回地址作爲源IP地址或者目的IP地址。

  • 全球單播地址

    全球單播地址是帶有全球單播前綴的IPv6地址,其作用類似於IPv4中的公網地址。這種類型的地址允許路由前綴的聚合,從而限制了全球路由表項的數量。

    全球單播地址由全球路由前綴(Global routing prefix)、子網ID(Subnet ID)和接口標識(Interface ID)組成,其格式如下如所示:
    在這裏插入圖片描述

全球單播地址各字段說明

Global routing prefix:全球路由前綴。由提供商(Provider)指定給一個組織機構,通常全球路由前綴至少爲48位。目前已經分配的全球路由前綴的前3bit均爲001

Subnet ID:子網ID。組織機構可以用子網ID來構建本地網絡(Site)。子網ID通常最多分配到第64位。子網ID和IPv4中的子網號作用相似。

Interface ID:接口標識。用來標識一個設備(Host)。

  • 鏈路本地地址

    鏈路本地地址是IPv6中的應用範圍受限制的地址類型,只能在連接到同一本地鏈路的節點之間使用。它使用了特定的本地鏈路前綴FE80::/10(最高10位值爲1111111010),同時將接口標識添加在後面作爲地址的低64比特。

多說兩句

爲何需要link-local?

答:在一個接口可以配置很多IPv6地址,所以學習路由就有可能出現很多下一跳。所以出現Link Local地址唯一標識一個節點。在本地鏈路看到下一跳都是對端的Link Local地址。
在網絡重新編址過程中,節點和路由器的Link Local地址不會發生變化,可以很容易地做一個修改,不用擔心網絡不可達。

那麼又爲什麼要配置多個IPV6地址呢?

答:可以配置多個地址是可以使得用戶接入不同的網段。因爲有時候網絡提供商是多個的,而他們都在不同的網段,每個提供商可以提供不同的服務,爲了能夠享受多種服務,PC和路由器就需要配置多個地址,使得不同網段都能接入。

當一個節點啓動IPv6協議棧時,啓動時節點的每個接口會自動配置一個鏈路本地地址(其固定的前綴+EUI-64規則形成的接口標識)。這種機制使得兩個連接到同一鏈路的IPv6節點不需要做任何配置就可以通信。所以鏈路本地地址廣泛應用於鄰居發現,無狀態地址配置等應用。

以鏈路本地地址爲源地址或目的地址的IPv6報文不會被路由設備轉發到其他鏈路。鏈路本地地址的格式如下如所示:
在這裏插入圖片描述

  • 唯一本地地址

唯一本地地址是另一種應用範圍受限的地址,它僅能在一個站點內使用。由於本地站點地址的廢除(RFC3879),唯一本地地址被用來代替本地站點地址。

唯一本地地址的作用類似於IPv4中的私網地址,任何沒有申請到提供商分配的全球單播地址的組織機構都可以使用唯一本地地址。唯一本地地址只能在本地網絡內部被路由轉發而不會在全球網絡中被路由轉發。唯一本地地址格式如下如所示:
在這裏插入圖片描述

唯一本地地址各字段說明

Prefix:前綴;固定爲FC00::/7

L:L標誌位;值爲1代表該地址爲在本地網絡範圍內使用的地址;值爲0被保留,用於以後擴展。

Global ID:全球唯一前綴;通過僞隨機方式產生。

Subnet ID:子網ID;劃分子網使用。

Interface ID:接口標識。

唯一本地地址具有如下特點:
  • 具有全球唯一的前綴(雖然隨機方式產生,但是衝突概率很低)。
  • 可以進行網絡之間的私有連接,而不必擔心地址衝突等問題。
  • 具有知名前綴(FC00::/7),方便邊緣設備進行路由過濾。
  • 如果出現路由泄漏,該地址不會和其他地址衝突,不會造成Internet路由衝突。
  • 應用中,上層應用程序將這些地址看作全球單播地址對待。
  • 獨立於互聯網服務提供商ISP(Internet Service Provider)。
IPv6組播地址:

IPv6的組播與IPv4相同,用來標識一組接口,一般這些接口屬於不同的節點。一個節點可能屬於0到多個組播組。發往組播地址的報文被組播地址標識的所有接口接收。例如組播地址FF02::1表示鏈路本地範圍的所有節點,組播地址FF02::2表示鏈路本地範圍的所有路由器。

IPv6組播地址格式如下圖:
在這裏插入圖片描述

一個IPv6組播地址由前綴,標誌(Flag)字段、範圍(Scope)字段以及組播組ID(Global ID)4個部分組成:

  • 前綴:IPv6組播地址的前綴是FF00::/8。

  • 標誌字段(Flag):長度4bit,格式如下:

0 R P T

flgs位的最高1bit爲保留,必須設置爲0

T位:如果爲置0表示永久分配或者是well-known組播地址,如果置1表示臨時分配動態的地址,不固定。

P位:如果置1的話表示此組播地址是一個基於單播前綴的ipv6組播地址。默認爲0,如果P位設置爲1,那麼T位必須爲1。

R位:如果置1的話表示此組播地址是一個內嵌RP地址的ipv6組播地址。默認爲0。

PS:嵌入式RP(Embedded RP)是IPv6 PIM(組播的一個協議)中特有的RP發現機制,該機制使用內嵌RP地址的IPv6組播地址,使得組播路由器可以直接從該地址中解析出RP的地址。

  • 範圍字段(Scope):長度4bit,用來限制組播數據流在網絡中發送的範圍。
二進制 十六進制 範圍類型
0000 0 reserved/保留
0001 1 Interface-Local scope/本地接口範圍
0010 2 Link-Local scope/鏈路本地範圍
0100 4 Admin-Local scope/本地管理範圍
0101 5 Site-Local scope/本地站點範圍
1000 8 Organization-Local scope/本地組織範圍
1110 E Global scope/全球範圍
  • 組播組ID(Group ID):長度112bit,用以標識組播組。目前,RFC2373並沒有將所有的112位都定義成組標識,而是建議僅使用該112位的最低32位作爲組播組ID,將剩餘的80位都置0。這樣每個組播組ID都映射到一個唯一的以太網組播MAC地址(RFC2464)。
組播組 IPV6組播地址
所有節點的組播地址 FF02:0:0:0:0:0:0:1
所有路由器的組播地址 FF02:0:0:0:0:0:0:2
所有OSPF路由器組播地址 FF02:0:0:0:0:0:0:5
所有OSPF的DR路由器組播地址 FF02:0:0:0:0:0:0:6
所有RIP路由器組播地址 FF02:0:0:0:0:0:0:9
所有PIM路由器組播地址 FF02:0:0:0:0:0:0:D
被請求節點的組播地址 FF02:0:0:0:0:1:FFXX:XXXX
  • 被請求節點組播地址:

被請求節點組播地址通過節點的單播或任播地址生成。當一個節點具有了單播或任播地址,就會對應生成一個被請求節點組播地址,並且加入這個組播組。一個單播地址或任播地址對應一個被請求節點組播地址。該地址主要用於鄰居發現機制和地址重複檢測功能。

IPv6中沒有廣播地址,也不使用ARP(節點請求是如何高效率去替代IPv4的ARP協議?在其他博文中會提到)。但是仍然需要從IP地址解析到MAC地址的功能。在IPv6中,這個功能通過鄰居請求NS(Neighbor Solicitation)報文完成。當一個節點需要解析某個IPv6地址對應的MAC地址時,會發送NS報文,該報文的目的IP就是需要解析的IPv6地址對應的被請求節點組播地址;只有具有該組播地址的節點會檢查處理。

被請求節點組播地址由前綴FF02::1:FF00:0/104和單播地址的最後24位組成。

IPv6任意播地址:

任意播地址標識一組網絡接口(通常屬於不同的節點)。目標地址是任意播地址的數據包將發送給其中路由意義上最近的一個網絡接口

任意播地址設計用來在給多個主機或者節點提供相同服務時提供冗餘功能和負載分擔功能。目前,任意播地址的使用通過共享單播地址方式來完成。將一個單播地址分配給多個節點或者主機,這樣在網絡中如果存在多條該地址路由,當發送者發送以任意播地址爲目的IP的數據報文時,發送者無法控制哪臺設備能夠收到,這取決於整個網絡中路由協議計算的結果。這種方式可以適用於一些無狀態的應用,例如DNS等。

IPv6中沒有爲任意播規定單獨的地址空間,任意播地址和單播地址使用相同的地址空間。目前IPv6中任意播主要應用於移動IPv6。

注意:IPv6任意播地址僅可以被分配給路由設備,不能應用於主機。任意播地址不能作爲IPv6報文的源地址。

  • 子網路由器任意播地址

    子網路由器任意播地址是已經定義好的一種任意播地址(RFC3513)。發送到子網路由器任意播地址的報文會被髮送到該地址標識的子網中路由意義上最近的一個設備。所有設備都必須支持子網任意播地址。子網路由器任意播地址用於節點需要和遠端子網上所有設備中的一個(不關心具體是哪一個)通信時使用。例如,一個移動節點需要和它的“家鄉”子網上的所有移動代理中的一個進行通信。

    子網路由器任播地址由n bit子網前綴標識子網,其餘用0填充。格式如下如所示:

    在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章