浏览器如何处理多个 IP

San*_*an4 11 domain-name-system failover timeout

当浏览器获取给定主机名(例如 ip1 和 ip2)的多个 A 记录并且其中一个无法访问时,有人可以指导我了解有关确切浏览器行为的信息。

我对确切的细节感兴趣,例如(但不限于):

  1. 浏览器会从操作系统获得 2 个 IP,还是只会获得一个?
  2. 浏览器将首先尝试哪个 ip(随机或总是第一个)?现在,假设浏览器以失败的 ip1 启动
  3. 浏览器会尝试多长时间 ip1 ?
  4. 如果用户在等待 ip1 时点击“停止”,然后点击刷新
    • 浏览器会尝试哪个 IP?
  5. 当它超时时会发生什么 - 它会开始尝试 ip2 还是给出错误?(如果出现错误,当用户点击刷新时浏览器将尝试哪个 ip)。
  6. 当用户点击刷新时,任何浏览器都会尝试新的 DNS 查找吗?

现在让我们假设浏览器首先尝试使用 ip2。

  1. 对于下一个页面请求,浏览器是否仍然使用ip2,或者它可能会随机切换ips?
  2. 浏览器在其缓存中保留 IP 多长时间?
  3. 当浏览器发送一个新的 DNS 请求并获得相同的 ips 时,它会继续使用相同的已知正在工作的 IP,还是该过程从头开始,它可能会尝试两者中的任何一个?

当然,这一切都可能取决于浏览器,也可能因版本和平台而异,我很乐意提供最多的细节。

这样做的目的 - 我试图了解当使用基于循环 DNS 并且其中一台主机出现故障时,用户会体验到什么。

拜托,我不是在问 DNS 负载平衡有多糟糕,请不要回答“不要这样做”、“这是一个坏主意”、“您需要心跳/代理/BGP/任何东西”等等。

San*_*an4 5

毕竟,我必须自己做“研究”。这是 Chromium(版本 12.0.742.112)行为(在 ubuntu 11.04 上运行):

通常它是这样工作的:尝试 1-st ip,一旦超时(189 秒后)尝试 2-nd ip。在尝试所有 ip 之前不会给出错误消息。下一个连接将再次从第一个 ip 开始(即使它只是在一秒钟前失败并且第二个 ip 工作 - 浏览器不在乎)

一件有趣的事情 - 当用户点击取消时,TCP 连接尝试不会被丢弃 - 即当我点击取消时,在 60 秒后单击重试,页面将在 130 秒后显示(从第一次尝试开始为 189。)但是如果我单击取消并单击190 秒刷新,该过程将从头开始。

关于原始问题中的项目:

  1. 浏览器从操作系统获取两个 IP,操作系统不会改变 IP 的顺序。
  2. 浏览器总是尝试连接到第一个出现的 ip
  3. 它尝试了 189 秒
  4. 在第二次尝试时,它将再次尝试第一个 IP。
  5. 当第一个 IP 超时时,浏览器会默默地继续访问第二个 ip。如果它有效 - 页面显示,如果没有 - 等待继续。
  6. 未测试。当我们查看 chrome://net-internals/#dns 时,该博客指出 Chrome 将 DNS 缓存最多 1 分钟:

    容量:100 成功条目的生存时间(毫秒):60000 失败条目的生存时间(毫秒):0

如果第一个 IP 有效,过程将相同,并且在第一次尝试时总是成功。