HTTP: что это и из чего состоит

Что такое HTTP и из чего состоит?

Что такое HTTP

HTTP (Hypertext Transfer Protocol) — прикладной протокол, построенный вокруг обмена сообщениями в модели запрос–ответ, предназначенный для взаимодействия с ресурсами (веб‑страницы, API, файлы) в распределённых системах.

Протокол является «stateless» в том смысле, что на уровне HTTP не требуется хранить состояние между запросами как обязательное свойство протокола (состояние обычно надстраивается поверх HTTP дополнительными механизмами).

В актуальной стандартизации семантика HTTP и способы её передачи разделены: отдельно описывается смысл (методы, статусы, поля, контент), а отдельно — конкретные версии, определяющие формат и доставку сообщений (например, HTTP/1.1 и HTTP/3).

Из чего состоит HTTP

Практически HTTP удобно разбирать на две части: семантика (что означает запрос/ответ) и сообщения (как это представлено в байтах и доставлено по сети).

К семантике относятся:

  • Методы (например, GET, POST, PUT, DELETE): задают намерение операции.
  • Коды статуса (например, 200, 404, 503): фиксируют результат обработки.
  • Поля (заголовки): метаданные и параметры управления.
  • Контент: данные, смысл которых определяется методом, статусом и полями.

К сообщениям и их структуре относятся:

  • Стартовая строка: request-line для запроса или status-line для ответа.
  • Заголовки: строки вида имя: значение.
  • Пустая строка: отделяет заголовки от тела.
  • Тело сообщения (необязательное): байты контента.
  • Фрейминг: правила, как определить границы тела (например, по Content-Length или Transfer-Encoding в HTTP/1.1).

Также как часть «из чего состоит HTTP» обычно рассматривается окружение:

  • Цель запроса (request target/URI) и адресация ресурса.
  • Версия HTTP и связанный с ней способ кодирования/передачи сообщений (HTTP/1.1 vs HTTP/3).
  • Транспорт и защита (TCP/TLS или QUIC), так как они влияют на поведение (задержки, мультиплексирование, обработка потерь).

Таблица: «семантика vs формат»

СлойЧто описываетПримеры
Семантика HTTPНамерение и результат операцииGET, POST, статусы 2xx/4xx/5xx, правила допустимости контента
Сообщения/кодированиеКак семантика упакована в байтыстартовая строка, заголовки, пустая строка, тело, правила длины тела
Транспорт/защитаКак байты доставляютсяHTTP/1.1 поверх TCP; HTTPS поверх TLS; HTTP/3 поверх QUIC

Структура HTTP-сообщений (HTTP/1.1)

Сообщение HTTP/1.1 концептуально выглядит так:

  • start-line
  • 0..N заголовков
  • пустая строка
  • необязательное тело (message body)

Формальная запись (в стиле спецификаций) часто приводится так:

HTTP-message = start-line CRLF *( field-line CRLF ) CRLF [ message-body ]

Пример запроса (сырой HTTP/1.1):

GET /api/users?limit=10 HTTP/1.1
Host: example.com
Accept: application/json
User-Agent: demo-client/1.0

Пример ответа (сырой HTTP/1.1):

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 27

{"items":[{"id":1}]}

Стартовая строка запроса:

request-line = method SP request-target SP HTTP-version

Строка статуса ответа:

status-line = HTTP-version SP status-code SP reason-phrase
Некорректный или «слишком терпимый» разбор HTTP-сообщений (например, неожиданные пробелы, странные переносы строк, неоднозначное определение длины тела) способен приводить к уязвимостям на стыке прокси/балансировщиков/приложений; поэтому следует опираться на строгие правила фрейминга и парсинга.

Как определяется длина тела (упрощённо для HTTP/1.1):

  • Если присутствует Transfer-Encoding и последним указан chunked, длина определяется чтением чанков до нулевого чанка.
  • Если Transfer-Encoding присутствует, но chunked не является финальным, в ряде сценариев длина может определяться закрытием соединения (чаще для ответов), однако это источник неоднозначностей и ошибок.
  • Если Transfer-Encoding отсутствует, применяется Content-Length (если задан) для определения длины тела.

Пример chunked-ответа (на уровне сообщения):

HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: text/plain

5
hello
1
!
0

Версии, методы и коды статуса

Методы задают намерение запроса, а коды статуса описывают результат обработки запроса сервером.

Таблица: классы кодов статуса

КлассДиапазонСмысл
1xx100–199Информационные ответы (временные)
2xx200–299Успешная обработка
3xx300–399Перенаправления/дополнительные действия
4xx400–499Ошибка клиента
5xx500–599Ошибка сервера

Таблица: распространённые методы и смысл контента

МетодТипичное назначениеКак трактуется контент
GETПолучение представления ресурсаКонтент ответа представляет данные ресурса/представление
HEADКак GET, но без телаТело отсутствует, метаданные аналогичны GET
POSTПередача данных на обработкуКонтент запроса — данные для обработки целевым ресурсом
PUTЗадание/замена состояния ресурсаКонтент запроса — желаемое состояние ресурса
CONNECTУстановление туннеляПри успехе соединение становится туннелем

Схема «одна семантика — разные способы доставки»:

[клиент]
  |  HTTP семантика: метод, цель, поля, статус, контент
  v
(кодирование сообщений)
  - HTTP/1.1: start-line + headers + CRLF + body
  - HTTP/3: HEADERS/DATA кадры поверх QUIC-стримов
  v
(транспорт)
  - TCP (+TLS для https)
  - QUIC (для HTTP/3)

HTTP/3 определяется как перенос HTTP-семантики поверх QUIC и использует стримы QUIC, что даёт мультиплексирование без «блокировки заголовка очереди» на уровне единого TCP-потока.

В HTTP/3 не применяется Transfer-Encoding из HTTP/1.1, поскольку формат сообщений и фрейминг задаются иначе (через кадры и свойства QUIC/HTTP/3).

Для веб‑разработчика полезно помнить, что при работе с fetch/axios/браузером обычно видна семантика (методы, статусы, заголовки, тело), а различия HTTP/1.1 vs HTTP/3 чаще проявляются в производительности и сетевом поведении, а не в прикладном коде.

Кратко: HTTP — прикладной протокол запрос–ответ; «состоит» из семантики (методы, статусы, заголовки, правила для контента) и формата сообщений (стартовая строка, заголовки, пустая строка, тело и фрейминг), при этом HTTP/1.1 и HTTP/3 различаются способом кодирования и транспортом (TCP/TLS против QUIC).