HTTP/1.1, HTTP/2 и HTTP/3

Прослеживаем, как HTTP ускорялся от версии 1.1 к 2 и 3 и какие проблемы решала каждая версия.

HTTP развивался ради одной цели — скорости. Семантика (методы, статусы, заголовки) почти не менялась; менялось то, как данные ездят по сети.

HTTP/1.1: одна труба, очередь запросов

HTTP/1.1 (1997) — рабочая лошадка вебa на десятилетия. Его главная проблема — head-of-line blocking: по одному TCP-соединению запросы идут по очереди. Пока не пришёл ответ на первый, второй ждёт. Браузеры обходили это, открывая по 6 параллельных соединений на домен, но это костыль и трата ресурсов.

  • Запросы текстовые, заголовки повторяются в каждом и не сжимаются.
  • Нельзя получить несколько ответов вперемешку по одному соединению.

HTTP/2: мультиплексирование

HTTP/2 (2015) решил главную боль — ввёл мультиплексирование: по одному TCP-соединению одновременно «летят» много запросов и ответов, разбитых на кадры (frames) и помеченных идентификатором потока (stream). Медленный ответ больше не блокирует остальные на уровне HTTP.

ВозможностьЧто даёт
Мультиплексированиемного запросов в одном соединении параллельно
Сжатие заголовков (HPACK)не передавать одинаковые заголовки каждый раз
Бинарный форматкомпактнее и быстрее парсится, чем текст
Server Pushсервер может слать ресурсы заранее (на практике редко)

Но осталась проблема уровнем ниже: HTTP/2 работает поверх TCP, а в TCP при потере одного пакета тормозят все потоки — TCP-уровневый head-of-line blocking.

HTTP/3: уход на QUIC поверх UDP

HTTP/3 (2022) решил и эту проблему радикально — заменил транспорт. Вместо TCP используется QUIC поверх UDP. QUIC реализует надёжность и мультиплексирование сам, но независимо для каждого потока: потеря пакета в одном потоке не тормозит другие.

  • Быстрее устанавливает соединение (TLS встроен в рукопожатие QUIC — меньше круговых задержек).
  • Нет TCP-уровневого блокирования: потоки действительно независимы.
  • Лучше переживает смену сети (Wi-Fi → мобильная) — соединение не рвётся.

Сравнение

HTTP/1.1HTTP/2HTTP/3
ТранспортTCPTCPQUIC/UDP
Форматтекстбинарныйбинарный
Мультиплексированиенетда (но HoL в TCP)да, без HoL
Сжатие заголовковнетHPACKQPACK

Зачем это веб-разработчику

Понимание версий объясняет, почему старые советы по оптимизации (склеивать файлы, шардить домены) актуальны для HTTP/1.1, но вредны для HTTP/2+. В DevTools браузера в колонке Protocol видно h2 или h3 — это подсказывает, что включено на сервере.

Итог

  • HTTP/1.1: один запрос за раз в соединении, head-of-line blocking.
  • HTTP/2: мультиплексирование и сжатие заголовков поверх TCP.
  • HTTP/3: QUIC поверх UDP — убирает TCP-блокирование, быстрее соединяется.
  • Семантика HTTP (методы, статусы) во всех версиях одна и та же.
Проверьте себя
1. Какую главную проблему HTTP/1.1 решил HTTP/2?
AОтсутствие шифрования
BHead-of-line blocking на уровне HTTP — ввёл мультиплексирование запросов в одном соединении
CОтсутствие методов GET и POST
DСлишком длинные URL
2. На каком транспорте работает HTTP/3?
ATCP
BQUIC поверх UDP
CICMP
Dнапрямую на IP
3. Почему HTTP/2 всё ещё страдал от head-of-line blocking?
AИз-за текстового формата
BПотому что работает поверх TCP, где потеря одного пакета тормозит все потоки
CИз-за отсутствия сжатия
DЭто неправда, не страдал
Поддержать проект