HTTP-протокол #

Васильев Андрей Михайлович, 2024

Версии презентации

Базовый цикл работы HTTP-протокола #

Изначально HTTP-протокол разрабатывался как текстовый, то есть клиент и сервер обмениваются специально оформленными текстовыми сообщениями друг с другом

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

  1. Клиент открывает TCP-соединение с сервером, которое используется для отправки сообщения, и приёма ответа
  2. Клиент посылает HTTP-сообщение, например:
    GET /index.html HTTP/1.1
    Host: developer.mozilla.org
    Accept-Language: ru
  3. Сервер отвечает документом на сообщение:
    HTTP/1.1 200 OK
    Date: Sat, 09 Oct 2010 14:28:02 GMT
    ...
    <!DOCTYPE html...
  4. Клиент закрывает или переиспользует TCP-соединение для другого запроса

Разбор структуры HTTP-запроса #

GET /index.html HTTP/1.1
Host: uniyar.ac.ru
Accept-Language: ru

diagram

  • Первая строка содержит описание запроса
    • GET — метод (тип запроса)
    • /index.html — путь к документу, к которому осуществляется запрос
    • HTTP/1.1 — версия протокола
  • На следующих строках указываются заголовки запроса в формате
    название : значение
    
  • После заголовков может идти тело запроса, данные для передачи

Разбор структуры HTTP-ответа #

HTTP/1.1 200 OK
Date: Sat, 09 Oct 2010 14:28:02 GMT
...
Content-Length: 2761
Content-Type: text-html; charset=utf-8

<!DOCTYPE html...

diagram

  • Первая строка описывает результаты запроса
    • HTTP/1.1 — версия протокола
    • 200 — код ответа сервера, указывающий результат обработки
    • OK — краткое текстовое описание кода ответа
  • Список заголовков ответа
  • Если в рамках ответа возвращается документ, то среди заголовков точно будет указан Content-Length, содержащий размер документа в символах
  • Также желательно указать тип возвращаемого документа в Content-Type
  • Через пустую строку после заголовков идёт тело документа

Группы кодов статуса #

В протоколе определены следующие группы кодов ответа

  • 100-199 — Информационные ответы
  • 200-299 — Успешные ответы
  • 300-399 — Перенаправления
  • 400-499 — Ошибки в запросе от клиента
  • 500-599 — Ошибки в работе сервера

Часто используемые ответы #

  • 200 — запрос был выполнен успешно
  • 301 — перенесён на постоянной основе
  • 302 — документ временно перенесён
  • 404 — документ не найден

Базовый сценарий работы Веб-браузера #

В качестве клиента в HTTP-взаимодействии может выступать любое приложение, которое реализует HTTP-протокол

Зачастую таким клиентом выступает веб-браузер, который получает и отображает веб-страницу для пользователя

  • Пользователь указывает в браузере адрес документа, который хочет просмотреть
  • Браузер выполняет запрос к серверу и получает в ответ HTML-документ
  • Документ внутри себя указывает другие документы, которые нужны для отображения и работы HTML-документа:
  • Изображения и видео-файлы для отображения на странице
  • CSS-документы определяющие внешний вид элементов на странице
  • JavaScript-документы для выполнения интерактивных действий
  • WebAssembly-модули для выполнения вычислений
  • Браузер запрашивает все эти элементы и формирует из них интерактивный документ, с которым может взаимодействовать пользователь

Особенности протокола HTTP #

Протокол HTTP является простым #

  • Протокол изначально текстовый и состоит из небольшого набора элементов
  • С помощью доступных инструментов анализирутся бинарные запросы HTTP 2 и 3

Протокол HTTP является расширяемым #

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

В версии HTTP/1.1 ввели заголовок keep-alive, который говорит серверу, что клиент может в рамках одного TCP-соединения можно выполнить несколько HTTP-запросов

Формируется новый протокол поверх HTTP

diagram

Есть более 100 стандартных заголовков запросов и ответов

В HTTP каждый запрос индивидуален #

С точки зрения протокола HTTP каждый запрос отдельный запрос не зависит от других

  • На уровне протокола нельзя сослаться на предыдущий или следующий запрос
  • Внутри запроса можно передавать данные, которые связывают запросы друг с другом, но логика по их обработки выходит за пределы HTTP-протокола

Клиент должен передать всю необходимую информацию при каждом запросе

HTTP поддерживает сессии #

Благодаря заголовку Cookies сервер и браузер могут реализовать механизм сессий:

  • Клиент и сервер могут устанавливать новые значения
  • Клиент и сервер обязуются их передавать вместе с запросами и ответами
  • Данные внутри должны быть небольшого объёма