System Design Space
Граф знанийНастройки

Обновлено: 23 июня 2026 г. в 10:23

QUIC и HTTP/3: транспорт нового поколения

средний

Что меняют QUIC и HTTP/3: пользовательский транспорт поверх UDP с интегрированным TLS 1.3, независимые потоки без блокировки в начале очереди, рукопожатия 1-RTT/0-RTT и миграция соединений при смене сети.

Глава про QUIC и HTTP/3 важна тем, что показывает смену опоры под веб-трафиком: транспорт переезжает с TCP на UDP, рукопожатие TLS 1.3 встроено в него, а потоки перестают блокировать друг друга при потере пакета.

На практике это помогает осознанно разворачивать HTTP/3 рядом с HTTP/2 через Alt-Svc и фолбэк, учитывать UDP-блокировки и наблюдаемость, а также понимать, где выигрыш от устранения HoL blocking реален, а где его съедает стоимость на сервере.

В интервью и архитектурных обсуждениях материал даёт структурный язык, чтобы объяснять цену рукопожатий, миграцию соединений по connection ID и поведение потоков при потерях через реальные механизмы QUIC, а не общими словами про «новый быстрый протокол».

Практическая польза главы

Бюджет задержки

1-RTT QUIC против 2-RTT TCP+TLS и 0-RTT при возобновлении — конкретные рычаги для первого запроса на дальних маршрутах.

Потоки без блокировки

Потеря пакета тормозит только свой поток, а не всё соединение — реальная польза при мультиплексировании многих ресурсов.

Миграция соединений

Connection ID вместо 4-кортежа держит сессию живой при смене Wi-Fi↔LTE — важно для мобильных клиентов.

Осознанное развёртывание

Alt-Svc и фолбэк на HTTP/2, UDP-блокировки и серверная стоимость — что учесть, чтобы выигрыш не съелся.

RFC

RFC 9000 (QUIC)

Спецификация QUIC: транспорт поверх UDP с потоками, низкой задержкой установки соединения и миграцией пути.

Перейти на сайт

и — это не «ещё одна версия протокола», а смена опоры под всем веб-трафиком. Транспорт переезжает с на , рукопожатие 1.3 встроено прямо в транспорт, а потоки перестают блокировать друг друга при потере пакета. От этого сдвига зависят задержка первого запроса, поведение в мобильных сетях и судьба соединения при смене сети.

Эта глава опирается на три соседних протокольных главы и показывает, что именно меняют QUIC и HTTP/3 поверх них. Протокол TCP даёт надёжный байтовый поток, протокол TLS — рукопожатие и шифрование поверх него, а протокол HTTP — прикладную семантику и эволюцию HTTP/1.1 → HTTP/2.

Ровно эти три слоя классический стек складывает по отдельности: сначала рукопожатие , затем рукопожатие , и только потом мультиплексирует потоки внутри одного соединения. QUIC и HTTP/3 меняют именно это: транспорт поверх с интегрированным TLS 1.3, потоки без и миграция соединения при смене сети.

Для системного дизайна это важно потому, что QUIC лежит на пути всё большей доли внешнего трафика. Понимание его перелётов, поведения потоков при потерях и механики миграции помогает объяснять рост , осознанно разворачивать рядом с HTTP/2 и понимать, где выигрыш от QUIC реален, а где сеть и так стабильна и разницы почти не будет.

Источник

HTTP/3: the past, present, and future (Cloudflare)

Разбор Cloudflare про HoL blocking на уровне TCP, рукопожатия и преимущества QUIC в нестабильных сетях.

Перейти на сайт

Проблема: цена рукопожатий и HoL blocking

Классический стек устойчив и проверен, но платит две понятные цены: лишние перелёты при установке соединения и блокировку потоков при потере одного сегмента. Обе цены становятся заметны именно там, где сеть дальняя или нестабильная.

Перелёты до первого байта

Классический стек складывает рукопожатия: один RTT на TCP (SYN/SYN-ACK) плюс ещё один на TLS 1.3. Новое соединение к дальнему серверу платит этими перелётами ещё до первого запроса.

Раздельные слои

TCP и TLS проектировались независимо, поэтому их рукопожатия не совмещаются: транспорт сначала открывает поток, и только потом поверх него идёт защита.

HoL blocking на транспорте

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

Привязка к 4-кортежу

TCP-соединение определяется парой IP:port с обеих сторон. Смена сети меняет адрес клиента и рвёт соединение — приходится открывать новое и платить за рукопожатия заново.

устранил на прикладном уровне за счёт , но оставил её на уровне транспорта: один упорядоченный поток всё ещё держит все логические потоки заложниками одной потери.

Классический стек против QUIC + HTTP/3

Главное различие видно в самой структуре стека: где раньше было три независимых слоя со своими рукопожатиями, у QUIC остаётся один транспорт поверх UDP, в который встроены и потоки, и TLS 1.3.

TCP + TLS 1.3 + HTTP/2

классический стек

HTTP/2 — мультиплексирование во фреймах

Несколько потоков в одном соединении, сжатие заголовков HPACK.

TLS 1.3 — отдельный record layer

Своё рукопожатие поверх уже установленного TCP-соединения.

TCP — надёжный байтовый поток

Единый упорядоченный поток: потеря сегмента тормозит все потоки сразу.

IP

Доставка пакетов между узлами.

QUIC + HTTP/3

транспорт нового поколения

HTTP/3 — отображение HTTP на потоки QUIC

Та же семантика HTTP, сжатие заголовков QPACK без HoL blocking.

QUIC — транспорт + интегрированный TLS 1.3

Потоки, надёжность и шифрование в одном протоколе; рукопожатие за 1-RTT.

UDP — датаграммы

Минимальный транспорт ядра ОС; вся логика соединения вынесена в QUIC.

IP

Доставка пакетов между узлами.

Слева три независимых слоя складывают рукопожатия и наследуют единый порядок байтов TCP. Справа QUIC объединяет транспорт и TLS 1.3 в один протокол поверх UDP, а потоки становятся независимыми по доставке.

RFC

RFC 9000 (QUIC)

Потоки с управлением потоком, повторные передачи на уровне потоков и шифрование пакетов как ядро транспорта QUIC.

Перейти на сайт

QUIC поверх UDP: потоки без HoL blocking

QUIC (RFC 9000) — это пользовательский транспорт поверх . Ядро ОС лишь доставляет датаграммы, а вся логика соединения, и надёжности живёт в библиотеке QUIC и работает на уровне отдельных потоков.

  • QUIC — это пользовательский транспорт поверх UDP: логика соединения, потоков и повторных передач живёт в библиотеке, а не в ядре ОС.
  • Внутри одного соединения параллельно работают независимые потоки. Надёжность и порядок гарантируются на уровне отдельного потока, а не всего соединения.
  • Потеря пакета задерживает только те потоки, чьи данные в нём ехали. Остальные потоки продолжают доставляться без блокировки — это и есть отсутствие HoL blocking на транспорте.
  • В каждом пакете QUIC полезная нагрузка шифруется, а большая часть полей заголовка защищена (header protection); открытым остаётся в основном Connection ID для маршрутизации, поэтому промежуточные узлы видят гораздо меньше внутренней структуры соединения, чем у TCP.

RFC

RFC 9001 (Using TLS to Secure QUIC)

Как TLS 1.3 встроен в QUIC: handshake едет прямо в пакетах, а record layer заменён криптозащитой пакетов.

Перейти на сайт

Рукопожатие: интегрированный TLS 1.3, 1-RTT и 0-RTT

В классическом стеке рукопожатия TCP и идут друг за другом. QUIC совмещает их: транспортное и криптографическое рукопожатие происходят вместе, поэтому новое соединение укладывается в один , а возобновление — в ноль.

Интегрированный TLS 1.3

QUIC не несёт TLS-записи поверх себя — он забирает рукопожатие TLS 1.3 внутрь транспорта (RFC 9001). Сообщения handshake едут прямо в пакетах QUIC, а record layer заменён криптозащитой пакетов.

1-RTT для нового соединения

Транспортные параметры и ключевой обмен совмещены: клиент отправляет ClientHello в первом перелёте, и уже через один RTT можно слать прикладные данные. Отдельного TCP-рукопожатия перед этим нет.

0-RTT при возобновлении

Если стороны уже общались, клиент использует заранее согласованный ключ (PSK) и шлёт первые данные сразу, без ожидания ответа сервера. Первый запрос уходит в нулевом перелёте.

Риск повтора 0-RTT

Ранние данные 0-RTT не защищены от повторного воспроизведения и не дают forward secrecy. Через них допустимы только идемпотентные операции — никаких изменяющих состояние запросов.

Осторожно с 0-RTT. Ранние данные можно воспроизвести повторно и они не дают forward secrecy, поэтому через 0-RTT допустимы только идемпотентные запросы — это та же оговорка, что и для возобновления .

Связанная глава

Протокол UDP

Датаграммный транспорт под QUIC: почему именно UDP стал основой для пользовательского транспорта.

Открыть главу

Миграция соединений: connection ID вместо IP:port

Соединение жёстко привязано к 4-кортежу адресов и портов, поэтому смена сети его рвёт. QUIC опирается на отдельный connection ID, и это позволяет соединению пережить переход между сетями.

Connection ID вместо 4-кортежа

Соединение QUIC идентифицируется не парой IP:port, а отдельным connection ID в заголовке пакета. Адрес клиента может смениться, но сервер узнаёт соединение по идентификатору.

Переживание смены сети

Переход Wi-Fi↔LTE меняет IP клиента. TCP-соединение в этот момент порвалось бы, а QUIC продолжает существующее соединение без нового рукопожатия и без потери открытых потоков.

Проверка нового пути

При смене адреса сервер валидирует новый путь (path validation), чтобы убедиться, что клиент действительно достижим по нему — это защита от подмены адреса и амплификации.

Приватность через ротацию ID

Стороны используют несколько connection ID и меняют их, чтобы сторонний наблюдатель не мог по идентификатору связывать активность клиента при смене сети.

На практике это особенно заметно в мобильных сценариях: переход Wi-Fi↔LTE на смартфоне не роняет загрузку и не требует нового рукопожатия, потому что соединение узнаётся по идентификатору, а не по адресу.

RFC

RFC 9114 (HTTP/3)

Отображение семантики HTTP на транспорт QUIC и внутренний слой фреймирования, похожий на HTTP/2.

Перейти на сайт

HTTP/3: отображение HTTP на QUIC и QPACK

(RFC 9114) сохраняет ту же прикладную семантику HTTP, что и предыдущие версии, но переносит её на потоки QUIC. Главное изменение в деталях — сжатие заголовков: HPACK заменён на QPACK, рассчитанный на потоки без общего порядка.

Отображение HTTP на QUIC

HTTP/3 сохраняет ту же семантику HTTP (методы, статусы, заголовки из RFC 9110), но кладёт каждый запрос-ответ на отдельный поток QUIC и использует своё двоичное фреймирование, похожее на HTTP/2.

QPACK вместо HPACK

HPACK из HTTP/2 опирается на строгий порядок данных и потому несовместим с потоками без общего порядка. QPACK (RFC 9204) сжимает заголовки так, чтобы декодирование не блокировалось из-за переупорядочивания пакетов.

Динамическая таблица под контролем

QPACK разносит обновления словаря и ссылки на него по разным потокам, позволяя кодировщику самому выбирать компромисс между степенью сжатия и риском блокировки заголовков.

Один поток — один запрос

Поскольку каждый HTTP-запрос едет в своём потоке QUIC, потеря пакета в одном запросе не тормозит остальные — HoL blocking устранён и на прикладном уровне.

HPACK в опирался на строгий порядок доставки и потому переносил в сжатие заголовков. QPACK (RFC 9204) разрывает эту связь, позволяя декодировать заголовки даже при переупорядочивании пакетов.

Перегрузка, потери и почему UDP

QUIC не отменяет — он переносит его в пространство пользователя и делает точнее. А выбор как основы — это не про производительность датаграмм, а про возможность вообще развернуть новый транспорт в сегодняшнем интернете.

Управление перегрузкой в пространстве пользователя

Контроль перегрузки и повторные передачи живут в библиотеке, а не в ядре. Алгоритмы (например, в духе CUBIC или BBR) обновляются вместе с приложением — без оглядки на цикл выпуска ОС.

Точнее различает потери

Каждый пакет QUIC имеет монотонно растущий номер, и повторно переданные данные едут уже под новым номером. Это снимает неоднозначность повторов TCP и точнее измеряет RTT и потери.

Почему UDP, а не «новый TCP»

Развернуть новый транспортный протокол рядом с TCP невозможно: промежуточные узлы пропускают практически только TCP и UDP. QUIC строится поверх UDP именно потому, что это единственный путь развернуть пользовательский транспорт в реальном интернете.

Ossification середины сети

Файрволы и NAT десятилетиями «застывали» вокруг видимых полей TCP, мешая эволюции протокола. QUIC шифрует почти все заголовки, чтобы середина сети не зависела от его внутренней структуры и не мешала менять протокол дальше.

Эксплуатация: развёртывание, фолбэк и наблюдаемость

Alt-Svc и фолбэк на HTTP/2

Браузер сначала идёт по HTTP/2 поверх TLS, а сервер заголовком Alt-Svc сообщает, что доступен HTTP/3. Если QUIC не проходит, клиент прозрачно остаётся на HTTP/2 — HTTP/3 почти всегда разворачивается как дополнение, а не замена.

UDP-блокировки

Часть корпоративных сетей режет или ограничивает UDP. Поэтому фолбэк на TCP обязателен: без него клиенты за такими сетями просто не подключатся, и фолбэк должен срабатывать быстро.

Стоимость на сервере

Криптография и обработка соединения уехали в пространство пользователя — по CPU это обычно дороже, чем аппаратно ускоренный TCP+TLS. Под высокой нагрузкой разницу нужно закладывать в расчёт ёмкости заранее, а не ловить её на проде.

Наблюдаемость

Привычные инструменты опираются на видимые поля TCP, а у QUIC они зашифрованы. Для диагностики используют qlog/qvis и серверные метрики, а пассивный анализ трафика по проводу почти ничего не показывает.

Почему это важно для системного дизайна

  • Совмещённое рукопожатие убирает целый на старте (2-RTT TCP+TLS → 1-RTT QUIC) и заметно ускоряет первый запрос на дальних маршрутах.
  • Независимые потоки снимают на транспорте, поэтому потери меньше бьют по нестабильным и мобильным сетям.
  • Миграция соединения по connection ID удерживает сессию при смене сети без нового рукопожатия.
  • QUIC шифрует заголовки и переносит логику в пространство пользователя — это меняет и стоимость на сервере, и подход к наблюдаемости.

Компромиссы и частые ошибки

Считать, что HTTP/3 везде быстрее HTTP/2: при низких потерях и стабильной проводной сети выигрыш от устранения HoL blocking невелик, а накладные расходы на CPU могут его съесть.

Развернуть HTTP/3 без рабочего фолбэка на HTTP/2: клиенты за UDP-блокировками или сломанным путём останутся без доступа.

Слать через 0-RTT неидемпотентные запросы: ранние данные можно воспроизвести повторно, что приводит к дублированию изменяющих состояние операций.

Ожидать, что миграция соединения скроет любую смену сети: она спасает соединение, но не отменяет проверку пути и не делает мгновенным восстановление при долгих разрывах.

Переносить мониторинг с TCP «как есть»: без qlog и серверных метрик QUIC останется чёрным ящиком, потому что его заголовки зашифрованы.

Источники и материалы

Карта источников: RFC 9000 держит транспорт QUIC, RFC 9001 — встраивание TLS 1.3, RFC 9114 — отображение HTTP/3, RFC 9204 — QPACK. Практические утверждения о выигрыше в задержке и наблюдаемости зависят от сети, middlebox-ов, реализации QUIC и качества фолбэка на HTTP/2 — это ориентир для решения, а не обещание ускорения в любом продукте.

Связанные главы

  • Протокол TCP - описывает надёжный байтовый поток и рукопожатие, чью цену и HoL blocking на транспорте как раз снимает QUIC.
  • Протокол TLS - разбирает рукопожатие TLS 1.3 и 1-RTT/0-RTT, которые QUIC забирает внутрь транспорта по RFC 9001.
  • Протокол HTTP - показывает семантику HTTP и эволюцию HTTP/1.1 → HTTP/2, поверх которой HTTP/3 строит своё отображение на QUIC.
  • Протокол UDP - объясняет датаграммный транспорт, поверх которого живёт QUIC и который остаётся единственным путём развернуть новый транспорт в интернете.

Чтобы отмечать прохождение, включи трекинг в Настройки