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

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