Компьютерные сети
TCP: контроль перегрузки
Цели урока
- Понимать congestion collapse 1986: почему сеть с потерями входит в петлю обратной связи
- Знать четыре стадии классического алгоритма: slow start, congestion avoidance, fast retransmit, fast recovery
- Различать loss-based (Reno, Cubic) и model-based (BBR) алгоритмы
- Считать cwnd, rwnd, ssthresh и понимать какой ограничивает throughput сейчас
- Понимать почему BBR лучше для long fat networks и spotty Wi-Fi
В октябре 1986-го интернет пережил congestion collapse: канал LBL-Berkeley (всего 400 ярдов!) просел со 32 kbit/s до 40 bit/s, в 800 раз. Загрузка 100%, полезный трафик ~0: все слали повторы, повторы вызывали ещё повторы. В 1988-м Van Jacobson опубликовал SIGCOMM-статью с алгоритмами slow start и congestion avoidance - и интернет выжил.
- **Видеозвонки:** BBR помогает Zoom/Meet работать даже при потерях Wi-Fi
- **Загрузки:** Cubic эффективно использует гигабитные каналы
- **Игры:** Низкий cwnd = низкая задержка, но меньше throughput
Предварительные знания
Зачем нужен Congestion Control
**Congestion Control** (контроль перегрузки) - механизм, не позволяющий отправителю перегружать сеть. В отличие от flow control (защита получателя), congestion control защищает роутеры и каналы связи между ними.
TCP использует **implicit feedback**: потеря пакета или рост задержки означают перегрузку. Явного сигнала от роутеров нет (в отличие от ECN). Отправитель сам делает выводы.
**Flow Control vs Congestion Control:** Flow control - rwnd (receive window) от получателя. Congestion control - cwnd (congestion window) у отправителя. Реальное окно = min(rwnd, cwnd).
Что защищает congestion control?
Slow Start - медленный старт
**Slow Start** - начальная фаза TCP-соединения. Название обманчиво: рост экспоненциальный! Окно удваивается каждый RTT, пока не случится потеря или не достигнут порог (ssthresh).
**IW (Initial Window):** Раньше - 1 MSS. Сейчас RFC 6928 рекомендует IW=10 MSS (~14 КБ). Это ускоряет загрузку небольших веб-страниц, которые могут передаться за 1 RTT.
Как растёт cwnd в фазе Slow Start?
AIMD - Additive Increase, Multiplicative Decrease
**AIMD** - основной алгоритм congestion control после slow start. Additive Increase: окно растёт линейно (+1 MSS за RTT). Multiplicative Decrease: при потере окно уменьшается вдвое.
**Triple Duplicate ACK:** 3 одинаковых ACK подряд = Fast Retransmit + Fast Recovery. cwnd делится пополам, но не сбрасывается до 1. Timeout (более серьёзная проблема) сбрасывает cwnd до 1 и запускает Slow Start заново.
Что происходит с cwnd при потере пакета в AIMD?
Congestion Window (cwnd)
**cwnd** (Congestion Window) - окно перегрузки, поддерживаемое отправителем. В отличие от rwnd (от получателя), cwnd - оценка состояния сети самим отправителем. Эффективное окно = min(cwnd, rwnd).
**ssthresh (Slow Start Threshold):** Граница между Slow Start и Congestion Avoidance. При потере: ssthresh = cwnd/2. Следующий Slow Start продолжится только до ssthresh.
Чему равно эффективное окно отправки?
Варианты TCP: Reno, Cubic, BBR
Классический AIMD (TCP Reno) - не единственный алгоритм. Современные варианты: **TCP Cubic** (Linux по умолчанию), **BBR** (Google) - оптимизированы для разных сценариев.
**BBR (Bottleneck Bandwidth and RTT):** Вместо реакции на потери, BBR строит модель сети: измеряет max bandwidth и min RTT. Поддерживает inflight = BDP. Работает лучше при случайных потерях (Wi-Fi).
TCP всегда работает одинаково
Существует множество алгоритмов congestion control, каждый со своими преимуществами
Сети разные: спутник с RTT 600 мс, мобильный интернет с потерями, датацентр с 0.1 мс. Один алгоритм не оптимален везде. Поэтому Linux позволяет выбирать: Cubic, BBR, Reno.
Какой алгоритм congestion control используется в Linux по умолчанию?
Ключевые идеи
- **Congestion Control** - защита сети от перегрузки
- **Slow Start** - экспоненциальный рост cwnd до порога
- **AIMD** - линейный рост, мультипликативное снижение при потере
- **cwnd** - окно перегрузки; effective = min(cwnd, rwnd)
Связанные темы
Congestion control - сердце производительности TCP:
- TCP Flow Control — Другое ограничение - защита получателя
- QUIC — Congestion control на уровне приложения
- Buffer Bloat — Когда большие буферы ломают congestion signals
Вопросы для размышления
- Почему timeout хуже triple duplicate ACK?
- Как BBR определяет bandwidth без потерь?
- Почему два TCP-потока с разными RTT несправедливо делят канал?