Алгоритм ведра токенов
Алгоритм ведра токенов (англ. token bucket algorithm) — это алгоритм контроля трафика, используемый в компьютерных сетях и телекоммуникационных системах для управления скоростью передачи данных и обеспечения соблюдения согласованных параметров трафика (пропускной способности и профиля нагрузки). Относится к классу алгоритмов профилирования трафика и часто применяется совместно с алгоритмом «дырявого ведра» (leaky bucket). Основная функция — ограничение средней скорости передачи данных до заданного значения (committed information rate, CIR) при допустимых кратковременных всплесках (bursts), не превышающих заданный размер «ведра» (bucket size).
Принцип работы
Алгоритм моделирует виртуальное ведро, в которое с постоянной скоростью (R) капают «токены». Каждый токен даёт право на передачу одного байта (или одного пакета — в зависимости от реализации) данных. Если ведро заполнено, избыточные токены отбрасываются. При поступлении данных для отправки алгоритм проверяет, достаточно ли токенов в ведре. Если да — данные передаются, а соответствующее количество токенов изымается из ведра. Если нет — данные либо ставятся в очередь (буферизируются), либо отбрасываются (в зависимости от политики QoS — качества обслуживания).
Параметры алгоритма
- Скорость пополнения токенов (R) — задаёт среднюю скорость передачи данных (например, 1 Мбит/с). Измеряется в токенах в секунду.
- Размер ведра (B) — максимальное количество токенов, которое может накопиться. Определяет максимальный размер всплеска (burst size), который может быть передан мгновенно. Измеряется в байтах или битах.
- Текущее количество токенов (T) — переменная, изменяющаяся во времени. Начальное значение обычно равно B (ведро полностью заполнено).
Динамика работы
- Токены добавляются в ведро с постоянной скоростью R токенов в секунду. Если ведро заполнено (T = B), новые токены отбрасываются.
- При поступлении пакета размером S байт:
- Если T >= S, пакет передаётся, и T уменьшается на S.
- Если T < S, пакет задерживается или отбрасывается (режим «strict policing»), либо может быть передан с пониженным приоритетом (режим «shaping»).
Математическая модель
Изменение количества токенов за время Δt описывается выражением:
T(t + Δt) = min(B, T(t) + R Δt - S N(t))
где N(t) — количество переданных пакетов за время Δt.
Отличие от алгоритма «дырявого ведра»
Оба алгоритма часто путают, но они решают разные задачи:
- Дырявое ведро (leaky bucket) — жёстко ограничивает скорость передачи, сглаживая всплески. Ведро имеет отверстие, через которое «вытекают» данные с постоянной скоростью. Избыточные пакеты отбрасываются или ставятся в очередь. Поток на выходе всегда равномерный.
- Ведро токенов — допускает кратковременные всплески, если в ведре накопились токены. Поток на выходе может быть неравномерным, но средняя скорость не превышает R.
На практике алгоритм ведра токенов часто комбинируют с дырявым ведром для обеспечения как средней скорости, так и сглаживания пиков.
Применение
В компьютерных сетях
- QoS (Quality of Service) — в маршрутизаторах и коммутаторах для ограничения трафика по классам обслуживания. Например, в протоколе DiffServ (Differentiated Services) алгоритм используется для маркировки пакетов (in-profile / out-of-profile) и последующей обработки (отбрасывание, понижение приоритета).
- Traffic shaping — в устройствах, поддерживающих shaping (например, Cisco, Juniper, Linux tc). Позволяет ограничить скорость исходящего трафика, сохраняя возможность кратковременных всплесков.
- Policing — в отличие от shaping, policing отбрасывает избыточные пакеты, не буферизируя их. Часто используется на границе сети (например, у провайдера).
В телекоммуникациях
- ATM (Asynchronous Transfer Mode) — алгоритм ведра токенов (в виде «Generic Cell Rate Algorithm», GCRA) используется для контроля трафика на уровне ячеек (cells). GCRA является стандартом ITU-T (I.371) и ATM Forum.
- Мобильные сети (3G/4G/5G) — для управления скоростью передачи данных абонентов (например, ограничение скорости после превышения лимита).
В облачных и веб-сервисах
- Rate limiting — ограничение количества запросов от одного IP-адреса или пользователя. Например, API-шлюзы (Nginx, Kong, AWS API Gateway) используют алгоритм ведра токенов для реализации политик «100 запросов в минуту, с возможностью пика до 200».
- Аренда ресурсов — в облачных платформах (AWS, Azure) для контроля пропускной способности виртуальных машин и дисковых операций (IOPS).
В операционных системах
- Linux Traffic Control (tc) — реализация алгоритма через дисциплину обслуживания очереди (qdisc)
tbf(Token Bucket Filter). Позволяет ограничить скорость передачи данных на сетевом интерфейсе. - FreeBSD и другие Unix-системы — аналогичные механизмы (dummynet, altq).
Варианты и модификации
Двухскоростное ведро токенов (Two-Rate Token Bucket)
Использует две скорости пополнения:
- Committed Information Rate (CIR) — гарантированная средняя скорость.
- Peak Information Rate (PIR) — максимальная пиковая скорость.
Соответственно, два ведра — для CIR и PIR. Пакеты классифицируются на три категории:
- «Зелёные» — в пределах CIR.
- «Жёлтые» — между CIR и PIR.
- «Красные» — превышают PIR (отбрасываются или маркируются).
Применяется в протоколах MPLS и DiffServ для обеспечения многоуровневого QoS.
Трёхцветное ведро (Three-Color Token Bucket)
Развитие двухскоростного подхода, описанное в RFC 2697 (Single Rate Three Color Marker) и RFC 2698 (Two Rate Three Color Marker). Позволяет маркировать пакеты тремя цветами (зелёный, жёлтый, красный) для последующей обработки.
Реализация в программном обеспечении
Пример на псевдокоде
``` class TokenBucket: def __init__(self, rate, burst): self.rate = rate # токенов в секунду self.burst = burst # максимальное количество токенов self.tokens = burst # текущее количество токенов self.last_time = now() # время последнего обновления
def consume(self, tokens):
Пополнение токенов с момента последнего вызова
elapsed = now() - self.last_time self.tokens = min(self.burst, self.tokens + elapsed * self.rate) self.last_time = now()
if self.tokens >= tokens: self.tokens -= tokens return True # разрешено else: return False # отклонено ```
Реализация в Linux tc (qdisc tbf)
Команда для ограничения скорости до 1 Мбит/с с возможностью всплеска до 10 Кбайт:
`` tc qdisc add dev eth0 root tbf rate 1mbit burst 10kbit latency 50ms ``
Критика и ограничения
- Чувствительность к точности таймера — алгоритм требует точного отсчёта времени для пополнения токенов. В высокоскоростных сетях (10 Гбит/с и выше) погрешности могут привести к неточному ограничению.
- Проблема «голодания» (starvation) — при постоянной высокой нагрузке ведро может опустошаться, и все последующие пакеты будут отбрасываться, пока токены не накопятся. Это может быть проблемой для чувствительных к задержкам приложений (VoIP, видеоконференции).
- Необходимость буферизации — в режиме shaping требуется память для очереди, что может увеличить задержку (jitter).
- Сложность настройки — для эффективной работы требуется правильный подбор параметров R и B в зависимости от характера трафика.
Источники
- Andrew S. Tanenbaum, David J. Wetherall. «Computer Networks» (5th Edition). — Pearson, 2011.
- RFC 2697 — «A Single Rate Three Color Marker».
- RFC 2698 — «A Two Rate Three Color Marker».
- ITU-T Recommendation I.371 — «Traffic control and congestion control in B-ISDN».
- Linux Advanced Routing & Traffic Control HOWTO (LARTC).
- Cisco IOS Quality of Service Solutions Configuration Guide.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →