HTTP/2 и HTTP/3
| HTTP/2 | RFC 7540 (май 2015), актуальная редакция RFC 9113 (2022) |
|---|---|
| Предшественник HTTP/2 | SPDY (Google, 2009) |
| Сжатие заголовков | HPACK (HTTP/2), QPACK (HTTP/3) |
| HTTP/3 | RFC 9114 (июнь 2022) |
| Транспорт HTTP/3 | QUIC (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.
См. также
Источники
- RFC 9113 — HTTP/2
- RFC 7541 — HPACK: Header Compression for HTTP/2
- RFC 9114 — HTTP/3
- RFC 9204 — QPACK: Field Compression for HTTP/3
- RFC 9460 — Service Binding and Parameter Specification via the DNS (SVCB and HTTPS RRs)
- Chrome for Developers — Removing HTTP/2 Server Push from Chrome (2022)
- Daniel Stenberg — HTTP/3 explained