Как сервер узнает, какое доменное имя было использовано? - PullRequest
0 голосов
/ 29 ноября 2018

Насколько я знаю, что мы получаем из DNS-запроса IP-адрес.Так что, в конце концов, если это правда, мы все еще используем IP-адреса для подключения к серверу, и домены являются красивыми именами для них.

Так как сервер узнает, какой домен я использовал для запроса этого IP-адреса?Как работает vhosts и понимает, что если данные домена теряются во время запроса DNS?

1 Ответ

0 голосов
/ 29 ноября 2018

Интернет работает слоями .Каждый уровень использует различные виды параметров для своей работы.

Уровень 3 - это, как правило, IP-протокол, или Интернет-протокол.Для работы он использует IP-адреса, у каждого компьютера есть хотя бы один, чтобы иметь возможность обсуждать с другим.На самом деле существует два семейства: версия 4 и версия 6.

Поскольку в любой момент времени на любом компьютере может быть несколько служб, вам необходим слой 4, уровень 4, связанный с транспортом.«Преобладающим» является протокол TCP, известный как протокол управления транспортом, но также есть UDP.TCP и UDP используют порты: 2-байтовое целое число, которое кодирует для определенного протокола.

Например, HTTP был присвоен порт 80 (совершенно произвольно), а HTTPS - 443.

DNS, который сам использует UDP и TCP (на порту 53), позволяет, среди прочего, сопоставить данное имя хоста с данным IP-адресом или несколькими IP-адресами.Это типичные записи A и AAAA.Существует также запись CNAME, которая отображает одно доменное имя на другое.Также существует запись SRV, которая сопоставляет службу (которая представляет собой имя протокола + транспорт) с данным именем хоста и номером порта.

Когда один компьютер подключается к другому, это первый шаг для всех перечисленных вышеузнать, какой IP-адрес использовать для подключения.Он может использовать DNS для этого.Обычно он получает только IP-адрес, но в зависимости от протокола (уровень выше 4) также может получить порт (при использовании SRV записей).

Мир HTTPне использует SRV записи.Таким образом, браузер просто использует жестко закодированные порты 80 или 443 или номер порта, указанный в URL.

Затем мы находимся на транспортном уровне, скажем, TCP.Соединение установлено (поскольку теперь известны удаленный IP-адрес и порт), а протокол выше TCP, такой как HTTP, может свободно передавать любые дополнительные данные, такие как имя хоста, которое клиент первоначально использовал (как взято из URL-адреса).) узнать IP-адрес.Это делается через заголовок HTTP host, см. RFC 2616

Обратите внимание, что если вы делаете что-то через TLS (который концептуально расположен между TCP и HTTP), то происходит даже что-то еще:SNI или индикация имени сервера.

При выполнении рукопожатия TLS, поэтому перед любым видом заголовков или содержимого HTTP клиент отправит желаемое окончательное имя хоста в каком-то конкретном сообщении TLS.Зачем?Таким образом, сервер может найти, на какой конкретный сертификат он должен отвечать, а в противном случае он не сможет узнать, какое имя хоста запрашивается, поскольку он находится в каком-то HTTP-заголовке, который не существует, пока не завершится квитирование TLS.

Веб-сервер сможет видеть как содержимое SNI, чтобы узнать, какой сертификат отправлять обратно, так и заголовок host, чтобы узнать, какой раздел VirtualHost (в Apache) относится к обрабатываемому запросу.

Если вы не в мире HTTP, то все зависит от используемого протокола.Старые протоколы, такие как FTP, вначале не планировали «множественную адресацию», например, данный IP-адрес означал только одно имя хоста и службу.

...