СИНТАКСИС
tc qdisc [ add | change | replace | link ] dev УСТРОЙСТВО [ parent qdisc-id | root ] [ handle qdisc-id ] qdisc [ параметры qdisc ]
tc class [ add | change | replace ] dev УСТРОЙСТВО parent qdisc-id [ classid class-id ] qdisc [ параметры qdisc ]
tc filter [ add | change | replace ] dev УСТРОЙСТВО [ parent qdisc-id | root ] protocol protocol prio priority filtertype [ параметры filtertype ] flowid flow-id
tc [-s | -d ] qdisc show [ dev УСТРОЙСТВО ] tc [-s | -d ] class show dev УСТРОЙСТВО tc filter show dev УСТРОЙСТВО
ОПИСАНИЕ
Tc используется для настройки системы контроля трафика (Traffic Control) ядра Linux. Система контроля трафика состоит из:
ОГРАНИЧЕНИЕ ИСХОДЯЩЕГО ТРАФИКА (SHAPING)
Когда трафик сформирован, его полоса пропускания начинает контролироваться. Ограничение может дать больше, чем уменьшение полосы пропускания - оно также используется для сглаживания пиков для более прогнозируемого поведения сети.
ПЛАНИРОВАНИЕ (SCHEDULING)
Планирование передачи пакетов позволяет увеличить интерактивность исходящего трафика при гарантировании полосы пропускания для передачи данных большого объема. Такое упорядочение также называется приоритезацией и применяется для исходящего трафика.
ОГРАНИЧЕНИЕ ВХОДЯЩЕГО ТРАФИКА (POLICING)
механизм, с помощью которого можно ограничить количество пакетов или байт в потоке входящего трафика, соответствующих определенной классификации.
ОТБРАСЫВАНИЕ (DROPPING)
Трафик, превышающий установленную полосу пропускания, может быть отброшен как для входящего, так и исходящего трафика.
Обработка трафика контролируется тремя типами объектов: очередями (qdiscs), классами и фильтрами.
ОЧЕРЕДИ (QDISCS)
qdisc - сокращение от 'queueing discipline' (дисциплина очередности) и является базовым для понимания контроля трафика. Всякий раз, когда ядру требуется отправить пакет на интерфейс, этот пакет ставится в очередь к qdisc, настроенный для этого интерфейса. Сразу же после этого ядро пытается получить сколько можно пакетов из qdisc для передачи их драйверу сетевого адаптера.
Простейший QDISC является очередью 'pfifo' без обработки, лишь реализующей принцип 'First In, First Out' (первый вошел - первый вышел). Однако он сохраняет трафик в очереди, если сетевой интерфейс не может обработать данные сразу же.
КЛАССЫ (CLASSES)
Некоторые очереди (qdiscs) могут содержать классы, содержащие дополнительные очереди: трафик может быть поставлен в очередь внутренних очередей в рамках классов. Когда ядро пытается взять пакет из такой очереди с классами , он может прийти из любого класса. Очередь, например, может установить приоритет трафика, считывая пакеты из одних очередей раньше, чем из других.
ФИЛЬТРЫ (FILTERS)
A Фильтр используется в очереди с классами для определения, в какой класс поставить пакет. Всякий раз, когда трафик приходит в класс с подклассами, он нуждается в классификации. Для этого используются различные методы, один из которых - фильтрация. Вызываются все фильтры, связанные с этим классом, пока один из них не вернёт решение. Если решение не принято, могут быть использованы другие критерии. Это зависит от очереди.
Очень важно понимать, что фильтры в очередях не возвращают решений.
БЕЗКЛАССОВЫЕ ОЧЕРЕДИ (CLASSLESS QDISCS)
Бесклассовые очереди:
[p|b]fifo
Простейшие очереди без обработки, лишь реализующие принцип 'First In, First Out' (первый вошел - первый вышел). Ограничены в пакетах или байтах.
pfifo_fast
Стандартная очередь ядра с 'расширенным роутером'. Состоит из очереди с тремя потоками, учитывающей флаги типа услуги (Type of Service) и приоритет пакета.
red
Random Early Detection (случайное раннее обнаружение) симулирует физический затор, отбрасывая пакеты случайным образом при близком достижении заданной полосы пропускания. Хорошо подходит для приложений, требующих очень широкую полосу пропускания.
sfq
Stochastic Fairness Queueing (очередь равномерного случайного распределения пакетов) реорганизует трафик в очереди таким образом, что каждый 'сеанс' ('session', виртуальная подочередь) получает право отправить пакет, а маркер переходит на следующий сеанс.
tbf
Token Bucket Filter (фильтр буфера токенов) удерживает скорость передачи пакетов на примерно постоянном уровне (меньшем, чем реальная скорость интерфейса). Хорошо масштабируется для широких каналов.
НАСТРОЙКА БЕЗКЛАССОВЫХ ОЧЕРЕДЕЙ (CLASSLESS QDISCS)
Безклассовые очереди могут назначаться только на входе (root) устройства. Полный синтаксис: tc qdisc add dev УСТРОЙСТВО root QDISC ПАРАМЕТРЫ_QDISC
Для удаления очереди выполните tc qdisc del dev УСТРОЙСТВО root
Очередь pfifo_fast назначается автоматически при отсутствии настроенной очереди.
ОЧЕРЕДИ С КЛАССАМИ (CLASSFUL QDISCS)
Очереди с классами:
CBQ
Очередь, базирующая на классах (Class Based Queueing) реализует мощную иерархию классов. Поддерживает ограничения и приоритеты. Разделение осуществляется по времени простоя канала, вычисляемого на основании среднего размера пакета и полосы пропускания.
HTB
Очередь HTB (Hierarchy Token Bucket - иерархический буфер токенов) реализует мощную иерархию классов с упором на согласование с существующей практикой. HTB обеспечивает гарантированную полосу пропускания для классов, также позволяет устанавливать верхние пределы межклассового разделения очереди. Содержит объекты ограничения, базирующиеся на TBF, и может устанавливать приоритеты для классов.
PRIO
Очередь PRIO может разделять трафик между тремя полосами, которые являются очередями любого типа. При извлечении пакета из очереди вначале исследуется подочередь с большим приоритетом, если в последней нет пакетов для обработки, то выбирается очередь с более низким приоритетом и.т.д.. Для установки приоритета используются биты типа услуги (Type Of Service).
ТЕОРИЯ
Классы формируют дерево, где каждый класс имеет своего родителя и может содержать несколько дочерних классов. Некоторые типы очередей позволяют добавлять классы во время выполнения (CBQ, HTB), в то время как другие (PRIO) создаются с фиксированным набором дочерних классов).
Очереди с динамическим добавлением классов могут иметь от нуля до нескольких подклассов.
Кроме того, каждый класс содержит очередь класса (leaf qdisc) (по умолчанию это очередь pfifo )хотя может быть назначена очередь другого типа. Эта очередь может содержать классы, но у каждого класса может быть только одна очередь.
Когда пакет попадает в очередь с классами, он классифицируется для помещения в один из классов. Доступны три критерия классификации, но не все очереди используют все три критерия::
фильтр управления трафиком (tc filter)
Если классу назначены фильтры управления трафиком, они рассматриваются первыми. Фильтры могут назначаться на любое поле в заголовке пакета также как и в цепочках брандмауэра ipchains или iptables. См. tc-filters(8).
тип услуги (Type of Service)
Некоторые очереди имеют встроенные правила классификации пакетов на основе поля TOS.
skb->priority
Программы в пользовательском пространстве могут указывать class-id в поле 'skb->priority' при использовании флага SO_PRIORITY. Каждый объект дерева может иметь свои фильтры, фильтры верхнего уровня могут классифицировать для классов нижнего уровня.
Если классификация не произошла, пакет ставится в очередь этого класса. Обратитесь к руководствам MAN соответствующего класса.
ИМЕНОВАНИЕ
Все очереди, классы и фильтры имеют присвоенные или автоматически назначенные идентификаторы.
Идентификатор состоит из основного (major) и дополнительного (minor) номеров, разделенных двоеточием.
ОЧЕРЕДИ
Очереди, которая потенциально может иметь дочерние объекты, назначается основной номер, называемый 'handle' ('обработчик') и использует дополнительный номер для нумерации классов, например: '10:'.
КЛАССЫ
Идентификатор класса наследует основной номер родительской очереди и имеет дополнительный номер, обозначающий класс ('classid'). Идентификатор не имеет отношения к родительским классам, только к родительской очереди.
ФИЛЬТРЫ
Фильтры имеют идентификатор, состоящий из трех частей, который необходим для поиска в иерархии фильтров, см. tc-filters(8).
ЕДИНИЦЫ ИЗМЕРЕНИЯ
Все параметры принимают число с плавающей точкой за которой может следовать единица измерения. Полоса пропускания (скорость) может быть указана в:
kbps
килобит в секунду
mbps
мегабит в секунду
kbit
килобит в секунду
mbit
мегабит в секунду
bps или число без единицы измерения
байт в секунду Объем может быть указан в:
kb или k
килобайтах
mb или m
мегабайтах
mbit
мегабитах
kbit
килобитах
b или число без единицы измерения
байтах. Период времени задается в:
s, sec или secs
секундах
ms, msec или msecs
миллисекундах
us, usec, usecs или число без единицы измерения
микросекундах.
КОМАНДЫ TC
Следующие команды доступны для очередей, классов и фильтров:
add (добавить)
Добавить очередь, класс или фильтр в объект. Обязательно должен быть указан параметр родителя parent , в виде идентификатора или 'root' для обозначения самого верхнего уровня устройства. При создании очереди или фильтра он может быть именован с помощью параметра handle . Класс именуется с помощью параметра classid .
remove (удалить)
Очередь удаляется по 'handle' (допустимо указание имени 'root'). Все подклассы и их очереди, а также фильтры автоматически удаляются.
change (изменить)
Некоторые объекты могут быть изменены по месту. Эта команда использует такой же синтаксис, как и 'add', за исключением не изменяемого параметра 'handle', чтобы не допустить перемещение объекта в дереве.
replace (заменить)
Удаляет и добавляет новый объект по идентификатору. Если объект не существует, он будет создан.
link (связать)
Доступно только для очередей. Заменяет существующий объект.
ИСТОРИЯ
tc написана Алексеем Кузнецовым и добавлена в Linux 2.2.
СМ. ТАКЖЕ
tc-cbq(8), tc-htb(8), tc-sfq(8), tc-red(8), tc-tbf(8), tc-pfifo(8), tc-bfifo(8), tc-pfifo_fast(8), tc-filters(8)
АВТОРЫ
man-страница сопровождается Бертом Хубертом (Bert Hubert)
ПЕРЕВОД
Андрей Черепанов