tgoop.com/troubleperf/59
Create:
Last Update:
Last Update:
Алгоритмы управления потоком (Flow Control) в TCP служат для предотвращения перегрузки сети и потерь данных.
Исследования в этой области не прекращаются и на сегодня нам доступно множество вариантов:
* Reno
(1986)
* New Reno
(1999)
* CUBIC
(2004)
* FAST TCP
(2005)
* BBRv1
(2016)
* BBRv2
(2019)
* BBRv3
(2023)
* ...
По умолчанию в Linux используется CUBIC
. Однако создатели BBR (Google) выкладывают любопытные исследования, где резюмируют:
BBR enables big throughput improvements on high-speed, long-haul links...
BBR enables significant reductions in latency in last-mile networks that connect users to the internet...
Так может нам просто переехать на новые рельсы?
Хотя кажется правильнее поставить вопрос по другому: в каких случаях какой алгоритм может быть предпочтительнее?
————
Алгоритмы Flow Control можно условно разделить на два типа:
1. Loss-based (ориентированы на потери пакетов):
Reno
, NewReno
, CUBIC
2. Delay-based (ориентированы на изменения RTT):
FAST TCP
, BBRv*
Основная цель любой реализации Flow Control — максимально эффективно использовать пропускную способность канала, сохраняя баланс между скоростью передачи данных и предотвращением перегрузок.
Скорость регулируется через Congestion Window (окно перегрузки) — сколько данных можно отправить без получения подтверждения.
Разница между подходами к контролю перегрузки заключается в методах её определения.
Loss-based (CUBIC)
Алгоритмы этого типа оценивают перегрузку по потерям пакетов.
Пришел дублирующий ACK или сработал Retransmission Timeout (RTO)? Значит есть потери и следовательно канал перегружен - снижаем скорость.
Затем ориентируясь на поступающие ACK, скорость увеличивается, пока не обнаружатся новые потери.
Такой подход может забивать очереди в канале до предела, что и будет приводить к потерям. Реакция носит реактивный характер: перегрузка фиксируется только после её возникновения.
Delay-based (BBR)
В Delay-based алгоритмах, таких как BBR, перегрузка оценивается на основе изменения задержек:
* минимальный RTT (
RTT_min
) принимается за эталон;* если текущий RTT (
RTT_now
) превышает RTT_min
, алгоритм предполагает, что канал перегружен, и снижает скорость передачи данных.Таким образом, BBR стремится избегать заполнения очередей, что позволяет сократить задержки.
Его подход более превентивный: предотвращение перегрузки до её появления.
————
CUBIC
проигрывает BBR
в сетях с высоким RTT, например, в интернете. Это происходит из-за медленного роста скорости после обнаружения потерь: ACK приходят с задержкой.Внутри дата-центров, где RTT низкий,
CUBIC
должен справляться лучше - быстрые ACK ускоряют рост скорости передачи данных.BBR
же в таких сетях может не дать преимуществ. При всплесках трафика он снижает скорость, чтобы избежать заполнения очередей, из-за чего канал используется не полностью. Кроме того, возможны конфликты между алгоритмами, когда та или иная реализация будет захватывать пропусную способность, вытесняя другие. Настоящие войны)Вообщем как обычно надо быть осторожее!
Почитать:
- https://blog.apnic.net/2017/05/09/bbr-new-kid-tcp-block/
- https://book.systemsapproach.org/congestion.html
- https://tcpcc.systemsapproach.org/
tags: #network #tcp
BY Performance matters!

Share with your friend now:
tgoop.com/troubleperf/59