Версии протокола HTTP

Версии меняют framing и транспортные свойства, но сохраняют HTTP semantics: methods, status codes, headers, caching.

Сравнение

ВерсияТранспортМультиплексированиеЗаголовкиГлавный trade-off
HTTP/1.1TCPнет полноценного; несколько connectionsтекстовые, без межзапросного сжатияпросто, но много connections и head-of-line на них
HTTP/2TCPмного streams в одном connectionHPACKpacket loss TCP задерживает все streams connection
HTTP/3QUIC поверх UDPнезависимые streamsQPACKсложнее transport и инфраструктура

HTTP/1.1 поддерживает persistent connections. Pipelining существовал, но практически ограничен head-of-line и поддержкой intermediaries.

HTTP/2 использует бинарные frames и streams. Он не делает JSON бинарным: representation остаётся тем же, меняется framing. Server push не следует считать ключевой универсальной оптимизацией; он редко нужен и поддерживается не везде.

HTTP/3 интегрирует TLS в QUIC handshake и устраняет transport head-of-line между независимыми streams. Потеря пакета одного stream не обязана блокировать delivery остальных.

Согласование

Для TLS endpoint протокол обычно согласуется через ALPN. Клиент и server/proxy могут поддерживать разные версии; приложение за proxy нередко общается с ним по другой версии, чем внешний клиент.

Практическая диагностика

curl --http1.1 -I "$DEMO_ENDPOINT/health"
curl --http2 -I "$DEMO_ENDPOINT/health"

Версию не выбираю “для скорости” в отрыве от latency, packet loss, proxy и числа параллельных запросов.

Типичные сбои

  • Считать HTTP/2 двумя TCP connections вместо streams одного connection.
  • Обвинять application в сбое версии, которую завершает reverse proxy.
  • Путать binary framing HTTP/2 с форматом body.
  • Отключить fallback и потерять клиентов за несовместимой сетью.

Вопросы для собеседования

Сохраняются ли методы REST при HTTP/2? Да, HTTP semantics не меняется.

Почему HTTP/2 всё ещё страдает от head-of-line? Все streams идут через один упорядоченный TCP byte stream.

Что меняет HTTP/3? Использует QUIC с независимыми streams и встроенным защищённым handshake.

Почему HTTP/1.1 не обязательно открывает connection на каждый request? Он поддерживает persistent connections.

См. Веб протоколы, REST.