IPv6入門教程
本篇文章主要從基礎概念、IPv6的相關網路工具、關於移動應用在IPv6和IPv4網路環境中自動降級機制的研究等三個方面介紹了IPv6的入門教程。
眾所周知,32位的IPv4地址已經基本耗盡(這裡的耗盡只是說的分配完了,實際上有相當一部分並沒有投入到使用中),新一代的網路協議--IPv6採用128位的地址長度擁有更大的地址空間,如此大的地址空間,可以給地球上的每粒沙子分配一個IPv6地址。IPv6網路普及的聲音喊了很多年,在國內由於受限於各種因素卻一直沒有推廣開。2017年11月開始中共中央辦公廳和國務院辦公廳印發了《推薦網際網路協議第六版(IPv6)規模部署行動計劃》,併發出通知,要求各地區各部門結合實際認真貫徹落實。這條新聞傳達了一個很重要的資訊:這個是推進中國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報文頭部格式:()
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這個網段的地址都是多播地址
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,所以簡單使用安卓手機(小米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計算鏈路本地地址等,這些協議在網路上已經有很多比較好的文章或者權威協議對這些知識點進行了介紹,大家不妨多動手谷歌下。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559359/viewspace-2637668/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Iptables入門教程
- vue入門教程Vue
- Redux入門教程Redux
- Electron入門教程
- Aseprite入門教程
- Twisted 入門 教程
- flask入門教程Flask
- Maven入門教程Maven
- awk 入門教程
- HBase入門教程
- Jmeter入門教程JMeter
- Elasticsearch入門教程Elasticsearch
- SnapKit入門教程APK
- Tmux入門教程UX
- Docker 入門教程Docker
- Thrift 入門教程
- Vuex入門教程Vue
- CMake入門教程
- RabbitMQ入門教程MQ
- mybatis入門教程MyBatis
- Git入門教程Git
- docker入門教程Docker
- tcpdump教程入門TCP
- Circos入門教程
- Vim入門教程
- OpenStack 入門教程
- React 入門教程React
- Webpack 入門教程Web
- Guzzle 入門教程
- ZooKeeper 入門教程
- Ceph入門教程
- Dart 入門教程Dart
- 新手入門,webpack入門詳細教程Web
- Android入門教程 | RecyclerView使用入門AndroidView
- git 入門教程之github 教程Github
- Kafka教程(一)Kafka入門教程Kafka
- GitHub Actions 入門教程Github
- React Hooks 入門教程ReactHook