Token bucket — это алгоритм, используемый в сетях с коммутацией пакетов и телекоммуникационных сетях . Его можно использовать для проверки того, что передача данных в виде пакетов соответствует определенным ограничениям по полосе пропускания и пульсации (мера неравномерности или вариаций в потоке трафика ). Его также можно использовать в качестве алгоритма планирования для определения времени передач, которые будут соответствовать ограничениям, установленным для полосы пропускания и пульсации: см. сетевой планировщик .
Алгоритм token bucket основан на аналогии с фиксированной емкостью bucket , в который токены , обычно представляющие единицу байтов или один пакет предопределенного размера, добавляются с фиксированной скоростью. Когда пакет должен быть проверен на соответствие определенным ограничениям, bucket проверяется, содержит ли он достаточно токенов в данный момент. Если это так, соответствующее количество токенов, например, эквивалентное длине пакета в байтах, удаляется («обналичивается»), и пакет передается, например, для передачи. Пакет не соответствует, если в bucket недостаточно токенов, а содержимое bucket не изменяется. Несоответствующие пакеты можно обрабатывать различными способами:
Таким образом, поток соответствия может содержать трафик со средней скоростью вплоть до скорости, с которой токены добавляются в ведро, и иметь всплеск, определяемый глубиной ведра. Этот всплеск может быть выражен либо в терминах допуска джиттера, т. е. насколько раньше пакет может соответствовать (например, прибыть или быть переданным), чем можно было бы ожидать от ограничения на среднюю скорость, либо допуска всплеска или максимального размера всплеска, т. е. насколько больше среднего уровня трафика может соответствовать за некоторый конечный период.
Концептуально алгоритм токен-ведра можно понять следующим образом:
Реализаторы этого алгоритма на платформах, не имеющих разрешения часов, необходимого для добавления одного токена в ведро каждые секунды, могут рассмотреть альтернативную формулировку. Учитывая возможность обновления ведра токенов каждые S миллисекунд, количество токенов для добавления каждые S миллисекунд = .
В долгосрочной перспективе выход соответствующих пакетов ограничен скоростью передачи токенов, .
Пусть — максимально возможная скорость передачи в байтах/секунду.
Затем следует максимальное время импульса, то есть время, в течение которого скорость используется полностью.
Максимальный размер пакета, таким образом, составляет
Токен-корзина может использоваться как при формировании трафика , так и при управлении трафиком . При управлении трафиком несоответствующие пакеты могут быть отброшены (сброшены) или их приоритет может быть снижен (для того, чтобы функции управления нисходящим трафиком отбрасывали их в случае перегрузки). При управлении трафиком пакеты задерживаются до тех пор, пока они не будут соответствовать. Управление трафиком и управление трафиком обычно используются для защиты сети от избыточного или чрезмерно пульсирующего трафика, см. Управление полосой пропускания и предотвращение перегрузки . Управление трафиком обычно используется в сетевых интерфейсах хостов для предотвращения отбрасывания передач функциями управления трафиком в сети.
Алгоритм token bucket также используется для управления потоком ввода-вывода базы данных. [1] В нем ограничение не применяется ни к IOPS, ни к пропускной способности, а скорее к линейной комбинации того и другого. Определяя токены как нормализованную сумму веса запроса ввода-вывода и его длины, алгоритм гарантирует, что производная по времени вышеупомянутой функции останется ниже необходимого порога.
Алгоритм ведра токенов напрямую сопоставим с одной из двух версий алгоритма дырявого ведра , описанных в литературе. [2] [3] [4] [5] Эта сопоставимая версия дырявого ведра описана на соответствующей странице Википедии как алгоритм дырявого ведра как счетчик . Это зеркальное отражение ведра токенов, в котором соответствующие пакеты добавляют жидкость, эквивалентную токенам, удаленным соответствующим пакетом в алгоритме ведра токенов, в ведро конечной емкости, из которого эта жидкость затем сливается с постоянной скоростью, эквивалентной процессу, в котором токены добавляются с фиксированной скоростью.
Однако существует и другая версия алгоритма дырявого ведра [3] , описанная на соответствующей странице Википедии как алгоритм дырявого ведра как очередь . Это особый случай дырявого ведра как счетчика, который можно описать соответствующими пакетами, проходящими через ведро. Дырявое ведро как очередь, таким образом, применимо только к формированию трафика и, в общем случае, не допускает, чтобы поток выходных пакетов был пульсирующим, т. е. он свободен от джиттера. Поэтому он существенно отличается от алгоритма токенового ведра.
Эти две версии алгоритма дырявого ведра были описаны в литературе под одним и тем же названием. Это привело к значительной путанице в свойствах этого алгоритма и его сравнении с алгоритмом токенового ведра. Однако, по сути, эти два алгоритма одинаковы и, если они реализованы правильно и заданы теми же параметрами, будут видеть одни и те же пакеты как соответствующие и несоответствующие.
Иерархическая корзина токенов (HTB) — это более быстрая замена дисциплины очередей на основе классов (CBQ) в Linux . [6] Она полезна для ограничения скорости загрузки / выгрузки каждого клиента , чтобы ограниченный клиент не мог перегрузить общую полосу пропускания.
Концептуально HTB представляет собой произвольное количество токен-корзин, организованных в иерархию. Первичная дисциплина выходной очереди ( qdisc ) на любом устройстве известна как корневой qdisc. Корневой qdisc будет содержать один класс. Этот единственный класс HTB будет установлен с двумя параметрами: rate и ceil . Эти значения должны быть одинаковыми для класса верхнего уровня и будут представлять общую доступную пропускную способность на канале.
В HTB rate означает гарантированную пропускную способность, доступную для данного класса, а ceil (сокращение от ceiling) указывает максимальную пропускную способность, которую классу разрешено потреблять. Когда класс запрашивает пропускную способность, превышающую гарантированную, он может заимствовать пропускную способность у своего родителя, пока оба ceil не будут достигнуты. Hierarchical Token Bucket реализует механизм очередей классов для системы управления трафиком Linux и предоставляет rate и ceil, чтобы позволить пользователю контролировать абсолютную пропускную способность для определенных классов трафика, а также указывать соотношение распределения пропускной способности, когда становится доступной дополнительная пропускная способность (до ceil).
При выборе полосы пропускания для класса верхнего уровня формирование трафика помогает только в узком месте между локальной сетью и Интернетом. Обычно это касается домашних и офисных сетевых сред, где вся локальная сеть обслуживается соединением DSL или T1 .