Теоретические основы и архитектура
Кондиционирование трафика в QoS опирается на два механизма, policing и shaping, и на алгоритмы предотвращения перегрузки. 1. Policing ограничивает скорость до Committed Information Rate (CIR): трафик сверх допустимых размеров всплеска (Bc/Be) отбрасывается или перемаркируется с более высоким drop precedence. Очередь не используется, поэтому задержка не добавляется; policing обычно применяют на входе от клиента для контроля контракта. 2. Shaping буферизует лишние пакеты в памяти и отдаёт их с заданной скоростью. Он вносит переменную задержку и джиттер, но сглаживает потери для TCP, поэтому его используют на выходе к интерфейсам и абонентам с меньшей скоростью. 3. Предотвращение перегрузки: WRED снижает глобальную синхронизацию TCP. Когда буфер заполняется выше порогов, WRED с вероятностью отбрасывает пакеты менее приоритетных классов раньше переполнения очереди, и отправители замедляются плавно.
Три разных механизма, которые часто путают
Классификация и маркировка решают, к какому классу относится пакет (урок 1). Кондиционирование (policing и shaping) ограничивает скорость класса или клиента. Планирование (scheduling) и управление сбросом (drop) решают, какой пакет уйдёт в канал следующим и какой будет отброшен при заполнении очереди. Это три независимых узла обработки: маркировка не создаёт ни полосы, ни приоритета, пока на выходе не настроена очередь, а очередь без ограничения скорости не защитит других клиентов от перегруженного клиента.
Token bucket: общая модель policing и shaping
Корзина токенов описывается скоростью пополнения CIR (бит/с) и ёмкостью Bc (байт). Каждый переданный байт стоит токен; пока токенов хватает на пакет, он соответствует профилю (conform). Интервал Tc = Bc / CIR - время, за которое корзина пополняется целиком. Пример: CIR 50 Мбит/с = 6,25 МБ/с; при Bc 62 500 байт Tc равно 10 мс, и клиент может отправить пачку до 62 500 байт (около 41 пакета по 1500 байт) на скорости порта, после чего скорость падает до CIR. Be (excess burst) добавляет вторую ёмкость для трёхцветной модели.
Policer (полисер) на нехватке токенов не ждёт: пакет отбрасывается или перемаркируется. Буфера нет, задержка не добавляется, но TCP реагирует на потери. Для TCP-потока ёмкость Bc должна быть не меньше CIR x RTT: при CIR 50 Мбит/с и RTT 20 мс это 125 000 байт; если Bc 62 500 байт, один поток не достигнет CIR из-за сбросов. Shaper (шейпер) на нехватке токенов ставит пакет в очередь и выпускает его, когда токены накопятся: потерь меньше, но появляется задержка до глубина очереди / CIR. Очередь 64 пакета по 1500 байт при 100 Мбит/с даёт максимум 7,7 мс; увеличение очереди до 1000 пакетов даёт 120 мс и разрушает голос в том же классе.
| Параметр | Policing | Shaping |
|---|---|---|
| При нехватке токенов | Drop или remark | Буферизация и задержка |
| Задержка и джиттер | Нет (буфера нет) | До очередь / CIR |
| Направление | Обычно ingress (контракт на стыке) | Обычно egress (под скорость линка) |
| Влияние на TCP | Потери и пилообразная скорость | Сглаживание, больше задержка |
| Хранение состояния | Только токены | Токены и очередь |
Двухцветные и трёхцветные политики
Один bucket даёт два исхода: соответствует или нет (two-color). RFC 2697 (srTCM, single-rate three-color) добавляет вторую корзину Be: пакет зелёный, если помещается в Bc, жёлтый, если в Be, и красный, если не помещается нигде. RFC 2698 (trTCM, two-rate three-color) использует две скорости: CIR/CBS и PIR/PBS; красный - превышение PIR, жёлтый - превышение CIR, но не PIR, зелёный - всё остальное. Пример: CIR 50 Мбит/с, PIR 100 Мбит/с, клиент отправляет 80 Мбит/с: 50 Мбит/с зелёные, 30 Мбит/с жёлтые, красных нет. Типичные действия: зелёный - передать с исходным TC, жёлтый - передать с пониженным TC (или drop precedence) и сбросить при заторе первым, красный - отбросить. Режим color-blind игнорирует цвет, который уже поставил предыдущий узел; color-aware учитывает его.
Планировщики
FIFO обслуживает пакеты в порядке поступления, без различий по классам. Strict Priority (PQ) всегда обслуживает старшую очередь первой: низкая задержка, но при неограниченной полосе голос вытесняет всё остальное (starvation). WFQ/DRR/DWRR делят полосу пропорционально весам: DWRR обслуживает очереди по кругу и хранит счётчик "дефицита" (deficit counter), чтобы пакеты разных размеров не искажали пропорции. CBWFQ (Cisco) - класс получает гарантированную полосу bandwidth и делит остаток по весам. LLQ = CBWFQ + одна строгая приоритетная очередь: на Cisco priority ограничивается политером, но только при перегрузке (в свободный канал голос может превысить заданную скорость), поэтому для защиты ограничивают не только очередь, но и вход. На Junos приоритетная очередь задаётся priority strict-high, остальные делят полосу через transmit-rate; ограничение приоритетной очереди требует отдельной настройки (rate-limit или входной полисер).
Типовое распределение для 100 Мбит/с: голос 10% (10 Мбит/с) в приоритетной очереди, видео 20%, критичные данные 30%, остальное (Best Effort) получает остаток вместе с неиспользованной полосой. Гарантии работают только при перегрузке: в незагруженном канале любой класс использует свободную полосу.
Управление сбросом: tail drop, RED и WRED
При заполнении очереди tail drop отбрасывает последние пришедшие пакеты у всех потоков одновременно; все TCP-сессии одновременно снижают окно, потом одновременно его увеличивают (глобальная синхронизация), и канал работает пилой. RED начинает случайно отбрасывать пакеты заранее: по экспоненциально усреднённой длине очереди avg = avg*(1 - 2^-n) + текущая*2^-n (на Cisco n по умолчанию 9). При avg ниже min threshold сброса нет; между min и max вероятность растёт линейно до 1/denominator; выше max threshold отбрасываются все. Пример: min 20, max 40 пакетов, denominator 10: при avg 30 вероятность сброса 5%. WRED имеет отдельный профиль на каждый уровень drop precedence или цвет: AFx3 и жёлтые пакеты сбрасываются раньше AFx1 и зелёных. WRED применяют только к TCP-подобным классам (данные, Best Effort); голос и видео на UDP на сброс не реагируют, их защищают приоритетом и полисером.