Rule 9: Use longest matching prefix.
When DA and DB belong to the same address family (both are IPv6 or
both are IPv4): If CommonPrefixLen(DA, Source(DA)) >
CommonPrefixLen(DB, Source(DB)), then prefer DA. Similarly, if
CommonPrefixLen(DA, Source(DA)) < CommonPrefixLen(DB, Source(DB)),
then prefer DB.
使用最长的匹配项,而不仅仅是列表中的第一个 IP 地址。安装 IPv6 后,行为会发生变化,因此操作系统不仅仅将第一个 IP 地址从列表中拉出。
没有严格的规则,因为所有地址都是等效的,并且程序可以按任何顺序使用它们。通常程序会尝试列表中的所有地址,直到有一个地址响应为止。
DNS 中的值没有固有的顺序(并且 A 记录本身没有优先级字段),因此 DNS 服务器可能以任何顺序返回 A 记录;期望为给定名称列出的所有地址都将提供相同的服务。通常,答案会被故意改组以提供一些基本的负载平衡。这可以由权威服务器和/或您的本地解析器完成。
1(有几个原因可以解释为什么即使是具有多个地址的单个服务器也可能比仅具有一个地址的完全相同的设置表现更好。)
程序通常会使用从操作系统获得的任何顺序,但操作系统可能会在返回列表之前再次打乱列表(以防万一 DNS 服务器没有这样做)。
DNS 级别实际上有两个列表 - 一个用于 IPv4 地址(A 记录),另一个用于 IPv6 (AAAA)。一些程序(主要是 Web 浏览器)并行尝试这两种类型,而其他程序则将这两种类型合并到一个列表中,该列表被分类为广泛的类别(本机全局 IPv6 地址,然后是本机 IPv4,然后是私有 IPv6 等)。
非常旧的程序可能只尝试“第一个”IPv4 地址(哪个地址是“第一个”是不可预测的),因为旧操作系统提供的“主机名查找”功能无法返回多个地址。此类程序通常不支持除 IPv4 之外的任何内容。
简而言之,有两个主要机制:
当 DNS 服务器返回 DNS 查询的 IP 地址列表时,它将尝试采用循环方法对每个连续查询的列表进行重新排序。这是基于这样的事实:大多数应用程序在收到 IP 列表时只会选择第一个 IP,只有在前一个失败时才转到下一个。
RFC 1794 - DNS 支持负载平衡中描述了循环 DNS 。
对于 IPv4,目标地址选择相当简单,通常通过选择 DNS 服务器返回的第一个 IP 地址来完成。这与 DNS 循环法配合得很好,因为它让服务器通过将其放在列表顶部来决定客户端将使用哪个地址。
根据RFC 3484,IPv6 对此行为进行了更改 :
目标地址的成对比较由十个规则组成,应按顺序应用。如果某个规则决定了结果,则其余规则将被忽略,因为后续规则仅充当较早规则的决胜局。
有 10 条规则,但应考虑规则 9:
使用最长的匹配项,而不仅仅是列表中的第一个 IP 地址。安装 IPv6 后,行为会发生变化,因此操作系统不仅仅将第一个 IP 地址从列表中拉出。
参考: Windows 客户端上的高级 DNS 循环和目标 IP 地址选择。
这是我在 2016 年左右进行的测试:
我预计现在所有 Windows 10/11 机器都会随机选择一个 IP。