Как работают HTTP-запросы

Если вы когда-нибудь давали интервью, вас могли спросить: «что происходит, когда вы что-то вводите в поле поиска Google и нажимаете ввод».

Это один из самых популярных вопросов, которые вам задают. Люди просто хотят посмотреть, сможете ли вы объяснить некоторые довольно базовые понятия и понять, как на самом деле работает Интернет.

В этом посте я проанализирую, что происходит, когда вы вводите URL-адрес в адресной строке браузера и нажимаете ввод.

Это очень интересная тема, которую я расскажу в блоге, так как она затрагивает многие технологии, о которых я могу рассказать в отдельных постах.

Это технология, которая очень редко изменяется и питает одну из самых сложных и широких экосистем, когда-либо созданных человеком.

Протокол HTTP

Во-первых, я упоминаю HTTPS, в частности, потому что вещи отличаются от HTTPS-соединения.

Я анализирую только URL-запросы

Современные браузеры имеют возможность узнать, является ли то, что вы написали в адресной строке, фактическим URL или поисковым термином, и они будут использовать поисковую систему по умолчанию, если это не действительный URL.

Я предполагаю, что вы вводите фактический URL.

Когда вы вводите URL и нажимаете ввод, браузер сначала создает полный URL.

Если вы только что ввели домен, например ip-calculator.ru, браузер по умолчанию ip-calculator.ru к нему HTTP:// по умолчанию ip-calculator.ru протокол HTTP.

macOS/Linux

Просто к вашему сведению. Windows может сделать некоторые вещи немного по-другому.

Этап поиска DNS

Браузер запускает поиск DNS, чтобы получить IP-адрес сервера.

Доменное имя — удобный способ для нас, людей, но Интернет организован таким образом, что компьютеры могут искать точное местоположение сервера по его IP-адресу, который представляет собой набор чисел, например 222.324.3.1 (IPv4).

Во-первых, он проверяет локальный кэш DNS, чтобы узнать, был ли домен разрешен недавно.

В Chrome есть удобный визуализатор DNS-кэша, который вы можете увидеть в chrome://net-internals/#dns

Если там ничего не найдено, браузер использует распознаватель DNS, используя системный вызов gethostbyname POSIX для получения информации о хосте.

gethostbyname

Сначала gethostbyname просматривает локальный файл hosts, который в macOS или Linux находится в /etc/hosts , чтобы проверить, предоставляет ли система информацию локально.

Если это не дает никакой информации о домене, система отправляет запрос на DNS-сервер.

Адрес DNS-сервера сохраняется в системных настройках.

Это 2 популярных DNS-сервера:

  • 8.8.8.8: публичный DNS-сервер Google
  • 1.1.1.1: DNS-сервер CloudFlare

Большинство людей используют DNS-сервер, предоставленный их интернет-провайдером.

Браузер выполняет DNS-запрос по протоколу UDP.

TCP и UDP являются двумя основополагающими протоколами компьютерных сетей. Они находятся на том же концептуальном уровне, но TCP ориентирован на соединение, а UDP — это протокол без установления соединения, более легкий, используемый для отправки сообщений с небольшими издержками.

Как выполняется UDP-запрос, рассматривается в этом руководстве.

DNS-сервер может иметь IP-адрес домена в кэше. Если нет, он спросит корневой DNS-сервер . Это система (состоящая из 13 реальных серверов, распределенных по всей планете), которая управляет всем интернетом.

DNS-сервер не знает адреса каждого доменного имени на планете.

Он знает, где находятся DNS-преобразователи верхнего уровня .

Домен верхнего уровня — это расширение домена: .com , .it , .pizza и так далее.

Как только корневой DNS-сервер получает запрос, он перенаправляет запрос на этот DNS-сервер домена верхнего уровня (TLD).

Скажем, вы ищете ip-calculator.ru. DNS-сервер корневого домена возвращает IP-адрес TLD-сервера .ru.

Теперь наш распознаватель DNS будет кэшировать IP-адрес этого сервера TLD, поэтому ему не нужно будет снова запрашивать его у корневого DNS-сервера.

DNS-сервер TLD будет иметь IP-адреса официальных серверов имен для домена, который мы ищем.

Как? Когда вы покупаете домен, регистратор домена отправляет соответствующие TDL серверам имен. При обновлении серверов имен (например, при смене провайдера хостинга) эта информация будет автоматически обновляться регистратором вашего домена.

Это DNS-серверы хостинг-провайдера. Их обычно больше 1, чтобы служить резервной копией.

Например:

  • ns1.example.com
  • ns2.example.com
  • ns3.example.com

DNS-распознаватель запускается с первого и пытается запросить IP-адрес домена (также с поддоменом), который вы ищете.

Это основной источник правды для IP-адреса.

Теперь, когда у нас есть IP-адрес, мы можем продолжить наше путешествие.

TCP-запрос подтверждения связи

С доступным IP-адресом сервера теперь браузер может инициировать TCP-соединение с этим.

Соединение TCP требует небольшого рукопожатия, прежде чем оно может быть полностью инициализировано, и вы можете начать отправку данных.

Как только соединение установлено, мы можем отправить запрос

Отправка запроса

Запрос представляет собой простой текстовый документ, структурированный точно так, как определено протоколом связи.

Он состоит из 3 частей:

  • строка запроса
  • заголовок запроса
  • тело запроса

Строка запроса

Строка запроса устанавливается в одну строку:

  • метод HTTP
  • расположение ресурса
  • версия протокола

Пример:

GET / HTTP/1.1

Заголовок запроса

Заголовок запроса представляет собой набор пар field: value которые устанавливают определенные значения.

Есть 2 обязательных поля, одно из которых — «Host , а другое — «Connection , а все остальные поля являются необязательными:

Host: ip-calculator.ru Connection: close

Host указывает доменное имя, на которое мы хотим нацелиться, в то время как Connection всегда close если соединение не должно оставаться открытым.

Некоторые из наиболее часто используемых полей заголовка:

  • Origin
  • Accept
  • Accept-Encoding
  • Cookie
  • Cache-Control
  • Dnt

но существует много других.

Часть заголовка заканчивается пустой строкой.

Тело запроса

Тело запроса является необязательным, не используется в запросах GET, но очень часто используется в запросах POST, а иногда и в других глаголах, и может содержать данные в формате JSON.

Поскольку мы сейчас анализируем запрос GET, тело не заполнено, и мы не будем его больше рассматривать.

Ответ

Как только запрос отправлен, сервер обрабатывает его и отправляет ответ.

Ответ начинается с кода состояния и сообщения о состоянии. Если запрос успешен и возвращает 200, он начнется с:

200 OK

Запрос может вернуть другой код состояния и сообщение, например, одно из следующих:

404 Not Found
403 Forbidden
301 Moved Permanently
500 Internal Server Error
304 Not Modified
401 Unauthorized

Затем ответ содержит список заголовков HTTP и тело ответа (которое, поскольку мы делаем запрос в браузере, будет HTML)

Разбор HTML

Браузер теперь получил HTML-код и начинает его анализировать, и он будет повторять точно такой же процесс, который мы сделали для всех ресурсов, необходимых для страницы:

  • CSS файлы
  • картинки
  • фавикон
  • Файлы JavaScript

То, как браузеры отображают страницу, выходит за рамки, но важно понимать, что процесс, который я описал, предназначен не только для страниц HTML, но и для любого элемента, который обслуживается по HTTP.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.