# HTTP/2 и HTTP/3

> Две современные версии протокола HTTP — HTTP/2 вводит двоичные кадры и мультиплексирование поверх TCP, HTTP/3 переносит те же идеи на QUIC поверх UDP.

Источник: https://llmdocs.ru/wiki/http2-http3/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **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](https://llmdocs.ru/wiki/http.md). Они не меняют смысла запросов и ответов — те же методы, коды состояния, заголовки и URL, — но иначе передают их по сети, чтобы страницы загружались быстрее. HTTP/2 (2015) заменил текстовый формат HTTP/1.1 двоичными кадрами и научился передавать много запросов параллельно по одному [TCP](https://llmdocs.ru/wiki/tcp.md)-соединению.[1] HTTP/3 (2022) перенёс эти идеи на транспорт [QUIC](https://llmdocs.ru/wiki/quic.md), работающий поверх 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](https://llmdocs.ru/wiki/tls.md); версия выбирается при рукопожатии через расширение 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](https://llmdocs.ru/wiki/tls.md) 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)](https://llmdocs.ru/wiki/dns-records.md)).[5]

## Сравнение

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

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

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

```bash
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.

## См. также

- [HTTP](https://llmdocs.ru/wiki/http.md)
- [QUIC](https://llmdocs.ru/wiki/quic.md)
- [TCP](https://llmdocs.ru/wiki/tcp.md)
- [TLS](https://llmdocs.ru/wiki/tls.md)

## Источники

1. [RFC 9113 — HTTP/2](https://www.rfc-editor.org/rfc/rfc9113)
2. [RFC 7541 — HPACK: Header Compression for HTTP/2](https://www.rfc-editor.org/rfc/rfc7541)
3. [RFC 9114 — HTTP/3](https://www.rfc-editor.org/rfc/rfc9114)
4. [RFC 9204 — QPACK: Field Compression for HTTP/3](https://www.rfc-editor.org/rfc/rfc9204)
5. [RFC 9460 — Service Binding and Parameter Specification via the DNS (SVCB and HTTPS RRs)](https://www.rfc-editor.org/rfc/rfc9460)
6. [Chrome for Developers — Removing HTTP/2 Server Push from Chrome (2022)](https://developer.chrome.com/blog/removing-push)
7. [Daniel Stenberg — HTTP/3 explained](https://http3-explained.haxx.se/)
