当 DNS 服务器为客户端查找 IP 地址时,它会收到要查询的多个 DNS 服务器列表,它会如何选择一个?同样,当 DNS 客户端收到 FQDN 的多个 IP 地址列表时,它会如何选择一个?它是特定于实现的,还是在 RFC 中涵盖?
答案1
DNS 服务器在解析查询时,可能会根据历史响应时间数据(RFC1035 第 7.2 节)确定使用所列服务器的优先顺序。它还可能按更近的子网确定优先顺序(我在 RFC 中看到过这种情况,但不记得是哪个了)。如果没有可用的历史记录或子网优先级,它可能会随机选择,或者直接选择第一个。我见过 DNS 服务器实现执行上述各种组合。
从 A/AAAA 记录列表挑选 IP 地址的客户端程序通常会按照 DNS 服务器返回的顺序(循环)尝试这些地址。如果客户端无法连接到返回的第一个 IP 地址,则应尝试第二个,依此类推。例如,所有主流浏览器都这样做,但是许多其他 Internet 客户端程序会“忘记”此步骤,如果无法连接到第一个 IP 地址,则会失败。
答案2
RFC 1794涵盖您询问的循环赛问题。
就答案而言,大多数 DNS 客户端将使用列表中的第一个 IP 地址,一些客户端进行子网计算以确定哪个更接近,其他客户端随机选择,但大多数依赖 DNS 服务器来发送列表。
答案3
这取决于客户端 - 对于任何运行 Windows 商店的人来说,特别重要的是 Vista\Windows Server 2008 将使用与早期 Windows 版本不同的机制(如果安装了 ipv6 堆栈)来选择地址,而早期 Windows 版本将选择第一个地址。在许多情况下,这意味着它们将始终选择同一个地址,即它们不会像早期版本那样“遵守”DNS 循环响应。在这篇 Technet 博客文章。
链接的文章表明 Windows 7 和 Server 2008 R2 再次改变了这种默认行为,但我找不到任何证据来支持这一点。
另外值得指出的是,据我所知,这是符合 IPv6 标准的行为,尽管我很高兴发现我错了。