awesome-everything EN
↑ Обратно к восхождению

Сети и протоколы

QUIC-потоки и head-of-line blocking

Суть QUIC мультиплексирует независимые потоки по одному UDP-соединению — потерянный пакет блокирует только свой поток, а не всё соединение, давая выигрыш 575x на нестабильных линиях.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на junior-высоте — поверхность
◷ 10 min

В вашем HTTP/2-соединении три запроса в полёте. Один пакет теряется на перегруженном роутере. Теперь все три ответа зависли — хотя у двух из них все байты уже в буфере, готовы к доставке. QUIC создавался, чтобы сделать это невозможным.

Head-of-line blocking в TCP

TCP доставляет все байты в одном упорядоченном потоке. Если пакет N потерян, все байты после него — в каждом логическом сообщении — ждут переотправки пакета N, прежде чем приложение может их обработать.

HTTP/2 мультиплексирует пары запрос-ответ через одно TCP-соединение. Когда TCP теряет пакет, все HTTP/2-потоки зависают — даже те, чьи данные пришли целыми. Это head-of-line blocking на уровне соединения.

Числа: При 0,5% случайных потерь и RTT 100 ms сообщение, заблокированное в упорядоченной доставке TCP, ждёт ~230 ms. QUIC сокращает это до ~0,4 ms — улучшение в 575 раз.

Потоки QUIC независимы

QUIC мультиплексирует множество двунаправленных и однонаправленных потоков по одному соединению. Каждый поток имеет:

  • Собственное окно управления потоком (фрейм max-stream-data).
  • Собственное фреймирование на уровне приложения (STREAM-фреймы, каждый с ID потока и смещением).
  • Независимое обнаружение потерь — повтор STREAM-фрейма затрагивает только его поток.

Когда STREAM-фрейм с данными потока 7 теряется, только получатель потока 7 ждёт переотправки; потоки 1, 3, 5 продолжают получать новые данные.

Независимость потоков при потере пакета
Пакет
Поток 0 (видео)
Поток 1 (чат)
Поток 2 (аналитика)
пакет #1
доставлен
доставлен
доставлен
пакет #2
ПОТЕРЯН
доставлен
доставлен
пакет #3
ожидание…
доставлен
доставлен
пакет #4 (повтор)
восстановлен
доставлен
доставлен
Только поток 0 (видео) ждёт переотправки. Чат и аналитика продолжают работу.

Распределение Stream ID

Stream ID кодирует инициатора и направление в двух младших битах:

  • Клиент-инициированный двунаправленный: 0, 4, 8, 12, … (младшие 2 бита = 00)
  • Сервер-инициированный двунаправленный: 1, 5, 9, 13, … (младшие 2 бита = 01)
  • Клиент-инициированный однонаправленный: 2, 6, 10, 14, … (младшие 2 бита = 10)
  • Сервер-инициированный однонаправленный: 3, 7, 11, 15, … (младшие 2 бита = 11)

В HTTP/3 каждая пара HTTP-запрос/ответ — это один клиент-инициированный двунаправленный поток (IDs 0, 4, 8…). Эта кодировка позволяет обеим сторонам выделять ID независимо, без координации.

Распределение Stream ID в QUIC

1/3
Викторина

В QUIC, если пакет с данными потока 5 потерян, что происходит с потоком 3?

Закончи аналогию

Исправление head-of-line blocking в QUIC похоже на _______, где у каждого потока своя полоса, поэтому потеря одного пакета в одной полосе не замораживает всё шоссе.

Head-of-line blocking: TCP против QUIC
Блокировка сообщения TCP при 0,5% потерь, RTT 100 ms
~230 ms
Блокировка потока QUIC (те же условия)
~0,4 ms
Коэффициент улучшения
575×
Загрузка страницы на мобильных с потерями (HTTP/3 vs HTTP/2)
на 30–55% быстрее
Вспомните перед уходом
  1. 01
    Объясните проблему head-of-line blocking в TCP и как QUIC её решает с конкретными числами.
  2. 02
    Что кодируют два младших бита Stream ID в QUIC?
  3. 03
    Почему HTTP/2 поверх TCP всё ещё страдает от HoL-блокировки, несмотря на мультиплексирование HTTP/2?
Итог

Единый упорядоченный поток байт TCP означает, что один потерянный пакет зависает во всех логических сообщениях, разделяющих соединение — head-of-line blocking на уровне соединения. Мультиплексирование HTTP/2 не помогает, потому что TCP всё ещё снизу. QUIC даёт каждому логическому сообщению собственный поток с собственным окном управления потоком и независимой логикой повтора. Потерянный пакет вызывает переотправку только для своего потока; все остальные продолжают работу. При 0,5% потерях и RTT 100 ms улучшение составляет 575x: ~230 ms блокировки TCP против ~0,4 ms зависания потока QUIC. Stream ID кодируют инициатора и направленность в двух младших битах, так что клиент и сервер выделяют ID без координации.

Связанные уроки
встречается в165
Продолжить восхождение ↑Объединённое рукопожатие и 1-RTT
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.