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

标签 networking dns nslookup dig

众所周知,谷歌有不止一个 IP 地址。如果我们使用网站https://toolbox.googleapps.com/apps/dig/#A/google.com@8.8.8.8它导致多个 google 的 IP 地址。

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

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

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

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

;; ANSWER SECTION:
google.com.     269 IN  A   216.58.220.46

;; Query time: 0 msec
;; SERVER: 10.100.171.1#53(10.100.171.1)
;; WHEN: Fri Nov 04 16:18:07 IST 2016
;; MSG SIZE  rcvd: 55

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

仅返回一个IP地址,与上述网站返回的IP地址不同。此 IP 地址也在不时更改。

但是如果我为 amazon.com 运行 dig 命令:
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$ 

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

我的疑问是 google.com 的 DNS 查找与 amazon.com 有何不同?为什么谷歌搜索结果只有一条记录,而不是像亚马逊那样多条记录?

最佳答案

As we know google has more than one IP addresses.



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

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

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

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

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

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

另一个问题是为什么如果您从工具箱中查询 8.8.8.8 会得到多个地址,而从您的机器上查询只会得到一个地址。

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

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

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

注意:“网络”是指使用相同 DNS 解析器的一组机器。

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

关于networking - 为什么dig命令只返回google.com的一个IP地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40420896/

相关文章:

java - Java 中的非阻塞套接字写入与阻塞套接字写入

linux - 使用 Awk 将服务器名称从列表传递到 nslookup

java - 安卓手机如何设置移动网络的dns?

ios - 是否有等效于 gethostbyname 和 inet_ntoa 函数的任何 iOS SDK?

c# - 使用 C# 捕获 nslookup shell 输出

linux - 我如何开始制作我自己的简单的基于 UNIX 的网络扫描仪?

c++ - 为客户端知道服务器发送的包有多大的好处

c# - 使用ZeroMQ通过Internet进行客户端/服务器通信

ubuntu - Docker容器无法解析网站名称,但可以ping通其ip

Azure DNS CNAME 子域