为我的域使用多个A记录-网络浏览器是否尝试过多个?


94

如果我为我的域添加了多个A记录,则DNS服务器会以循环顺序返回它们。

例:

192.0.2.1 A example.com
192.0.2.2 A example.com
192.0.2.3 A example.com

但是,如果第一个主机(192.0.2.1)关闭(无法访问),Web浏览器会如何反应?他们是尝试第二台主机(192.0.2.2)还是向用户返回错误消息?最受欢迎的浏览器之间有什么区别吗?

如果实现自己的应用程序,则可以实现,以便在第一个关闭的情况下使用第二个,因此有可能。这对创建容错网站非常有帮助。

Answers:


87

是的,如果一个浏览器无法响应,则过去5-10年中的大多数浏览器都会尝试其他A记录。有时,这有时有时被称为“浏览器重试”或“客户端重试”。您几乎只能在各种浏览器利用的背景下找到有关此功能的东西,此功能可针对未使用它的网站进行使用(请参阅DNS重新绑定DNS固定反dns固定,反反dns固定,反反-anti-dns固定,等等。声誉不好,但确实证明了它的存在。

几乎每个浏览器确实确实会收到A记录的完整列表,并且确实会检查其他浏览器(如果使用的记录失败)。您可以期望每个客户端在服务器关闭时首次尝试访问站点时都要等待30秒,直到它连接到工作地址为止。然后,浏览器将缓存正在工作的地址,并继续使用该地址进行将来的请求,除非它也失败了,然后它将不得不再次搜索该列表。因此,在第一个请求上等待30秒,然后再进行。

但这不是您一定要使用的东西,它将对浏览器的兼容性,操作系统的兼容性,代理的兼容性,缓存控制标头产生很多警告,这将对它是否记住哪个IP中断或开始拥有IP产生奇怪的影响。在每个请求上等待30秒之后,为您的网站编写自定义客户端的人们最终将使用gethostbyname而不是getaddrinfo,并且无法处理故障转移,以及各种潜在的问题。

您也不能依靠多个A记录来支持“主”和“从”服务器,因为您永远不知道浏览器将从列表中选择哪个地址。它们都必须具有运行时处理访客的能力,因为任何人都可以在访问成功时获得流量。浏览器可能会认为列表中的第三个服务器是最吸引人的,也许它看起来是最接近的,即使所有三个服务器仍处于运行状态,它也会选择该服务器。

但是,如果您可以忍受这些限制,并且拥有一个可以预测浏览器交互的合理简单的HTTP系统,那么它将起作用。

哦,您还必须与很多人打交道,说这不存在(因为15年前是这样)。但是,如果需要证明,您可以尝试通过telneting到具有多个A记录的域名,其中一些IP失效而有些则良好(是的,即使是好的老式telnet现在也使用getaddrinfo并可以优雅地处理多个A记录) -它将打印出一个不错的IP列表,直到最终成功为止。


12
这是国家经济研究局一份报告,支持乔夫的回答。
Marco Marco

3
有趣的是,虽然stackexchange.com指向一个IP,但Google返回了几个IP:$ dig google.com @ ns1.google.com ;; 解答:google.com。300 IN A 74.125.226.6 google.com。300 IN A 74.125.226.7 google.com。300 IN A 74.125.226.0 google.com。300 IN A 74.125.226.4 google.com。300 IN A 74.125.226.8 google.com。300 IN A 74.125.226.2 google.com。300 IN A 74.125.226.1 google.com。300 IN A 74.125.226.3 google.com。300 IN A 74.125.226.5 google.com。300 IN A 74.125.226.14 google.com。300英寸A 74.125.226.9
路易·

1
抱歉,但是我不这么认为。浏览器与解析IP地址无关-在系统软件中会发生这种情况。如果提供多个​​A记录,则应假定任何给定的客户端将从列表中随机接收到一个。
Jan Steinman

19
就是它在现代浏览器中的工作方式。他们都选择使用诸如getaddrinfo()之类的系统调用来获取多个IP地址并在内部处理故障转移,而不是从系统中获取单个IP地址。这里的其他评论者和回答者是乔夫最后一段中“很多人告诉您这不存在”的一部分-我认为它们的意思很好,但它们传播的是错误信息。
罗伯特·图珀洛-施内克

1
为了支持Joff关于“ 5-10年前的浏览器”的声明,这是由美国国家经济研究局进行的一项测试,该测试表明您可以在IE 8上使用这种系统。:)
Jomar Sevillejo

5

请注意,Windows Vista实现了RFC3484的愚蠢部分(即,从IPV6向IPV4 的反向移植),并且将首选与用户IP地址共享大多数前缀位的IP地址,而不是随机选择一个。由于大多数用户的IP地址都以192.168开头,这意味着您的任何一个IP地址碰巧都共享大多数前缀位,从而将获得大多数Vista流量。微软在Windows 7及更高版本中修复了这一特殊之处,因此它不再像以前那样成为问题。


Vista,这是一个很好的!
the0ther

3

这是基本的DNS负载平衡分发技术:DNS Round Robin。这与浏览器无关,它取决于resolver的实现以及DNS地址的本地/远程缓存。所做的更改是,如果服务器发生故障,由于DNS层中的缓存,您的网站可能无法访问。

有关WikiPedia上的Round DNS的基本说明,请参见此处。


1
好吧,由于浏览器是解析器-据我所知,它取决于浏览器的实现。
乔纳斯(Jonas)

2
不,有一些系统库可以使用您在系统中设置的DNS名称服务器来解析dns。该功能是标准操作系统库的一部分。
keatch 2011年

但是nslookup cnn.com在Windows和host cnn.comLinux上都返回IP地址列表,因此,它肯定取决于浏览器的实现。
乔纳斯(Jonas)

5
@iivel:不,那是不正确的。如果我编写Java程序并使用InetAddress.getAllByName(“ example.com”)解析名称,则会得到包含所有IP地址的列表,因此我可以选择启动与所有IP地址的TCP连接。如果在C语言中使用getaddrinfo(),则效果相同。因此,绝对由开发人员选择而不是由操作系统选择。
乔纳斯(Jonas)

1
@ J.Money这个问题正好问的实施,不是我们如何做到这一点。
富兰克林·于

0

操作系统确定要使用的IP,而不是浏览器。Windows将循环返回的列表(在从DNS返回的列表中),尽管在刷新DNS或超时之前将继续使用相同的地址。* ix实现部分取决于捆绑的tcp堆栈实现,但通常也遵循循环方法。


2
不,这是错误的。如果编写Java程序并使用解析名称,InetAddress.getAllByName("example.com")则会得到包含所有IP地址的列表,因此,如果需要,我可以选择启动到所有IP地址的TCP连接。如果getaddrinfo()在C语言中使用,则是相同的。因此,开发人员而不是操作系统绝对是一个选择。DNS服务器仅决定以什么顺序返回IP地址列表。
乔纳斯(Jonas)

好的,所以您可以手动对堆栈进行任何操作-您甚至可以自己滚动堆栈,而完全不必理会winsock。但是,如果您编写了一个应用程序并让OS来做它的事情(抽象的),那么行为就如前所述。您的问题专门针对传统的应用程序行为-不可能。大多数开发人员使用未解析的名称进行处理,然后让操作系统执行其操作,而不是将行为紧密耦合在一起。
iivel 2011年

1
不确定答案为何被否决,但问题在于浏览器的功能。当前,所有浏览器都允许操作系统进行解析(缺少Firefox和Chrome的某些插件)。如果您想了解提供商在宕机时如何确保可用性的详细信息,请查看负载均衡器或群集。
iivel 2011年

浏览器可能按照您所说的那样做-让操作系统进行DNS查找,但它会将带有IP地址的列表返回到浏览器。问题是:如果第一个地址不可访问,那么最受欢迎的浏览器会做什么?他们会尝试第二个吗?
乔纳斯(Jonas)

2
皮特·特内里约(Pete Tenereillo)所引用的文章已经过时了(如今大多数情况是不正确的)。在Chrome浏览器中,chrome:// net-internals /#dns显示当前的DNS缓存。我不认为OS会始终确定要使用哪个IP。至少使用Chrome,您可以选择使用AAAA(如果可用)或仅使用A。OP谈论的是浏览器如何从DNS中进行选择,而不是计算机如何找到其DNS服务器
。...– sdaffa23fdsf
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.