Flow control — это набор приёмов, которые не дают отправителю «залить» приёмник данными быстрее, чем тот способен их обработать. Идея проста: если где-то на пути буферы заполняются, нужно притормозить источник — локально на канале связи или сквозь весь путь.
Где встречается
- Транспортный уровень: в TCP получатель регулирует скорость через скользящее окно (rwnd), а стек ограничивает отправителя ещё и своим cwnd (это уже про перегрузку сети).
- Канальный уровень (Ethernet): кадры 802.3x PAUSE (пауза для всего порта) и PFC 802.1Qbb (пауза по приоритету/классу).
- Специальные технологии: credit-based в Fibre Channel/InfiniBand; в Wi-Fi — свои MAC-механики и управление скоростью/повторами.
Два подхода
- Сквозной (end-to-end): TCP-приёмник уменьшает окно — отправитель шлёт меньше. Плюсы: работает через любые маршруты. Минусы: реакция не мгновенная, «микровсплески» могут успеть забить промежуточные буферы.
- Пошаговый (hop-by-hop): коммутатор/порт даёт сигнал «стоп/меньше» соседу (PAUSE/PFC, кредиты). Плюсы: мгновенно спасает буферы. Минусы: риск побочных эффектов на других потоках.
Ключевые механизмы в практике
- TCP окно (rwnd) + Window Scaling: приёмник сообщает, сколько байт готов принять; расширение окна нужно на высоких скоростях/дальних RTT.
- ECN (явное уведомление о перегрузке): вместо потерь помечаются пакеты; отправитель снижает скорость. Хороший компаньон к TCP-контролю перегрузки.
- 802.3x PAUSE: «заморозить всё» на порту. Просто, но может вызвать pause-storm и задержать посторонние классы трафика.
- PFC (Priority Flow Control): пауза только для выбранных приоритетов/CoS/DSCP — применяют там, где нужен «почти без потерь» класс (например, RoCEv2/RDMA), чтобы не ломалась латентность. Требует аккуратной настройки, чтобы избежать deadlock.
Когда это нужно
- Линки с асимметрией скоростей (10G → 1G), где легко переполнить медленный буфер.
- Микроберсты на коммутаторах в ЦОДе.
- Трафик, чувствительный к потерям и задержкам (RDMA, iSCSI, биржевые шины, телеметрия в реальном времени).
Подводные камни
- PAUSE мешает «невиновным» потокам: один шумный класс может остановить весь порт.
- PFC при неверных буферах/очередях ведёт к head-of-line blocking и «взаимным паузам».
- Чисто «сквозной» контроль (только TCP) не спасает от локальных всплесков на промежуточных устройствах.
- Отсутствие AQM (FQ-CoDel/RED/CAKE) приводит к bufferbloat — большой джиттер даже без потерь.
Практические рекомендации (кратко)
- Начинайте со сквозного: актуальные TCP-алгоритмы, ECN, разумные очереди + AQM.
- PFC включайте точечно и только для действительно «lossless» классов; проверяйте буферы и карты очередей.
- Избегайте общего PAUSE на магистралях; лучше QoS + шейпинг на границах.
- Проверяйте MTU/MSS, чтобы не плодить фрагментацию и «чёрные дыры» PMTU.
- Мониторьте очереди/дропы/ECN-метки; используйте sFlow/NetFlow, счетчики ASIC и тесты под нагрузкой (iperf3).