IPv6入門教程

本篇文章主要從基礎概念、IPv6的相關網絡工具、關於移動應用在IPv6和IPv4網絡環境中自動降級機制的研究等三個方面介紹了IPv6的入門教程。
上篇文章回顧: gRPC-web現狀及測試

                                           前言

衆所周知,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年末取得了至關的成果。web

因爲IPv6網絡協議相對來講仍是一個比較新的協議,在推廣過程當中,不少人對這個網絡協議缺少必備的知識,因此在這裏寫一篇簡單的文章對該協議進行簡單介紹和應用。windows

                                        基礎概念

軟件支持

當前大部分操做系統和硬件都比較好地支持IPv6了,簡單列舉以下:瀏覽器

  • Windows:windows 七、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地址。併發

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

從上述截圖中咱們能夠看到,當前大部分支持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報文頭部格式:www.xinhuanet.com/politics/20…

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的基本概念並無介紹到,好比說鄰居發現協議、DHCPv六、ICMPv六、PMTU、EUI-64計算鏈路本地地址等,這些協議在網絡上已經有不少比較好的文章或者權威協議對這些知識點進行了介紹,你們不妨多動手谷歌下。

本文轉自公衆號「小米運維」,點擊查看原文

相關文章
相關標籤/搜索