如果我为我的域添加了多个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)还是向用户返回错误消息?最受欢迎的浏览器之间有什么区别吗?

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

#1 楼

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

名声有些差,但确实证明了它的存在。您可以期望每个客户端在服务器关闭时首次尝试访问站点时都要等待30秒,直到它连接到工作地址为止。然后,浏览器将缓存哪个地址正在工作,并继续使用该地址进行以后的请求,除非它也失败了,则它将不得不再次搜索该列表。因此,对第一个请求的等待时间为30秒,此后还可以。控制标头将对它是否记住哪个IP中断或在每个请求上开始等待30秒产生奇怪的影响,为您的站点编写自定义客户端的人们最终将使用gethostbyname而不是getaddrinfo而不能够处理故障转移,各种潜在的问题。

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

但是,如果您可以忍受这些限制,并且拥有一个可以预测浏览器交互的合理简单的HTTP系统,那么它将起作用。告诉您这不存在(因为15年前确实如此)。但是,如果需要证明,您可以尝试通过telneting到具有多个A记录的域名,其中一些IP失效,有些则良好(是的,即使是好的老式telnet现在也使用getaddrinfo并可以优雅地处理多个A记录) -它将打印出一个不错的IP列表,直到最终成功。

评论


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

–马可
2011年10月27日15:06



有趣的是,虽然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英寸74.125.226.9

–路易斯·爱慕(Louis St-Amour)
2012年8月10日19:21



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

–简·斯坦曼(Jan Steinman)
2012-12-5 18:57



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

–罗伯特·图珀洛·施内克(Robert Tupelo-Schneck)
2013年9月17日15:14

为了支持乔夫关于“ 5-10年前的浏览器”的声明,这是美国国家经济研究局所做的一项测试,该测试表明您可以使用这种系统来运行IE8。这对我来说很公平。 :)

– Jomar Sevillejo
16-09-21在2:43

#2 楼

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

评论


Vista,这是一个很好的!

–兰迪L
19年7月15日在14:07

#3 楼

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

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

评论


好吧,因为浏览器是解析器-据我所知,它取决于浏览器的实现。

–乔纳斯(Jonas)
2011年3月19日23:31

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

–keatch
2011年3月19日23:56

但是Windows上的nslookup cnn.com和Linux上的主机cnn.com都返回IP地址列表,因此,这肯定取决于浏览器的实现。

–乔纳斯(Jonas)
2011-3-20在0:07

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

–乔纳斯(Jonas)
2011-3-20在8:30

@ J.Money这个问题恰恰是在问实施问题,而不是我们怎么做。

–于富兰
18-2-27在14:42

#4 楼

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

评论


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

–乔纳斯(Jonas)
2011-03-20 8:38



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

–iivel
2011年3月20日14:11



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

–乔纳斯(Jonas)
2011-03-20 14:38

您对“这对您的机制有实质性的破坏”是什么意思?看来浏览器确实尝试连接到第二台主机,这正是我想要的。您链接的文章还说,多个A记录是一个很好的解决方案。

–乔纳斯(Jonas)
2011-3-20在19:14

皮特·特内里约(Pete Tenereillo)所引用的文章已经过时(目前大多数情况是不正确的)。在Chrome浏览器中,chrome:// net-internals /#dns显示当前的DNS缓存。我不认为OS会始终确定要使用哪个IP。至少使用Chrome,您可以选择使用AAAA(如果可用)或仅使用A。 OP谈论的是浏览器如何从DNS选择中进行选择,而不是计算机如何找到其DNS服务器...。

–sdaffa23fdsf
13年7月22日在6:58