open atlas
↑ К треку
Сети и протоколы NET · 10 · 02

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

QUIC мультиплексирует независимые потоки по одному UDP-соединению — потерянный пакет блокирует только свой поток, а не всё соединение, давая выигрыш 575x на нестабильных линиях.

NET Junior ◷ 10 min
Уровень
ОсновыJuniorMiddleSenior

В вашем 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 без координации. Теперь, когда вы увидите, что видеозвонок или мультиплексированный API не прерывается при нестабильном мобильном соединении, вы узнаете модель независимых потоков в действии: один потерянный пакет стоит одному потоку, а не всей сессии.

Практика

Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.

вспомнитьприменитьуглубить0 из 5 завершено
Связанные уроки
встречается в168

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.