从https://serverfault.com/a/953384/16981
主机名不对应于 {ipaddress,port} 元组。主机名只是服务器的名称,应该可以解析为一个或多个 IP 地址。端口与主机名完全无关。
我的问题是:
(1) 我只知道(但从未假设我真正知道)主机名最多只能解析为一个 IP 地址。那么主机名可解析为多个 IP 地址是什么感觉呢?
(2)指定不同端口的主机名能解析到同一个IP地址吗?指定不同端口的主机名能调用不同的服务器吗?
谢谢。
答案1
1)主机名可以解析为多个 IP 地址;这称为DNS 循环并可用于负载分配、负载平衡或容错。
2)主机名与端口没有任何关系,它们仅映射到一个或多个 IP 地址。
答案2
一个例子是 Cloudfire 提供的 DNS 名称服务。
$ host one.one.one.one
one.one.one.one has address 1.1.1.1
one.one.one.one has address 1.0.0.1
one.one.one.one has IPv6 address 2606:4700:4700::1111
one.one.one.one has IPv6 address 2606:4700:4700::1001
如果您尝试连接到 DNS 主机名,您将连接到 IPv4 或 IPv6 地址中的一个,通常在两个地址之间交替。
端口与 IP 地址完全无关。您可以设置一些东西,比如在 Linux 中的 iptables 中,将特定端口转发到不同的服务器,但这种情况并不常见。
答案3
将 DNS 视为一个大型分布式键值存储的一种方式。
- 密钥由域名(例如
www.google.com
)和记录类型(例如A
“地址”)组成。 - 该值基本上是一个字符串,其含义取决于记录类型。
- 每个键可以有多个值。同样,这意味着什么取决于记录类型。
当您想要向 发出 HTTP 请求时serverfault.com
,您需要做的第一件事就是查找A
该域的记录。因此,您需要查询 DNS 系统以找出该键的值,并返回一个地址,例如216.58.206.132
。
然后,您就可以使用您喜欢的任何端口连接到该地址。这可能是用户指定的端口(例如,8080
对于 URL http://www.google.com:8080/
)或您希望工作的默认端口(80
对于 HTTP、443
对于 HTTPS)。
对于A
记录和 HTTP,DNS 无法告诉您使用哪个端口。其他记录类型(例如SRV
)可能指定更多信息,包括地址和端口号,甚至是成功与服务器通信所需的一组配置值。
如果你真的查询A
记录serverfault.com
,你实际上会得到答案列表:
;; QUESTION SECTION:
;serverfault.com. IN A
;; ANSWER SECTION:
serverfault.com. 174 IN A 151.101.129.69
serverfault.com. 174 IN A 151.101.193.69
serverfault.com. 174 IN A 151.101.1.69
serverfault.com. 174 IN A 151.101.65.69
现在,我们只需要一个地址即可连接到 Web 服务器,因此我们将其解释为“选择这些地址中的任意一个”。通常,每个人都会选择第一个地址,因此 DNS 服务器会在您每次询问时更改顺序;这样,负载就会分散到不同的地址之间。这就是“循环 DNS”的含义。
这里有一个重要的免责声明:DNS 实际上并不像数据库:当我们查询 DNS 服务器时,它可以随意给出答案,就像我们向 Web 服务器查询 URL 一样。例如,如果我查找 的地址google.com
,我会得到以下结果:
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:
google.com. 25 IN A 216.58.206.78
这并不意味着只有一个 IP 地址可供所有想要连接的人使用google.com
;相反,这意味着负责该域的服务器已经决定将其分配给该 IP 地址我,这与它给出的地址不同你。