HTTP: что это и из чего состоит
Что такое HTTP и из чего состоит?
Что такое HTTP
HTTP (Hypertext Transfer Protocol) — прикладной протокол, построенный вокруг обмена сообщениями в модели запрос–ответ, предназначенный для взаимодействия с ресурсами (веб‑страницы, API, файлы) в распределённых системах.
Протокол является «stateless» в том смысле, что на уровне HTTP не требуется хранить состояние между запросами как обязательное свойство протокола (состояние обычно надстраивается поверх HTTP дополнительными механизмами).
Из чего состоит 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/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
Версии, методы и коды статуса
Методы задают намерение запроса, а коды статуса описывают результат обработки запроса сервером.
Таблица: классы кодов статуса
| Класс | Диапазон | Смысл |
|---|---|---|
| 1xx | 100–199 | Информационные ответы (временные) |
| 2xx | 200–299 | Успешная обработка |
| 3xx | 300–399 | Перенаправления/дополнительные действия |
| 4xx | 400–499 | Ошибка клиента |
| 5xx | 500–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).
Кратко: HTTP — прикладной протокол запрос–ответ; «состоит» из семантики (методы, статусы, заголовки, правила для контента) и формата сообщений (стартовая строка, заголовки, пустая строка, тело и фрейминг), при этом HTTP/1.1 и HTTP/3 различаются способом кодирования и транспортом (TCP/TLS против QUIC).