有人可以告诉我有关精确的当浏览器获取给定主机名(例如 ip1 和 ip2)的多个 A 记录,并且其中一个无法访问时,浏览器的行为。
我对确切的细节感兴趣,例如(但不限于):
- 浏览器会从操作系统获取 2 个 IP,还是只会获取一个?
- 浏览器会首先尝试哪个 IP(随机还是始终是第一个)?现在,假设浏览器从失败的 IP1 启动
- 浏览器将尝试 ip1 多长时间?
- 如果用户在等待 ip1 时点击“停止”,然后点击刷新
- 浏览器将尝试哪个 IP?
- 超时时会发生什么 - 它会开始尝试 ip2 还是会出现错误?(如果出现错误,当用户单击刷新时浏览器会尝试哪个 ip)。
- 当用户单击刷新时,任何浏览器都会尝试新的 DNS 查找吗?
现在我们假设浏览器首先尝试工作ip2。
- 下次页面请求的时候浏览器还会使用ip2吗,还是会随机切换ips?
- 浏览器将 IP 保存在缓存中多长时间?
- 当浏览器发送新的 DNS 请求并获取相同的 IP 时,它是否会继续使用相同的已知工作 IP,或者该过程从头开始并尝试两者中的任何一个?
当然,这一切都可能依赖于浏览器,也可能因版本和平台而异,我很高兴获得最多的细节。
这样做的目的是 - 我试图了解当使用基于循环 DNS 并且其中一个主机出现故障时用户究竟会遇到什么情况。
请记住,我不是在问 DNS 负载平衡有多糟糕,并且请不要回答“不要这样做”、“这是一个坏主意”、“你需要心跳/代理/BGP/等等”等等。
答案1
毕竟,我必须自己做“研究”。以下是 Chromium(版本 12.0.742.112)的行为(在 ubuntu 11.04 上运行):
通常情况下,它会这样工作:尝试第一个 IP,一旦超时(189 秒后),尝试第二个 IP。在尝试所有 IP 之前不会显示错误消息。下一个连接将再次从第一个 IP 开始(即使它在一秒钟前失败了,而第二个 IP 成功了 - 浏览器并不关心)
有一件有趣的事情 - 当用户点击取消时,TCP 连接尝试不会被丢弃 - 即当我点击取消,并在 60 秒后点击重试时,页面将在 130 秒内显示(从第一次尝试开始为 189 秒)。但是如果我点击取消并点击刷新后190秒,过程将从头开始。
关于原始问题中的项目:
- 浏览器从操作系统获取两个 IP,操作系统不会改变 IP 的顺序。
- 浏览器总是尝试连接到首先出现的 IP
- 它尝试了 189 秒
- 第二次尝试时,它将再次尝试第一个 IP。
- 当第一个 IP 超时时,浏览器会默默地继续第二个 IP。如果成功,页面就会显示出来,如果失败,则继续等待。
未测试。本博客当我们查看 chrome://net-internals/#dns 时,Chrome 会将 DNS 缓存最多 1 分钟:
容量:100 成功条目的生存时间(毫秒):60000 失败条目的生存时间(毫秒):0
如果第一个 IP 有效,则过程将是相同的,并且第一次尝试总会成功。
答案2
与其告诉人们你不想要什么,为什么不解释一下你想要实现什么呢?
如果您所追求的只是已知数据,那么请自己去调查,或者阅读您正在谈论的任何浏览器(有数百种)的文档。
不过,了解这与 DNS 无关可能会有所帮助。
如果浏览器收到请求,它首先会查看各种缓存,看看 URL 是否已经存在,如果不存在,则查看主机名。
如果不存在,它将使用系统解析器来解析主机名。
如果返回的 IP 没有响应,它肯定会将其内部缓存为负面查询结果因此直接再次请求相同的 URL 以期获得不同的 A 记录可能毫无意义,因为它会将主机名结果与负面 IP 结果一起存储。
或者,您可以提供更多信息。
编辑:我看到你确实在所有要求和聪明才智之间提供了一些信息。
很好:
- 如果浏览器向系统解析器请求主机名,它将返回该主机名的所有信息。如果这意味着 2 个 IP,那么它将返回 2 个 IP。
- 这取决于浏览器。
- 这取决于浏览器,但我用过的所有浏览器都只发出一个请求,并且会在标准 TCP CONNECT() 超时后超时;我很确定某处有关于此内容的 RFC...
- 这取决于浏览器。与 DNS 或网络无关。
- 不。
- 不。
您似乎还不知道 DNS 记录会缓存在任何地方,尤其是在客户端上。这些记录会过期,具体取决于域所有者的意图或您和他之间的缓存配置。一小时到一天是常见的,所以如果您疯狂地刷新,不要指望解析器会再次进行 DNS 查询。