先看个图,从 Ipv6 的相关资讯可以看到,各大互联网公司都在推进 Ipv6 的部署和支持,这离不开工信部信通院(信息通信研究院)的大力推进。

Ipv6 的"好处"就不多说了,如果使用 Ipv6,每个设备都可以分配一个固定的地址,定位起来就方便多了,想想就很美(kong)好(bu)吧。

网络设施和软件的改进我们暂且不谈,就来谈下如何保障业务访问的连通性。

一谈到 Ipv6 ,大家印象里访问一个 Ipv6 的网站的过程是这样的:
通过 DNS 的 AAAA 解析获取到了域名对应的 Ipv6 的地址,然后就会通过 Ipv6 的地址访问网站,如果访问不通,业务就会挂掉,导致用户访问失败。

如果这个网址只支持 Ipv6 ,那就是这种现象,如果网址本身支持双栈,即同时支持 Ipv4 和 Ipv6 ,那么在某些环境下,会启用 Happy Eyeballs 算法,进行快速回退,使用 Ipv4 进行访问。
这个算法的提出是在2011年,最初推广 Ipv6 的时候,为了避免让大家担心使用 Ipv6 后如果网络不通,用户会流失。

下面大概介绍一下 Happy Eyeballs,对于支持双栈的网络环境下,当访问一个网站时,会同时发起 AAAA 和 A 的 DNS 查询请求,并对获取的结果进行排列,优先 Ipv6 ,然后进行 Ipv6 的链接尝试,在大概 200ms 后如果链接不通,立即启用下一个 ip 的链接请求,一般就是 Ipv4 了。 在这种场景下,就不要担心由于 Ipv6 的网络连通性比较差而导致站点无法访问了,即使在当前国内各运营商 Ipv6 连通性比较差的情况下,多的就是一个大概 200ms 的延迟,跟拒绝服务比起来,还算能接受。

下面我们尝试一下,我给自己的网站加了一个 Ipv6 的解析,随便填的一个 ip,是无法访问的。

然后测一下解析是否生效:
可以看到存在 Ipv4 和 Ipv6 的解析。 然后我们使用 curl (curl支持 Happy Eyeballs)访问一下网址:https://fukun.org/httpget 可以看到请求过程中有一个使用 Ipv6 尝试的过程,然后又使用的 Ipv4 进行的访问。

然后抓包看一下网络情况。 可以看到,DNS查询基本是同时发起的 AAAA 和 A 记录的查询,先获取到了 A 记录,又过了 30ms 左右才获取到 AAAA 记录。即使 A 记录返回的比较快,在进行链接请求的时候,也先是对 Ipv6 的地址发起了 SYN 建连请求,在大概 200ms 后没有收到回复,就用 Ipv4 发起了 SYN 建连请求,链接建立成功并返回了正确的结果。

综上可见,在双栈情况下,即使 Ipv6 的连通性较差,也可以通过 Happy Eyeballs 算法进行快速回退至 Ipv4,从而进行正常访问。
但这个算法也不是随地都能生效的,需要对应的软件或操作系统支持才可以,目前支持 Happy Eyeballs 的终端包括 Chrome 浏览器, Opera 12.10, Firefox version 13, 苹果操作系统 OS X, 以及 cURL 命令。