Компьютерные сети
TCP: управление потоком
Представьте: сервер с SSD на 10 гигабит отправляет данные вашему ноутбуку на слабом Wi-Fi. Без flow control ваш буфер переполнился бы за миллисекунды, пакеты терялись бы толпами. Sliding window - лаконичное решение: получатель сам говорит, сколько готов принять.
- **Загрузка файлов:** сервер адаптируется к скорости вашего соединения
- **Стриминг:** буфер видеоплеера сообщает серверу, когда притормозить
- **Базы данных:** медленный клиент не блокирует быстрый сервер
Предварительные знания
Зачем нужен Flow Control
**Flow Control** (управление потоком) - механизм, не позволяющий быстрому отправителю переполнить буфер медленного получателя. Проблема: сервер на гигабите → клиент на мобильном 3G.
Flow control работает **end-to-end** между отправителем и получателем. Это отличается от congestion control, который следит за состоянием **сети** между ними.
**Flow Control ≠ Congestion Control:** Flow control защищает получателя от переполнения. Congestion control защищает сеть от перегрузки. Оба ограничивают скорость, но по разным причинам.
Что защищает flow control?
Sliding Window - скользящее окно
**Sliding Window** - механизм, позволяющий отправлять несколько сегментов без ожидания ACK на каждый. Окно «скользит» вперёд по мере получения подтверждений.
**BDP (Bandwidth-Delay Product):** Оптимальный размер окна = пропускная способность × RTT. Для 100 Мбит/с и RTT 50 мс: 100,000,000 × 0.05 = 5,000,000 бит = 625 КБ.
Зачем нужно sliding window?
Receive Window - окно получателя
**Receive Window (rwnd)** - размер свободного буфера получателя. Передаётся в каждом TCP-сегменте в поле Window. Отправитель не может отправить больше данных, чем rwnd.
**Window Scale option:** 16 бит Window ограничивают окно до 64 КБ - мало для быстрых сетей. TCP опция Window Scale (до 14) умножает Window на 2^scale. Результат: окно до 1 ГБ.
Что сообщает поле Window в TCP-заголовке?
Zero Window и Probe
**Zero Window** - ситуация, когда получатель сообщает Window=0. Буфер полон, места нет. Отправитель должен остановиться и ждать, пока получатель не освободит место.
**Persist Timer:** После получения Zero Window отправитель запускает таймер. По истечении отправляет Probe (ZWP). Интервал растёт экспоненциально (1, 2, 4, 8... сек), максимум 60 сек. Это предотвращает deadlock.
Zero Window означает проблему в сети
Zero Window - нормальный механизм flow control, означает что получатель временно не успевает
Получатель может медленно обрабатывать данные (запись на диск, сложные вычисления). TCP адаптируется через flow control. Это не ошибка, а штатная работа протокола.
Что делает отправитель при получении Window=0?
Ключевые идеи
- **Flow Control** - защита получателя от переполнения буфера
- **Sliding Window** - отправка нескольких сегментов без ожидания ACK на каждый
- **Receive Window (rwnd)** - текущий размер свободного буфера в каждом ACK
- **Zero Window Probe** - механизм выхода из deadlock при Window=0
Связанные темы
Flow control - одна сторона управления скоростью в TCP:
- TCP Congestion Control — Защита сети от перегрузки (другое ограничение)
- TCP Basics — Основы: handshake, seq/ack
- Buffer Bloat — Когда большие буферы создают проблемы
Вопросы для размышления
- Почему 16-битного Window недостаточно для современных сетей?
- Как определить, что проблема в flow control, а не в congestion?
- Что произойдёт, если убрать механизм Zero Window Probe?
Связанные уроки
- net-15-tcp-basics — Flow control строится поверх базового TCP
- net-17-tcp-congestion — Congestion control - следующий уровень управления потоком
- net-24-http2-http3 — HTTP/2 stream multiplexing управляет flow control
- net-37-load-balancing — LB управляет потоком запросов как TCP управляет потоком байт
- net-47-container-networking — Container network namespace наследует TCP flow control
- alg-27-sliding-window — TCP receive window - это sliding window algorithm на практике
- alg-20-greedy