现在如果我运行 host superuser.com
,我会得到:
superuser.com has address 151.101.193.69
superuser.com has address 151.101.1.69
superuser.com has address 151.101.65.69
superuser.com has address 151.101.129.69
那么,如果我使用 Web 浏览器或命令行客户端,它会连接到哪一个?
如果我在世界的其他地方,情况会有什么不同?
答案1
那么,如果我使用 Web 浏览器或命令行客户端,它会连接到哪一个?
取决于操作系统和/或程序。
对于同一类型的地址列表(例如多个 A 记录),它要么是第一个,要么是列表中的随机一个。
(记录之间没有定义的顺序,因此“第一个”只是最先放入数据包的内容。众所周知,一些 DNS 服务器会故意打乱它们发送的答案,以“帮助”始终采用第一个记录的旧客户端。)
对于 IPv4 与 IPv6(A 与 AAAA 记录),Web 浏览器通常会同时尝试两种类型(即每种类型一个),并使用先成功的连接,关闭另一个。较简单的客户端遵循操作系统设置的优先级,通常首先是全局 IPv6 地址,然后是 IPv4 地址。
如果我在世界的其他地方,情况会有什么不同?
如果您得到的答案相同,则无论您身在何处,您的客户端都会以相同的方式运行。在最简单的情况下,该答案可能确实指向远离您的服务器。
有些网站使用任播,即相同的 IP 地址指向不同的物理位置,每次都将您带到最近的实例。如果您在美国,superuser.com 的 IP 地址会将您带到美国的服务器;在欧洲,相同的地址会将您带到德国的服务器。
对于某些网站(尤其是使用 CDN 服务的网站),DNS 答案是动态生成的 - 服务器不会从其数据库中读取相同的地址,而是每次都会选择不同的地址,通常使用 IP“地理位置”来选择离您最近的服务器。例如,当从不同的国家/地区查询时,google.com 将显示不同的 A/AAAA 记录。
答案2
没有标准。这取决于具体实现。有些实现会采用列出的第一个。有些实现可能会随机选择一个。
在这方面最接近标准的可能是“Happy Eyeballs”,如果在 DNS 查找中同时返回 IPv4 和 IPv6 地址,则某些系统将进行“连接竞赛”:尝试同时连接其中一个,并接受首先建立的连接(并重置失败者)。