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.1 | HTTP/2 | HTTP/3 | |
| Транспорт | TCP | TCP | QUIC/UDP |
| Формат | текст | бинарный | бинарный |
| Мультиплексирование | нет | да (но HoL в TCP) | да, без HoL |
| Сжатие заголовков | нет | HPACK | QPACK |
Зачем это веб-разработчику
Понимание версий объясняет, почему старые советы по оптимизации (склеивать файлы, шардить домены) актуальны для 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 (методы, статусы) во всех версиях одна и та же.