Управление потоком и затухание
Тема дорожной карты · Компьютерные сети
Управление потоком и контроль затопления — это ключевые механизмы, используемые в компьютерных сетях для управления скоростью передачи данных и предотвращения перегрузки сети. Эти механизмы необходимы для обеспечения эффективной передачи данных и поддержания стабильности сети. Они играют важную роль в обеспечении надежности и производительности сетевых соединений, особенно при передаче больших объемов данных.
Как это работает
Управление потоком и затухание реализуется через транспортные протоколы, такие как TCP и UDP. TCP (Transmission Control Protocol) — это ориентированный на соединение протокол, который обеспечивает надежную, упорядоченную передачу данных. TCP использует механизмы управления потоком и контроля затухания для адаптации к текущим условиям сети. Слайдинг окно (sliding window) используется для управления потоком, в то время как алгоритмы контроля затухания, такие как Reno, Cubic и BBR, адаптируют пропускную способность к текущим условиям сети.
UDP (User Datagram Protocol) — это протокол, не ориентированный на соединение, который обеспечивает быструю передачу данных без гарантий доставки. UDP хорошо подходит для приложений, где потерянные данные не критичны, например, для передачи видео или данных в реальном времени.
Трехсторонний обмен (three-way handshake) используется для установления TCP-соединения. Этот процесс включает в себя обмен синхронизационными сообщениями (SYN) и подтверждениями (ACK) между отправителем и получателем. После установления соединения управление потоком и контроль затухания позволяют адаптировать скорость передачи данных к текущим условиям сети.
QUIC (Quick UDP Internet Connections) — это новый протокол, который использует UDP для обеспечения надежной передачи данных, подобной TCP, но при этом обеспечивает быстрое установление соединения и возможность немедленного восстановления соединения после перерыва (0-RTT resumption). QUIC особенно полезен для мобильных устройств, где высокая задержка TCP-соединения может быть критичной.
Когда применять
TCP обычно используется для большинства приложений, таких как HTTP, SSH и соединения с базами данных. TCP обеспечивает надежную и упорядоченную передачу данных, что делает его идеальным выбором для большинства приложений.
UDP используется в ситуациях, когда можно потерпеть потери данных, например, для передачи видео или данных в реальном времени. UDP также используется, когда разработчики реализуют собственную надежность, как в случае с QUIC или DNS. UDP также может быть предпочтительным, если задержка TCP-соединения неприемлема.
Современный Linux по умолчанию использует алгоритм Cubic для контроля затухания, который хорошо работает в большинстве сетей. Однако для длинных и толстых каналов (long-fat networks) алгоритм BBR может быть более эффективным, так как он лучше справляется с высоким коэффициентом заполнения буфера (high BDP).
Для новых публичных сервисов рекомендуется поддерживать QUIC (HTTP/3), так как он обеспечивает более быструю передачу данных на мобильных устройствах и уменьшает проблему head-of-line blocking в HTTP/2.
Типичные ошибки
Типичные ошибки при использовании управления потоком и контроля затухания включают использование UDP для надежной передачи данных без собственного механизма повторной передачи (retransmission), что может привести к потере данных. Другой ошибкой может быть недостаточное настройка размеров буферов TCP для длинных и толстых каналов, что может ограничить пропускную способность. Также часто встречаются слишком короткие таймауты TCP, которые могут привести к ложным закрытиям соединений при пиковых нагрузках. Наконец, игнорирование проблемы head-of-line blocking в HTTP/2 поверх TCP может привести к снижению производительности, что решается переходом на HTTP/3.