詳解IPv6與IPv4之間的差別!
IPv6是Internet Protocol Version 6的縮寫,其中Internet Protocol譯為“互聯網協議”。IPv6是IETF(互聯網工程任務組,Internet Engineering Task Force)設計的用于替代現行版本IP協議(IPv4)的下一代IP協議,號稱可以為全世界的每一粒沙子編上一個網址。
1. IPV6的基本概念
周所周知,IPv6采用128位的地址長度擁有更大的地址空間。首先我們先來認識一下IPv6到底長成什么樣子。
IPv6數據報文和IPv4有很大的差別:
- 數據鏈路層(L2)的type字段標識為 0x86dd,表示承載的上層協議是IPv6(IPv4對比:type字段為0x0800);
- IPv6的頭部字段,和IPv4差別巨大(可以猜測到,IPv6和IPv4無法兼容)。
我們來看下ipv6的報文頭部格式:
Ipv6報文頭部
ipv6的頭部更加的簡單,少了很多的字段,對比ipv4,有這幾個地方需要注意:
- IPv6報文頭部是定長(固定為40字節),IPv4報文頭部是變長的。這個意味著,寫代碼處理IPv6數據報文的效率會提高很多:);
- IPv6中Hop Limit字段含義類似IPv4的TTL;
- IPv6中的Traffic Class字段含義類似IPv4中的TOS(Type Of Service);
- IPv6的報文頭部取消了校驗和字段:取消這個字段也是對IPv4協議的一個改進。當IPv4報文在網路間傳輸,每經過一個路由器轉發就是修改TTL字段,就需要重新計算校驗和,而由于數據鏈路層L2和傳輸層L4的校驗已經足夠強壯,因此IPv6取消這個字段會提高路由器的轉發效率。值得一提的是,在IPv6協議下,傳輸層L4協議UDP、TCP是強制需要進行校驗和的(IPv4是可選的);
- IPv6報文頭部中的Next Header字段表示“承載上一層的協議類型”或者“擴展頭部類型”。
這里的含義與IPv4有很大的差別,需要加以解釋:
- 當IPv6數據報文承載的是上層協議ICMPv6、TCP、UDP等的時候,Next Header的值分別為58、6、17,這個時候和IPv4報文頭部中的Protocol字段很類似;
- 當不是以上3種協議類型的時候,IPv6報文頭部緊接的是擴展頭部。擴展頭部是IPv6引入的一個新的概念,每個IPv6的數據報文可以承載0個或多個擴展頭部,擴展頭部通過鏈表的形式組織起來。當IPv6數據報文承載著擴展頭部的時候,Next Header的數值為擴展頭部的類型值。
為什么要引入擴展頭部這個概念,這里也是IPv6對IPv4改進的一個方面,用擴展頭部取代了IPv4的可選項信息,精簡了IPv6的頭部,增強了IPv6的擴展性。有同學會不會有疑問,IPv6的分片數據報文怎么處理?其實就是使用了IPv6擴展頭部。
當發送一個分片IPv6數據報文的時候,IPv6使用的是擴展頭部的形式組織各個分片的信息,IPv6報文頭部Next Header字段值為44表示存在擴展頭部,擴展頭部是IPv6分片數據信息。
對比IPv4,分片信息是記錄在IPv4報文頭部的分片字段中。
IPv6的擴展頭部類型有很多種,除了上述的分片頭部,還有路由頭部、逐跳可選頭部等,具體的可以參考RFC2460。
本章主要介紹了IPv6的一些很直觀的認識,下面逐漸介紹IPv6上的基本知識和概念。
2. ipv6的地址語法
一個IPv6的地址使用冒號十六進制表示方法:128位的地址每16位分成一段,每個16位的段用十六進制表示并用冒號分隔開,例如:
一個普通公網IPv6地址:
- 2001:0D12:0000:0000:02AA:0987:FE29:9871
IPv6地址支持壓縮前導零的表示方法,例如上面的地址可以壓縮表示為:
- 200112:0:0:2AA:987:FE29:9871
為了進一步精簡IPv6地址,當冒號十六進制格式中出現連續幾段數值0的位段時,這些段可以壓縮為雙冒號的表示,例如上面的地址還可以進一步精簡表示為:
- [pquote]200112::2AA:987:FE29:9871
又例如IPv6的地址FF80:0:0:0:FF:3BA:891:67C2可以進一步精簡表示為:
- FE80::FF:3BA:891:67C2
這里值得注意的是:雙冒號只能出現一次。
3. IPv6地址的號段劃分和前綴表示法
IPv6擁有128位巨大的地址空間,對于那么大的空間,也不是隨意的劃分,而是使用按照bit位進行號段劃分(與鵝廠內部一些的64位uin改造放號的zone劃分算法)。
IPv6的地址結構如下圖:
例如RFC4291中定義了n=48, m=16,也就是子網和接口ID與各占64位。
IPv6支持子網前綴標識方法,類似于IPv4的無分類域間路由CIDR機制(注意:IPv6沒有子網掩碼mask的概念)。
使用“IPv6地址/前綴長度”表示方法,例如:
- 2001:C3:0:2C6A::/64表示一個子網;
- 而2001:C3:0:2C6A:C9B4:FF12:48BC:1A22/64表示該子網下的一個節點地址。
可以看到,一個IPv6的地址有子網前綴+接口ID構成,子網前綴由地址分配和管理機構定義和分配,而接口ID可以由各操作系統實現生成,生成算法后面的章節會介紹。
4. IPv6的地址類型
IPv6地址分三種類型:
- 單播,對應于IPv4的普通公網和私網地址;
- 組播,對應于IPv4的組播(多播)地址;
- 任播,IPv6新增的地址概念類型。
IPv6沒有廣播地址,用組播地址實現廣播的功能。實際上我們工作和生活最可能最多接觸的就是單播地址,接下來本文重點會講解單播地址的種類。組播和任播地址有興趣的同學自行查閱相關RFC和文獻。