HTTP/2 и HTTP/3

Материал из llmdocs — справочник разработчика
HTTP/2 и HTTP/3
HTTP/2RFC 7540 (май 2015), актуальная редакция RFC 9113 (2022)
Предшественник HTTP/2SPDY (Google, 2009)
Сжатие заголовковHPACK (HTTP/2), QPACK (HTTP/3)
HTTP/3RFC 9114 (июнь 2022)
Транспорт HTTP/3QUIC (RFC 9000) поверх UDP
Шифрованиев браузерах HTTP/2 только с TLS; в HTTP/3 TLS 1.3 встроен
Обнаружение HTTP/3заголовок Alt-Svc или DNS-запись HTTPS

HTTP/2 и HTTP/3 — две современные версии протокола HTTP. Они не меняют смысла запросов и ответов — те же методы, коды состояния, заголовки и URL, — но иначе передают их по сети, чтобы страницы загружались быстрее. HTTP/2 (2015) заменил текстовый формат HTTP/1.1 двоичными кадрами и научился передавать много запросов параллельно по одному TCP-соединению.[1] HTTP/3 (2022) перенёс эти идеи на транспорт QUIC, работающий поверх UDP, и избавился от главного ограничения TCP.[3]

Проблемы HTTP/1.1

В HTTP/1.1 соединение обслуживает один запрос за раз: следующий ждёт окончания предыдущего ответа (head-of-line blocking). Браузеры обходили это, открывая до шести соединений на домен, а разработчики — склеивали файлы в бандлы, собирали картинки в спрайты и раскидывали ресурсы по поддоменам (domain sharding). К тому же каждый запрос повторял объёмные текстовые заголовки — cookie, User-Agent — без сжатия.

HTTP/2

Протокол вырос из экспериментального SPDY, который Google развивал с 2009 года; стандарт RFC 7540 вышел в мае 2015-го, а в 2022 году его заменила уточнённая редакция RFC 9113.[1]

  • Двоичное кадрирование. Сообщения разбиты на кадры (HEADERS, DATA, SETTINGS, WINDOW_UPDATE и др.), каждый помечен номером потока.
  • Мультиплексирование. Десятки запросов и ответов идут одновременно по одному соединению, их кадры перемежаются. Склейка файлов и шардинг доменов стали не нужны и даже вредны.
  • Сжатие заголовков HPACK — таблица уже переданных заголовков и кодирование Хаффмана; повторяющиеся cookie отправляются почти бесплатно.[2]
  • Приоритеты — клиент подсказывает серверу, что важнее (CSS раньше картинок). Исходная древовидная схема оказалась сложной и в RFC 9113 объявлена устаревшей в пользу упрощённой (RFC 9218).
  • Server Push — сервер мог заранее отправить ресурсы, которых клиент ещё не просил. На практике выигрыша почти не давал, и в 2022 году Chrome отключил его.[6] Замена — подсказки 103 Early Hints и <link rel="preload">.

Формально HTTP/2 возможен и без шифрования (h2c), но браузеры поддерживают его только поверх TLS; версия выбирается при рукопожатии через расширение ALPN (h2).

Ограничение. Потоки независимы на уровне HTTP, но всё ещё лежат в одном TCP-соединении. Потеря одного пакета останавливает доставку данных всех потоков, пока он не будет переслан: блокировка начала очереди переехала с уровня HTTP на уровень TCP. На мобильных сетях с потерями HTTP/2 иногда работает хуже, чем несколько соединений HTTP/1.1.

HTTP/3

HTTP/3 использует QUIC — транспорт поверх UDP, разработанный в Google и стандартизованный IETF в 2021 году (RFC 9000). Сам HTTP/3 опубликован как RFC 9114 в июне 2022 года.[3][7]

  • Потоки на уровне транспорта. QUIC сам знает о потоках, и потерянный пакет задерживает только тот поток, к которому относится.
  • Быстрое установление соединения. Транспортное и криптографическое рукопожатия (TLS 1.3 встроен в QUIC) совмещены: 1-RTT для нового соединения и 0-RTT при повторном.
  • Миграция соединения. Соединение определяется идентификатором, а не парой IP-адресов и портов, поэтому переживает переход с Wi-Fi на мобильную сеть.
  • QPACK — вариант сжатия заголовков, устойчивый к доставке потоков в произвольном порядке.[4]

Браузер не знает заранее, поддерживает ли сервер HTTP/3, поэтому первое подключение обычно идёт по HTTP/2, а сервер сообщает о HTTP/3 заголовком Alt-Svc: h3=":443". Более быстрый путь — DNS-запись типа HTTPS (SVCB), где поддерживаемые протоколы указаны сразу (см. DNS-записи (A, AAAA, CNAME, MX, TXT)).[5]

Сравнение

HTTP/1.1 HTTP/2 HTTP/3
Формат текст двоичные кадры двоичные кадры
Транспорт TCP TCP QUIC (UDP)
Параллельные запросы очередь, много соединений мультиплексирование мультиплексирование без блокировки TCP
Сжатие заголовков нет HPACK QPACK
Шифрование по желанию на практике TLS всегда TLS 1.3

Поддержка и практика

Все современные браузеры поддерживают обе версии, крупные CDN и сервисы — включены по умолчанию. Из веб-серверов HTTP/3 есть в Caddy (включён автоматически), nginx (с версии 1.25), LiteSpeed, HAProxy; для этого на сервере нужно открыть UDP-порт 443.

curl -sI --http2 https://example.com | head -1      # HTTP/2 200
curl -sI --http3 https://example.com | head -1      # нужен curl, собранный с поддержкой HTTP/3
curl -sI https://example.com | grep -i alt-svc

Некоторые корпоративные сети и провайдеры блокируют или ограничивают UDP; браузеры в этом случае незаметно возвращаются к HTTP/2.

См. также

Источники

  1. RFC 9113 — HTTP/2
  2. RFC 7541 — HPACK: Header Compression for HTTP/2
  3. RFC 9114 — HTTP/3
  4. RFC 9204 — QPACK: Field Compression for HTTP/3
  5. RFC 9460 — Service Binding and Parameter Specification via the DNS (SVCB and HTTPS RRs)
  6. Chrome for Developers — Removing HTTP/2 Server Push from Chrome (2022)
  7. Daniel Stenberg — HTTP/3 explained