对于 IPv6 的采用来说,这是一个非常令人兴奋的消息 。 6 月, Apple 宣布 所有 iOS9 应用程序都需要“兼容 IPv6”。
由于 IPv6 支持对于确保您的应用程序在全球范围内为每一位客户服务至关重要,因此我们将其作为 AppStore 提交要求,从 iOS 9 开始。
在这种情况下,
兼容
仅意味着应用程序应实现
NSURLSession
类(
或类似的替代方案
),它将 DNS 名称转换为 AAAA (IPv6) 或 A (IPv4) 记录,具体取决于哪个可用。
这并不意味着实际的主机名 需要 是 IPv6。只要所有与 DNS 相关的系统调用都以 允许 IPv6(如果可用)的方式完成,您仍然可以拥有仅 IPv4 的应用程序。
但为了进一步鼓励采用 IPv6,Apple 刚刚鼓励其所有应用程序开发人员在适用的情况下使用 IPv6: 与 IPv6 连接相比,IPv4 网络将受到 25ms 的惩罚 。
Apple 实施了 “Happy Eyeballs”, 这是一种由 IETF 发布的算法,它可以使双栈应用程序(那些同时理解 IPv4 和 IPv6 的应用程序)对用户的响应更快,避免了 IPv6 连接或设置不完善的用户通常会遇到的问题。
自四年前将其引入 Mac OSX 系列以来,Apple 已对下一个 Mac OSX 版本“El Capitan”的实现进行了重大更改。
1. 查询 A 和 AAAA 的 DNS 解析器。
如果 DNS 记录不在缓存中,请求将通过网络从 AAAA 优先发送。2. 如果我们得到的第一个回复是 AAAA,我们立即发送 v6 SYN
3. 如果我们得到的第一个回复是 A 并且我们期待 AAAA,我们启动一个 25ms 计时器
— 如果定时器触发,我们发送 v4 SYN
— 如果我们在 25 毫秒窗口期间获得 AAAA,我们将继续进行地址选择
[v6ops] Apple 和 IPv6 — 快乐的眼球
换句话说:DNS 调用是并行完成的,既针对 AAAAA 记录,也针对 A 记录。在 A 记录的答案被 接受 之前,至少应该等待 25 毫秒等待对 AAAA 查询的 潜在 响应。
描述 Happy Eyeballs 算法的 RFC6555 指出,Firefox 和 Chrome 使用 300 毫秒的惩罚计时器。
1. 调用 getaddinfo(),它返回按主机地址偏好策略排序的 IP 地址列表。
2. 发起与该列表中的第一个地址的连接尝试(例如,IPv6)。
3. 如果该连接在短时间内没有完成(Firefox 和 Chrome 使用 300 毫秒),则使用属于其他地址系列(例如 IPv4)的第一个地址发起连接尝试。
4. 使用建立的第一个连接。另一个连接被丢弃。
RFC6555
Apple 的实施不像 Chrome 和 Firefox 那样严格,但它正在采取非常有意识的举措来推动 IPv6 的采用。我认为这对 比利时应用程序开发人员来说是个好消息,因为我们在 IPv6 采用率排行榜上处于领先地位 。
如果您有兴趣,这里有一些我几年前发布的与 IPv6 相关的博文;