如何确保你的 APP 支持 IPv6

  • 百占辉

2016 年 8 月 28 日

话题:语言 & 开发架构

由于移动互联网服务商拥有的 IPv4 地址即将耗尽,他们只能给出 IPv6 地址或者电信级 NATted 的 IPv4 地址,Apple 在今年五月四日宣布,从六月 1 日起,所有提交至 AppStore 的应用必须支持 IPv6 协议。同时,在 Google IPv6 使用统计中可以看出,当前 IPv6 的采用率已经接近 13%。所以,使你的 App 支持 IPv6 变得越来越重要,尤其是移动 App。IPv6 已经开始出现在 EMail Headers、SIP、DNS 等地方,你的 App 需要能够解析这些在 URL、头部字段和数据中的 IPv6 地址。至少得保证 App 第一次遇到这些 128 位或者更长的字符串时不会崩溃。

App 支持 IPv6 并不意味着它仅仅支持 IPv6。相当大一部分网络依然使用 IPv4 并且将持续很长一段时间,你得确保你的 App 依然支持 IPv4。同时,一些互联网服务商早已耗尽 IPv4 地址,从而选择将电信级 NATted 的 IPv4 地址分配给客户。而有的干脆选择仅部署 IPv6。这部分客户连接到 IPv4 网络的唯一方法是通过 6to4 隧道进行数据传输,它的原理是使用 IPv6 作为 IPv4 的传输层。基于以上原因,当前最好的方式是支持双协议栈。

在 Web 服务应用中,常常会使用正则表达式来识别 IPv4,这些表达式遇到 IPv6 将会失效。事实上,由于 IPv6 地址有许多不同的格式,不推荐使用正则式来识别 IPv6。可以尝试使用一些开源库来做这部分工作。另外,应检查一下存放 IP 地址的数据库字段是否已经扩展到 128 位,确保你的应用部署到了支持双协议栈的操作系统中,确保你使用的库也支持 IPv6,否则可能出现不必要的错误。总而言之,之前所有涉及 IP 的地方都需要检查以确保其能够支持 IPv6。

移动 App 经常使用 RESTful URL 与 服务端 App 进行通信,而服务端 App 可能使用 URL 与 LDAP 服务数据库或其他 RESTful 服务通信。由于 IPv6 地址以 ":" 为分隔符,而 host 和端口也是同样的分隔符,所以在 URLs 中使用 IPv6 需要使用方括号加以区分:https://[2111:500:4:13::128]:443/

在 IPv4 网络中,DNS 记录可以将域名翻译成 IPv4 地址,这个地址称之为 A 记录。同样在 IPv6 网络中,返回的 IPv6 地址的长度是 IPv4 地址的四倍,称之为 AAAA 记录。在进行 DNS 查询时,一个单独的域名可以同时拥有一个 A 记录和一个 AAAA 记录,所以域名可以被翻译为一个 IPv4 地址和一个 IPv6 地址。如果你同时获得了一个 A 记录和一个 AAAA 记录,你需要同时使用两个地址进行访问,并选取访问速度更快的那个地址。另外,当一些网络服务使用 IPv6 时,IP 地理位置系统需要及时更新其数据库。

当一些客户端程序使用 IP socket 进行跨进程通信和一些服务端程序访问同一个主机中的其他服务时,就要使用到被称为环回地址的 IP 地址,通常是 localhost。在 IPv4 中,localhost 可以为 127.0.0.0 至 127.255.255.255 之间的任意地址。而在 IPv6 中,有且仅有一个环回地址 ::1。所以最好使用 localhost 当做环回地址而不是特定的 IP 地址。

测试,当一切条件完备以后,还需要一些测试。如果你是公共网站,可以使用类似于 internet.nl 的开放工具进行 IPv6 访问测试。


感谢夏雪对本文的审校。

给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ@丁晓昀),微信(微信号:InfoQChina)关注我们。

语言 & 开发架构