ipV6

前言

衆所周知,32位的IPv4地址已經基本耗盡(這裏的耗盡只是說的分配完了,實際上有相當一部分並沒有投入到使用中),新一代的網絡協議--IPv6採用128位的地址長度擁有更大的地址空間,如此大的地址空間,可以給地球上的每粒沙子分配一個IPv6地址。IPv6網絡普及的聲音喊了很多年,在國內由於受限於各種因素卻一直沒有推廣開。2017年11月開始中共中央辦公廳和國務院辦公廳印發了《推薦互聯網協議第六版(IPv6)規模部署行動計劃》http://www.xinhuanet.com/politics/2017-11/26/c_1122012631.htm,併發出通知,要求各地區各部門結合實際認真貫徹落實。這條新聞傳達了一個很重要的信息:這個是推進中國IPv6發展的戰略總動員令。2018年6月份,網信辦對三大運營商和國內頭部的50家互聯網公司發出紅頭文件,要求各大運營商和頭部互聯網公司給出各自的實施方案和排期,並定下目標:在2018年年底國內IPv6活躍用戶數上升一個階段。所以從2018年6月份開始,各大公司的IPv6改造才緊鑼密鼓改造起來,並且在2018年底取得了相當的成果。

由於IPv6網絡協議相對來說還是一個比較新的協議,在推廣過程中,很多人對這個網絡協議缺乏必備的知識,所以在這裏寫一篇簡單的文章對該協議進行簡單介紹和應用。

基礎概念

軟件支持

當前大部分操作系統和硬件都比較好地支持IPv6了,簡單列舉如下:

  • Windows:windows 7、windows 8.x、windows 10,默認開啓IPv6;

  • Linux:內核2.6.x、內核3.x、內核4.x已經支持IPv6(需要手動開啓);

  • iOS:IOS9開始已經支持IPv6 Only,2016年蘋果已經強制要求app必須支持IPv6;

  • Android也已經支持IPv6(但是不支持DHCPv6)。

如何查看手機或者電腦的網絡是否支持IPv6呢,在手機或者電腦上的瀏覽器中打開:Ipv6-test.com,顯示如下說明你的手機網絡已經支持IPv6,並已經分配了IPv6地址。

圖一:查看當前網絡是否支持IPv6

從上述截圖中我們可以看到,當前大部分支持IPv6的網絡環境中都是雙棧環境,即同時支持IPv4和IPv6,也就是當我們連接運營商LTE網絡的時候,它一般會分配一個IPv4地址(一般是10.開頭的內網地址),和一個IPv6地址(全球單播地址,相當於ipv4裏面的公網地址)。雙棧環境下,用戶自動選擇使用什麼IPv6或者IPv4協議去連接遠端服務,如果服務端域名支持IPv6(域名解析中存在AAAA記錄),客戶端則會優先使用IPv6協議去連接服務端(特殊情況下除外);當服務端域名只支持IPv4(DNS解析中只有A記錄),客戶端則會使用IPv4協議去連接服務端,完成請求。

IPv6協議簡介

先看一個簡單的IPv6報文抓包圖:

圖二:ipv6數據報文

從WireShark的報文信息來看,IPv6報文的報文類型字段、頭部字段和IPv4報文存在較大的差異。RFC2460定義了IPv6數據報格式。總體結構上,IPv6數據報格式與IPv4數據報格式是一樣的,也是由IP報頭和數據(在IPv6中稱爲有效載荷)這兩個部分組成的,但在IPv6數據報數據部分還可以包括0個或者多個IPv6擴展報頭(Extension header),如下圖所示。IP報頭部分固定爲40字節長度,而有效載荷部分最長不得超過65535字節。

圖三:IPv6頭部字段

簡單介紹下IPv6報文中的各個頭部字段:

  • Version(版本):該字段表示IP版本,值爲6。

  • Traffic class(流量類別):該字段及其功能類似於IPv4的業務類型字段。該字段以區分業務編碼點(DSCP)標記一個IPv6數據包,以此指明數據包應當如何處理。

  • Flow label(流標籤):該字段用來標記IP數據包的一個流,當前的標準中沒有定義如何管理和處理流標籤的細節。

  • Payload length(有效載荷長度):該字段表示有效載荷的長度,有效載荷是指緊跟IPv6基本報頭的數據包,包含IPv6擴展報頭。

  • Next header(下一報頭):該字段指明瞭跟隨在IPv6基本報頭後的擴展報頭的信息類型。

更多詳細比較可以參考這篇文章:

IPV6報文頭部格式:(http://support.huawei.com/hedex/pages/EDOC10000256133118G231/08/EDOC10000256133118G231/08/resources/fea_des/topics/fea_ipv6_00014.html)

>>>>

IPv6地址表示方法

IPv6地址由八組、每組四位16進制數字組成,每組之間由":"來分隔,看個簡單的例子:

2001:cdba:0000:0000:0000:0000:3257:9652,每個:前後都是4位16進制的數字,共分隔成8組)

根據簡寫規則,上述地址可以簡寫成如下表示:

1.省略前導零,上述ip地址可以表示爲:

2001:cdba:0:0:0:0:3257:9652(4個0簡寫成1個0)

2.通過使用雙冒號(::)代替一系列零來指定Ipv6地址,上述地址可以表示爲:
2001:cdba::3257:9652(:0:0:0:0:簡寫成::,即省略所有的0,需要注意(一個IP地址中只可使用一次雙冒號)

>>>>

IPv6地址分類

IPv6地址是單個或一組接口的128位標識符。在IPv4中,ip地址分爲A、B、C、D、E五類,而IPv6突破了IPv4類別劃分,主要劃分爲三種地址類型:單播地址、組播地址和任意播地址,各類地址的介紹如下:

  • 單播(Unicast)地址:單播地址作爲一個單一的接口標識符。IPv6數據包發送到一個單播地址被傳遞到由該地址標識的接口。對應於IPv4的普通公網和私網地址;

  • 多播(MultiCast)地址:多播地址作爲一組標識符,多播地址的行爲/接口可能屬於不同的節點集合。IPv6數據包發送到多播地址被傳遞到多個接口;

  • 任播(AnyCast)地址:一組接口(一般屬於不同節點)的標識符。發往任播地址的包被送給該地址標識的接口之一(路由協議度量距離最近的)。

單播地址是使用最爲廣泛的一類地址,單播地址中包含了多種地址類型,包括:

1-1.單播地址

1-1-1全球單播地址

前綴2000::/3,指的是在IPv6的前3bit,必須爲二進制的001。而二進制換化爲十六進制,需要4bit的二進制數,所以IPv6全球單播地址的從左到右的第一字段的變化範圍爲“0010”到“0011”,換化爲十六進制變化範圍就爲2到3。那麼如下圖4所示,表示IPv6全球單播地址的範圍。相當於IPv4的公網地址(IPv6的誕生根本上就是爲了解決IPv4公網地址耗盡的問題)。這種地址在全球的路由器間可以路由。

圖四. IPv6全球單播地址的範圍

1-1-2鏈路本地地址

前綴FE80::/10,顧名思義,此類地址用於同一鏈路上的節點間的通信,主要用於自動配置地址和鄰居節點發現過程。Windows和Linux開啓IPv6後,默認會給網卡接口自動配置一個鏈路本地地址。也就是說,一個接口一定有一個鏈路本地地址。如下圖:

圖五.IPv6鏈路本地地址

每個接口必須至少有一個鏈路本地地址;每個接口可以配置1個以上的單播地址,例如一個接口可以配置一個鏈路本地地址,同時也可以配置一個全球單播地址。

注意:很容易會把鏈路本地地址和IPv4的私網/內網地址對應起來,其實鏈路本地地址對應於IPv4的APIPA地址,也就是169.254開頭的地址(典型場景就是windows開啓自動獲取地址而獲取失敗後自動分配一個169.254的地址)。而IPv4私網對應於IPv6的唯一本地地址。

1-1-3唯一本地地址

前綴FC00::/7,相當於IPv4的私網地址(10.0.0.0、172.16.0.0、192.168.0.0),在RFC4193中新定義的一種解決私網需求的單播地址類型。

在IPv4中,利用NAT技術私網內的網絡節點可以使用統一的公網出口訪問互聯網資源,大大節省了IPv4公網地址的消耗(IPv6推進緩慢的原因之一)。另一方面,由於默認情況下私網內節點與外界通信的發起是單向的,網絡訪問僅僅能從私網內發起,外部發起的請求會被統一網關或者防火牆阻隔掉,這樣的網絡架構很好的保護了私網內的節點安全性和私密性。因此,在安全性和私密性要求下,IPv6中同樣需要支持私網,並且也需要支持NAT。在Linux內核3.7版本開始加入對IPv6 NAT的支持,實現的方式和IPv4下的差別不大(Linux內核代碼中變量和函數的命名幾乎就是ctrl+c和ctrl+v過來的)。IPv6唯一本地地址配置如下圖:

圖六.IPv6唯一本地地址

1-1-4特殊地址

除了上述那些常見的單播地址,IPv6中還有一些特殊地址,簡單列舉如下:

  • 全0的地址::/128爲未定義地址,大家不要去使用

  • 除了最後一位是1,其它都是0的地址::1/128爲本地環回地址,同IPv4裏面的127.0.0.1

  • FF00::/8這個網段的地址都是多播地址

IPv6相關網絡工具

>>>>

dig

dns解析,查看一個域名是否具有AAAA記錄

圖七.dig獲取域名的AAAA記錄

>>>>

curl

通過IPv6網絡協議進行請求響應,獲取服務端數據

圖八.curl通過IPv6獲取接口數據

>>>>

ping6

查看IPv6網絡的連通性和域名解析的正確性

圖九.ping6測試IPv6網絡連通性

>>>>

telnet

查看對應IPv6地址端口是否開放

圖十.telnet查看端口可用性

>>>>

mtr

IPv6網絡連通性判斷工具

圖十一.mtr查看IPv6網絡連通性

>>>>

traceroute6

IPv6網絡測試、評估和管理工具

圖十二.traceroute6查看IPv6路由節點情況

>>>>

ip&route

查看本機IPv6路由表

圖十三.查看本機IPv6路由表

關於移動應用在IPv6和IPv4網絡環境中自動降級機制的研究

由於最近在幫助業務上線IPv6,所以簡單使用安卓手機(小米5S+MIUI10+瀏覽器)驗證了下手機在雙棧環境中如何自動選擇合適的協議向服務端請求數據。具體過程如下:

第一步需要對服務端的域名進行DNS解析。客戶端獲取域名的DNS解析時,會先請求域名的AAAA記錄,等DNS服務器返回域名的AAAA記錄解析後,然後再請求域名的A記錄。具體過程如下抓包截圖:

圖十四.DNS解析抓包

第二步根據獲取到的域名的AAAA記錄和A記錄情況,執行不同的操作:

1.如果AAAA記錄中存在有效的IPv6地址,且本地網絡支持IPv6,則會優先使用AAAA記錄裏面對應IPv6地址通過IPv6網絡協議去連接服務端,當通過域名的AAAA記錄無法連接上服務端,客戶端一般會重試4次(重試過程大概總計會耗費300ms左右,視具體網絡環境而定),如果四次都無法通過IPV6地址連接上服務端,客戶端會自動降級使用IPV4協議連接服務端,具體過程如下圖。

圖十五.IPv6和IPv4自動降級機制

2.如果域名的AAAA記錄中存在有效的IPv6地址,但是本地網絡不支持IPv6,則會直接使用A記錄中的IPv4地址通過IPv4網絡協議去連接服務端;

3.如果DNS服務器返回的AAAA記錄解析中沒有包含有效的IPv6地址,只有有效的A記錄,則會直接使用A記錄中的IPv4地址通過IPV4網絡協議去連接服務端。

總結

本篇文章僅僅只是對IPv6協議做了簡單介紹,涉及的知識方面較少。更多寫的是在業務上線IPv6過程中學習到的或者使用過的一些知識、工具。很多IPv6的基本概念並沒有介紹到,比如說鄰居發現協議、DHCPv6、ICMPv6、PMTU、EUI-64計算鏈路本地地址等,這些協議在網絡上已經有很多比較好的文章或者權威協議對這些知識點進行了介紹,大家不妨多動手谷歌下。

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