如果同一个 URL 有多个 IP 地址,浏览器会使用哪个 IP 地址?

如果同一个 URL 有多个 IP 地址,浏览器会使用哪个 IP 地址?

我注意到,当我 ping 一个 URL 时,DNS 可能会返回多个 IP 地址: 在此处输入图片描述 我猜这意味着有两个 Web 服务器提供相同的 FQDN。

我想知道浏览器会使用哪一个。这有什么规则吗?

任何澄清均不胜感激。

答案1

没有严格的规则,因为所有地址都是等效的,程序可以按任何顺序使用它们。通常程序会尝试列表中的所有地址,直到有一个地址响应。

DNS 中的值没有固有顺序(A 记录本身没有优先级字段),因此 DNS 服务器可能会以任何顺序返回 A 记录;预期是给定名称列出的所有地址都将提供相同的服务。答案通常会被故意打乱,以提供一些基本的负载平衡¹。这可能由权威服务器和/或您的本地解析器完成。

¹(有几个原因可以解释为什么即使单个服务器具有多个地址,其性能也可能比只有一个地址的完全相同的设置更好。)

程序通常会使用从操作系统获得的任何顺序,但操作系统可能会在返回列表之前再次打乱列表(以防 DNS 服务器没有这样做)。

DNS 级别实际上有两个列表 - 一个用于 IPv4 地址(A 记录),另一个用于 IPv6(AAAA)。有些程序(主要是 Web 浏览器)会同时尝试这两种类型,而其他程序会将这两种类型合并为一个列表,并按大类进行分类(原生全球 IPv6 地址、原生 IPv4 地址、私有 IPv6 等)。

非常老的程序可能只会尝试“第一个” IPv4 地址(哪个地址是“第一个”是不可预测的),因为较旧的操作系统提供的“主机名查找”功能无法返回多个。此类程序通常不支持除 IPv4 之外的任何地址。

答案2

简而言之,有两种主要机制:

  • DNS 循环是从 DNS 服务器返回的列表中选择 IP 地址的主要机制,以便并非所有客户端每次都会获得相同的 IP 地址。
  • 网络掩码排序是进一步优化哪个 IP 地址用于确定最接近结果的另一种机制。

当 DNS 服务器返回 DNS 查询的 IP 地址列表时,它会尝试使用循环方法对每个后续查询的列表进行重新排序。这是基于这样一个事实:大多数应用程序在收到 IP 列表时,只会选择第一个,只有前一个失败时才会转到下一个。

循环 DNS 的描述如下: RFC 1794 - DNS 支持负载平衡

对于 IPv4,目标地址选择相当简单,通常通过选择 DNS 服务器返回的第一个 IP 地址来完成。这与 DNS 循环配合得很好,因为它允许服务器通过将客户端使用的地址放在列表顶部来决定客户端将使用哪个地址。

IPv6 改变了这种行为 RFC 3484

目标地址选择算法采用目标地址列表,然后对地址进行排序以生成新列表。这里通过对地址 DA 和 DB 进行成对比较来指定,其中 DA 在原始列表中出现在 DB 之前。该算法将 IPv6 和 IPv4 地址一起排序。

目标地址的成对比较包含十条规则,应按顺序应用这些规则。如果一条规则确定了结果,则其余规则将被忽略,因为后续规则仅充当先前规则的决胜局。

共有 10 条规则,但应考虑第 9 条规则:

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 地址。

参考 : Windows 客户端上的高级 DNS 循环和目标 IP 地址选择

答案3

以下是我在 2016 年左右测试的内容:

  • 您的浏览器可以执行其想要的操作,并且其行为可能会有所不同。
  • 您的浏览器可以依靠操作系统为其提供 IP(“gethostbyname”)。
  • 早在 2016 年,Linux 和 NetBSD 就会返回一个随机选择的地址。
  • 早在 2016 年,部分(但不是全部) Windows 10 计算机会返回随机选择的地址。旧版本的 Windows 会返回列表中的第一个地址。

我预计现在所有 Windows 10/11 机器都会随机选择一个 IP。

相关内容