Из https://serverfault.com/a/953384/16981
Имена хостов не соответствуют кортежу {ipaddress, port}. Имя хоста - это только имя сервера, которое должно разрешаться в один или несколько IP-адресов. Порты вообще не имеют ничего общего с именами хостов.
Мои вопросы:
(1) Я знаю только (и никогда не предполагаю, что знаю), что имя хоста разрешено не более чем в один IP-адрес. Так как же это, если имя хоста разрешается более чем в один IP-адрес?
(2) Указывается ли имя хоста с разными портами для одного и того же IP-адреса? Может ли имя хоста, указанное для разных портов, вызывать разные серверы?
Спасибо.
1) Имя хоста может быть преобразовано в несколько IP-адресов; это называется циклическим перебором DNS и может использоваться для распределения нагрузки, балансировки нагрузки или обеспечения отказоустойчивости.
2) Имена хостов никоим образом не связаны с портами, они сопоставляются только с одним или несколькими IP-адреса.
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
Теперь нам нужен только один адрес для подключения к веб-серверу, поэтому мы интерпретируем это как «выбрать любой из этих адресов». Как правило, каждый выбирает первый, поэтому DNS-сервер будет менять порядок каждый раз, когда вы спрашиваете; таким образом нагрузка будет распределена между разными адресами. Это то, что имеется в виду под «циклическим DNS».
Важным отказом от ответственности является то, что DNS на самом деле не похож на базу данных: когда мы запрашиваем DNS-сервер, он может дать ответ, как ему нравится, точно так же, как когда мы запрашиваем URL-адрес веб-сервера. Например, если я ищу адрес google.com
, я получаю следующее:
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:
google.com. 25 IN A 216.58.206.78
Это не означает, что есть только один IP-адрес, который обслуживает всех, кто хочет подключиться к google. .com
; вместо этого это означает, что сервер, отвечающий за этот домен, решил, что это IP-адрес, который он даст мне , который отличается от адреса, который он даст вам .
Примером является служба имен DNS, предоставляемая Cloudfire.
$ 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-адресами. Вы можете настроить что-то, например, в iptables в Linux, для переадресации определенного порта на другой сервер, но это необычно.