为什么dig命令只返回google.com的一个IP地址?

时间:2016-11-04 10:55:52

标签: networking dns nslookup dig

据我们所知,谷歌有多个IP地址。如果我们使用网站https://toolbox.googleapps.com/apps/dig/#A/google.com@8.8.8.8,则会产生多个谷歌的IP地址。

如果我运行以下命令,则场景不同:

gyan@localhost:~/codes/java/net$ dig amazon.com

; <<>> DiG 9.10.3-P4-Ubuntu <<>> amazon.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55090
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;amazon.com.            IN  A

;; ANSWER SECTION:
amazon.com.     34  IN  A   54.239.26.128
amazon.com.     34  IN  A   54.239.17.7
amazon.com.     34  IN  A   54.239.25.192
amazon.com.     34  IN  A   54.239.25.208
amazon.com.     34  IN  A   54.239.25.200
amazon.com.     34  IN  A   54.239.17.6

;; Query time: 74 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Fri Nov 04 16:23:17 IST 2016
;; MSG SIZE  rcvd: 135

gyan@localhost:~/codes/java/net$ 

只返回一个与上述网站返回的IP地址不同的IP地址。此IP地址也在不断变化。

但如果我为amazon.com运行dig命令:

window.matchMedia('(max-width: 480px)').addListener(function(){
  if (window.matchMedia('(max-width: 480px)').matches){
    // initialize both of your sliders
  } else {
    // initialize only one slider
  }
})

这6个IP地址永远不会改变为amazon.com。网站https://toolbox.googleapps.com/apps/dig/#A/amazon.com@8.8.8.8也会返回相同的6个IP地址。

我怀疑google.com的DNS查询与amazon.com有何不同?为什么谷歌只会产生一个记录,而不是像亚马逊那样多于一个记录?

1 个答案:

答案 0 :(得分:1)

  

据我们所知,谷歌有多个IP地址。

真。但这并不意味着客户需要知道的不止一个。

过去,为了执行负载平衡,服务使用多个IP地址响应DNS查询是很常见的。回复通常是随机的,这意味着客户端会从服务器的大地址池中获得一些地址的随机子集,这些地址的行为都相同。

基于DNS的负载均衡一直都是黑客攻击。由于缓存存在问题:如果ISP的DNS解析器正在缓存回复,则大量用户都将连接到这几个IP地址,从而降低了负载平衡的有效性。解决方法是降低记录的TTL,以确保条目在缓存中保留少量时间,然后执行新查询。例如,amazon.com的TTL设置为34秒。您已发布的挖掘输出中的记录。

该方法效果不佳。减少TTL进一步导致小HTTP请求的延迟增加。此外,DNS负载平衡的结果有点不可预测,因为它不能保证服务器能够统一处理负载。

但是,如果您有一个在网络级别工作的负载均衡器(将其视为反向NAT盒:一个IP面向互联网,将流量多路复用到其后面的大量服务器),可以处理大量连接,并且还具有良好的正常运行时间,无需在DNS级别进行负载平衡。

因此,您连接的Google数据中心可能不会使用DNS负载平衡,而亚马逊的数据中心则不会。

另一个问题是,如果您从工具箱中查询8.8.8.8,您会获得多个地址,而从您的计算机查询则只能获得一个地址。

首先,重要的是要了解当从工具箱查询时,它是发送DNS查询的Web服务器,而不是您的计算机。

DNS服务器不必向不同的客户端返回相同的回复。实际上,根据客户的地理位置返回不同的回复是很常见的:例如,如果欧洲的用户查询google.com,它将获得欧洲而非美国数据中心的IP地址。

在这种情况下,我认为DNS地理位置用于某些客户端,而不是其他客户端。它可能与发送查询的网络大小以及网络负载平衡器的容量有关。例如,如果负载均衡器可以处理1,000,000个并发连接,并且发送查询的网络具有100,000个IP,则无需进行DNS负载平衡。但是,如果网络很大(在您的示例中,运行工具箱的数据中心的大小,网络负载平衡器可能无法处理它,因此启用DNS负载平衡,您将从池中获取多个随机IP地址。 / p>

注意:“网络”是指所有使用相同DNS解析器的计算机集。

返回多个IP地址的另一个原因是执行基于DNS的故障转移。当其中一台机器停止工作时,客户端会尝试连接到另一台机器。但这并不是一种很好的故障转移方式,因为有些应用程序不会存储所有IP地址(尽管我认为大多数浏览器都会这样做),而且DNS缓存也会受到阻碍。