談一談 IPv6 和 Happy Eyeballs
先看個圖,從 Ipv6 的相關(guān)資訊可以看到,各大互聯(lián)網(wǎng)公司都在推進 Ipv6 的部署和支持,這離不開工信部信通院(信息通信研究院)的大力推進。
Ipv6 的”好處”就不多說了,如果使用 Ipv6,每個設(shè)備都可以分配一個固定的地址,定位起來就方便多了,想想就很美(kong)好(bu)吧。
網(wǎng)絡(luò)設(shè)施和軟件的改進我們暫且不談,就來談下如何保障業(yè)務(wù)訪問的連通性。
一談到 Ipv6 ,大家印象里訪問一個 Ipv6 的網(wǎng)站的過程是這樣的:
通過 DNS 的 AAAA 解析獲取到了域名對應(yīng)的 Ipv6 的地址,然后就會通過 Ipv6 的地址訪問網(wǎng)站,如果訪問不通,業(yè)務(wù)就會掛掉,導(dǎo)致用戶訪問失敗。
如果這個網(wǎng)址只支持 Ipv6 ,那就是這種現(xiàn)象,如果網(wǎng)址本身支持雙棧,即同時支持 Ipv4 和 Ipv6 ,那么在某些環(huán)境下,會啟用 Happy Eyeballs 算法,進行快速回退,使用 Ipv4 進行訪問。
這個算法的提出是在2011年,最初推廣 Ipv6 的時候,為了避免讓大家擔心使用 Ipv6 后如果網(wǎng)絡(luò)不通,用戶會流失。
下面大概介紹一下 Happy Eyeballs,對于支持雙棧的網(wǎng)絡(luò)環(huán)境下,當訪問一個網(wǎng)站時,會同時發(fā)起 AAAA 和 A 的 DNS 查詢請求,并對獲取的結(jié)果進行排列,優(yōu)先 Ipv6 ,然后進行 Ipv6 的鏈接嘗試,在大概 200ms 后如果鏈接不通,立即啟用下一個 ip 的鏈接請求,一般就是 Ipv4 了。 在這種場景下,就不要擔心由于 Ipv6 的網(wǎng)絡(luò)連通性比較差而導(dǎo)致站點無法訪問了,即使在當前國內(nèi)各運營商 Ipv6 連通性比較差的情況下,多的就是一個大概 200ms 的延遲,跟拒絕服務(wù)比起來,還算能接受。
下面我們嘗試一下,我給自己的網(wǎng)站加了一個 Ipv6 的解析,隨便填的一個 ip,是無法訪問的。
然后測一下解析是否生效:

可以看到存在 Ipv4 和 Ipv6 的解析。 然后我們使用 curl (curl支持 Happy Eyeballs)訪問一下網(wǎng)址:https://fukun.org/httpget。
可以看到請求過程中有一個使用 Ipv6 嘗試的過程,然后又使用的 Ipv4 進行的訪問。
然后抓包看一下網(wǎng)絡(luò)情況。
可以看到,DNS查詢基本是同時發(fā)起的 AAAA 和 A 記錄的查詢,先獲取到了 A 記錄,又過了 30ms 左右才獲取到 AAAA 記錄。即使 A 記錄返回的比較快,在進行鏈接請求的時候,也先是對 Ipv6 的地址發(fā)起了 SYN 建連請求,在大概 200ms 后沒有收到回復(fù),就用 Ipv4 發(fā)起了 SYN 建連請求,鏈接建立成功并返回了正確的結(jié)果。
綜上可見,在雙棧情況下,即使 Ipv6 的連通性較差,也可以通過 Happy Eyeballs 算法進行快速回退至 Ipv4,從而進行正常訪問。
但這個算法也不是隨地都能生效的,需要對應(yīng)的軟件或操作系統(tǒng)支持才可以,目前支持 Happy Eyeballs 的終端包括 Chrome 瀏覽器, Opera 12.10, Firefox version 13, 蘋果操作系統(tǒng) OS X, 以及 cURL 命令。