3.1. Введение

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

Каждый раз, когда пользователь посещает страницу в интернете, компьютер использует протокол передачи гипертекста (HTTP) для загрузки этой страницы с другого компьютера.

В HTTP две роли: клиент и сервер. Клиент отправляет запрос. Сервер обрабатывает его, а потом отвечает на запрос и прерывает соединение. Дальше запросы выполняются при новом соединении, словно предыдущего не существовало.

Сообщения между клиентом и сервером передаются в формате текста, хотя в теле сообщения могут быть фото, аудио, видео или другие форматы. Далее посмотрим упрощённый путь.

Шаг 1. Адреса

Разные типы устройств (ноутбуки, настольные компьютеры, смартфоны) используют приложение браузера. Пользователь вводит в браузере URL — Uniform Resource Locator или «Унифицированный Указатель Ресурса»:

URL-адрес

Обратите внимание на этот URL: он начинается с http. Это сигнал браузеру, что ему необходимо использовать протокол HTTP.

Шаг 2. Браузер ищет IP

Домен — это тот же IP-адрес, только написанный в понятном человеку формате. Браузер обращается к DNS и получает IP-адрес:

Преобразователь DNS

Шаг 3. Браузер отправляет HTTP-запрос

Как только браузер определил IP-адрес, он отправляет HTTP-запрос:

HTTP-запрос

Заголовки HTTP — основная часть протокола HTTP. Они позволяют клиентам и серверам передавать дополнительную информацию вместе с данными второй стороне. Благодаря этому клиенты и серверы могут правильно получать и обрабатывать данные. Например, заголовки HTTP могут включать информацию о размере (Content-Length) и типе (Content-Type) данных в теле HTTP-сообщения. Заголовки HTTP содержат текстовую информацию в форме ключ-значение и включаются в каждый HTTP-запрос и ответ.

Посмотрим на простой HTTP-запрос:

GET /courses HTTP/1.1
Host: www.htmlacademy.ru

HTTP-запрос — это действие, которое должно быть выполнено над данным ресурсом. Первая строка сообщения HTTP-запроса начинается с имени метода — в данном случае GET. Далее указывается путь: /courses. Сервер хранит содержимое всего веб-приложения, поэтому браузеру необходимо указать, какую страницу загружать. И затем следует версия протокола: HTTP/1.1.

HTTP определяет различные методы запроса, и каждому назначается конкретная цель. Каждый метод запроса определяет отдельное действие, выполняемое над ресурсом: GET — получение ресурса, а POST — отправка.

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

Шаг 4. Хост отправляет ответ HTTP

Как только хост-компьютер получает HTTP-запрос, он отправляет ответ с содержанием и данными о нём.

HTTP-ответ

HTTP-ответ — это то, что клиент получает от сервера в ответ на свой HTTP-запрос. Цель HTTP-ответа — предоставить клиенту запрошенный ресурс или сообщить, что запрошенное действие было успешно выполнено, либо сообщить об ошибке.

Первая строка ответа HTTP начинается с версии протокола, выбранной сервером на основе запроса клиента. Далее идёт код состояния и краткое описание.

Код состояния HTTP представляет собой трёхзначное число, указывающее на состояние HTTP-запроса. Например, 200 означает, что операция была завершена успешно. Подробнее о статусах мы поговорим в одной из следующих частей курса.

Ответы HTTP могут иметь необязательное тело, которое может включать запрошенный ресурс (например, запрошенную веб-страницу) и заголовки HTTP, которые содержат важную информацию о данных (например, их размер и тип).

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 208

Чтобы отобразить эту страницу, браузер сначала отправил запрос на htmlacademy.ru, чтобы получить HTML-документ, а затем ряд запросов на изображения, файлы JavaScript и файлы CSS.

Если серверу не удалось получить документ, коды состояния предоставляют дополнительную информацию. Такое бывает, если сбой произошёл из-за ошибки пользователя или ошибки сервера. Наиболее известный код состояния — 404 («Файл не найден»). Мы сталкиваемся с ним каждый раз, когда клиент запрашивает путь, которого нет на сервере.

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

Указанные ниже заголовки — общие для большинства запросов:

Content-Type: text/html; charset=UTF-8
Content-Length: 208

Первый заголовок, Content-Type, сообщает браузеру, какой тип документа он отправляет обратно. Распространённым типом в интернете является text/html, поскольку все веб-страницы представляют собой текстовые файлы HTML. Также могут встречаться изображения image/png, видео video/mpeg, скрипт script/javascript и другие.

Заголовок Content-length информирует о длине документа в байтах, что помогает браузеру рассчитать время загрузки файла.

Наконец, HTTP-ответ записывает фактический запрошенный документ. К примеру, страница представляет собой простой HTML-файл:

<!DOCTYPE html>
<html>
  <head>
    <title>Курсы HTML Academy</title>
  </head>
  <body>
    <h1>HTML Academy</h1>
    <p>интерактивные онлайн-курсы</p>
  </body>
</html>

Шаг 5. Браузер отображает ответ

Теперь у браузера есть вся информация, необходимая для отображения запрошенного документа:

Браузер отображает ответ

Посмотрим в браузере

Многие браузеры включают инструменты отладки, которые позволяют просматривать HTTP-запросы и их ответы. Посмотрим на примере Google Chrome.

Откройте инструменты разработчика. Выберите вкладку Network:

Инструменты разработчика Сеть

Затем введите URL-адрес в строке браузера: http://www.htmlacademy.ru/courses. HTTP-запрос отображается в консоли, и браузер отображает страницу.

Покликайте по разным запросам. Появится интерфейс с вкладками. По умолчанию используется вкладка Headers:

HTTP заголовки

Headers включает в себя различные заголовки, такие как Content-Type и Content-Length, а также множество других.

Фактическое HTML-содержимое ответа — это другая вкладка, Response.

HTTP ответ

Итак, мы посмотрели содержимое HTTP-запроса и ответа. В следующей статье рассмотрим возможности и недостатки протокола, чтобы понять появление HTTPS, HTTP/2 и HTTP/3.