跳到主要内容

3. 主机名解析查询处理

当客户端同时具有 IPv4 和 IPv6 连通性, 并尝试与具名主机建立连接时, 它需要同时发出 AAAA 和 A DNS 查询. 这两个查询 SHOULD 尽可能紧接着发出, 先发出 AAAA 查询, 随后立即发出 A 查询.

实现 SHOULD NOT 等待两个地址族的应答都返回后才尝试建立连接. 如果某个查询没有返回或返回时间明显更长, 等待第二个地址族可能会显著延迟第一个地址族的连接建立. 因此, 客户端 SHOULD 将 DNS 解析视为异步过程. 注意, 如果平台不提供异步 DNS API, 可以通过在不同线程上执行两个独立同步查询来模拟该行为, 每个地址族一个查询.

算法按如下方式进行: 如果首先收到肯定 AAAA 响应 (包含至少一条有效 AAAA 记录的响应), 则立即启动第一次 IPv6 连接尝试. 如果由于重排序而首先收到肯定 A 响应, 客户端 SHOULD 短暂等待 AAAA 响应, 以确保优先使用 IPv6 (AAAA 响应通常会在 A 响应之后几毫秒到达). 此延迟称为 "Resolution Delay". Resolution Delay 的推荐值为 50 毫秒. 如果在 Resolution Delay 期间收到肯定 AAAA 响应, 客户端立即启动 IPv6 连接尝试. 如果在 Resolution Delay 期间收到否定 AAAA 响应 (无错误、无数据), 或者到 Resolution Delay 结束时仍未收到 AAAA 响应, 客户端 SHOULD 使用截至此时返回的任何 IPv4 地址继续进行地址排序 (见第 4 节) 和错开连接尝试 (见第 5 节). 如果 AAAA 响应在这些连接尝试进行期间、但在任何连接建立之前到达, 则将新收到的 IPv6 地址合并到可用候选地址列表中 (见第 6 节), 并在加入这些 IPv6 地址后继续连接尝试过程, 直到建立一个连接.

3.1. 处理多个 DNS 服务器地址

如果当前网络配置了多个 DNS 服务器地址, 客户端可能可以选择通过 IPv4 或 IPv6 发送 DNS 查询. 按照 Happy Eyeballs 方法, 查询 SHOULD 首先通过 IPv6 发送. 注意, 这里指的不是发送 AAAA 或 A 查询, 而是 DNS 服务器自身的地址以及用于传输 DNS 消息的 IP 版本. 如果发送到 IPv6 地址的 DNS 查询没有收到响应, 可以将该地址标记为受惩罚, 并将查询发送到其他 DNS 服务器地址.

随着原生 IPv6 部署日益普及以及 IPv4 地址耗尽, 预期网络内会优先处理 IPv6 连通性. 如果 DNS 服务器被配置为可通过 IPv6 访问, 则应假定 IPv6 是首选地址族.

客户端系统 SHOULD NOT 对可由手动或网络配置的 DNS 服务器数量设置显式限制. 如果硬件限制要求存在这种限制, 客户端 SHOULD 从可用列表中为每个地址族至少使用一个地址.