Компьютерные сети

TCP: управление потоком

Представьте: сервер с SSD на 10 гигабит отправляет данные вашему ноутбуку на слабом Wi-Fi. Без flow control ваш буфер переполнился бы за миллисекунды, пакеты терялись бы толпами. Sliding window - лаконичное решение: получатель сам говорит, сколько готов принять.

  • **Загрузка файлов:** сервер адаптируется к скорости вашего соединения
  • **Стриминг:** буфер видеоплеера сообщает серверу, когда притормозить
  • **Базы данных:** медленный клиент не блокирует быстрый сервер

Предварительные знания

  • TCP: reliable delivery

Зачем нужен 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
TCP: управление потоком

0

1

Войти