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

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

Обнаружение потерь и управление перегрузкой

Суть QUIC использует монотонно возрастающие номера пакетов и подключаемое управление перегрузкой — NewReno, CUBIC, BBR — устраняя неоднозначность алгоритма Карна и позволяя обновлять CC на уровне приложения.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на middle-высоте — в небе
◷ 12 min

TCP повторно отправляет потерянный пакет с тем же порядковым номером. Пришедший ACK неоднозначен — сервер подтверждает оригинальную отправку или повтор? QUIC даёт каждому пакету уникальный номер, и это единственное изменение делает обнаружение потерь однозначным, а управление перегрузкой — подключаемым.

Монотонные номера пакетов

Номера пакетов QUIC — строго возрастающие целые числа — потерянный пакет при повторе получает новый номер. В отличие от TCP, где повторно отправленные пакеты несут тот же порядковый номер (создавая неоднозначность — алгоритм Карна как обходное решение), QUIC никогда не переиспользует номер пакета.

ACK-диапазоны: Фреймы ACK QUIC перечисляют диапазоны подтверждённых номеров пакетов:

ack_ranges: [1000..1005, 1008..1010]

Пропуск в 1006 и 1007 означает, что эти пакеты ещё не получены. Это эквивалент TCP SACK, но нативный для протокола.

Объявление потери происходит когда:

  1. Более поздний пакет подтверждён, и окно переупорядочивания истекло (обычно 1,5× макс. RTT после отправки пакета не по порядку).
  2. Или срабатывает PTO (Probe Timeout) — аналог RTO TCP, но вычисляемый для каждого пространства номеров пакетов.

Монотонная модель проще модели TCP, но требует повторной сериализации повторно отправленных фреймов с новыми номерами — небольшая стоимость CPU.

Модель номеров пакетов: TCP vs QUIC
TCP (неоднозначно)
Отправка seq=100 → ПОТЕРЯН
Повтор seq=100 → ACK 101
ACK: оригинал или повтор?
→ Нужен алгоритм Карна
QUIC (однозначно)
Отправка pkt#100 → ПОТЕРЯН
Повтор как pkt#101 → ACK 101
ACK#101 = подтверждён повтор
→ Нет неоднозначности, нет обходного пути

Подключаемое управление перегрузкой

Поскольку QUIC живёт в пользовательском пространстве, управление перегрузкой подключаемо. RFC 9002 определяет NewReno как базовый алгоритм. Основные реализации поставляют:

  • NewReno — медленный старт, аддитивное увеличение, уполовинивание cwnd при потере.
  • CUBIC (quiche от Cloudflare, стандарт ядра Linux) — агрессивное зондирование после потери с кубической функцией.
  • BBR (Google, YouTube, Cloudflare edge) — моделирование пропускной способности узкого места и минимального RTT; игнорирование случайных потерь.
  • HyStart++ — ранний выход из медленного старта при обнаружении очереди, используется с CUBIC.

Приложения могут выбирать алгоритм при открытии соединения. Одна QUIC-библиотека может поддерживать несколько алгоритмов. Такая гибкость невозможна с kernel TCP, где изменение CC требует перекомпиляции или sysctl-изменений на миллионах серверов.

Компромисс: Гибкость затрудняет бенчмаркинг — сравнение двух QUIC-стеков с разными алгоритмами CC — это не честное сравнение самого QUIC.

Викторина

Почему QUIC не нуждается в алгоритме Карна, и какое проектное решение делает это возможным?

Викторина

Почему подключаемое управление перегрузкой в QUIC значимо по сравнению с kernel TCP?

Какой RFC?

Какой RFC определяет алгоритм обнаружения потерь QUIC и базовое управление перегрузкой?

Почему это работает

Почему не использовать управление перегрузкой TCP в QUIC? CC TCP реализовано в слое сокетов ядра, где у него прямой доступ к временным меткам пакетов, буферам ядра и аппаратному ускорению NIC. Переимплементация в пользовательском пространстве (как делает QUIC) стоит CPU — каждый пакет должен обрабатываться пользовательским кодом без помощи железа. Выгода: пользовательское пространство может итерировать быстрее, может получать доступ к метаданным уровня приложения (например, приоритет видеопотока) для более умных CC-решений, и может обновляться вместе с приложением без касания ОС.

Алгоритмы управления перегрузкой QUIC
Базовый алгоритм RFC 9002
NewReno (медленный старт + AIMD)
По умолчанию Cloudflare quiche
CUBIC (агрессивное зондирование)
Google YouTube / GCP
BBR (модель пропускная способность-RTT)
Цикл обновления CC в пользовательском пространстве
еженедельно (vs ежемесячно+ для kernel TCP)
Выбор CC на соединение
при открытии соединения
Вспомните перед уходом
  1. 01
    Что такое алгоритм Карна и почему QUIC он не нужен?
  2. 02
    Как работает механизм ACK-диапазонов QUIC и на какую TCP-функцию он похож?
  3. 03
    Что такое PTO в QUIC и чем отличается от RTO TCP?
Итог

Переиспользование порядкового номера TCP при повторной отправке создаёт неоднозначность алгоритма Карна — нельзя измерить RTT из ACK повторной передачи. QUIC устраняет это, присваивая каждой отправке новый строго возрастающий номер пакета. Фреймы ACK несут диапазоны, поэтому пропуски в подтверждённых номерах точно выявляют потерянные пакеты — эквивалент TCP SACK, но всегда активный. Потеря объявляется через окно переупорядочивания или PTO (вычисляемый для каждого пространства номеров пакетов). Поскольку QUIC работает в пользовательском пространстве, управление перегрузкой подключаемо: RFC 9002 определяет NewReno как базовый, но CUBIC и BBR поставляются в основных библиотеках и могут выбираться на соединение. Приложения на CDN edge могут обновлять алгоритм CC еженедельно без касания ядра.

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

Trademarks belong to their respective owners. Editorial reference only.