Версии протокола HTTP
Версии меняют framing и транспортные свойства, но сохраняют HTTP semantics: methods, status codes, headers, caching.
Сравнение
| Версия | Транспорт | Мультиплексирование | Заголовки | Главный trade-off |
|---|---|---|---|---|
| HTTP/1.1 | TCP | нет полноценного; несколько connections | текстовые, без межзапросного сжатия | просто, но много connections и head-of-line на них |
| HTTP/2 | TCP | много streams в одном connection | HPACK | packet loss TCP задерживает все streams connection |
| HTTP/3 | QUIC поверх UDP | независимые streams | QPACK | сложнее 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.