QoS Качество обслуживания: классификация, маркировка, очереди
Полоса пропускания не бесконечна, а трафик неоднороден: голосовой звонок умирает от 150 мс задержки, а большой бэкап готов ждать. QoS (Quality of Service) — это набор механизмов, который решает, чей пакет важнее, когда канал перегружен. Не «ускорить всё» (это невозможно), а осознанно распределить дефицит: кому приоритет, кого притормозить, кого выбросить первым.
- Четыре «врага» трафика: bandwidth, delay, jitter, loss
- Три модели QoS: best-effort, IntServ, DiffServ — и почему победил DiffServ
- Где живёт маркировка: CoS (L2), ToS/DSCP (L3) — побитно
- Стандартные классы PHB: EF, AF, CS, Default
- Классификация и trust boundary — кому верить
- Policing против shaping — «выбросить» против «придержать»
- Очереди: FIFO, WFQ, CBWFQ, LLQ — кого пропускать вперёд
- AQM против перегрузки: tail drop, RED/WRED, и почему пришли CoDel/FQ-CoDel
- Конфиг MQC (class-map → policy-map → service-policy)
- Мост в DevOps: DSCP в облаке, tc/qdisc в Linux, QoS в Kubernetes
1. Четыре характеристики, которые портят трафик
| Параметр | Что это | Кому критично |
|---|---|---|
| Bandwidth (полоса) | сколько бит/с проходит | загрузкам, видео |
| Delay (задержка) | время доставки end-to-end | голос, игры (норма для VoIP ≤150 мс) |
| Jitter (вариация задержки) | «дрожание» — пакеты приходят неравномерно | голос/видео (буфер сглаживает до предела) |
| Loss (потери) | % потерянных пакетов | всем; для VoIP >1% уже слышно |
2. Три модели QoS
- Best-effort — никакого QoS, «как получится». По умолчанию весь интернет так и работает.
- IntServ (Integrated Services) — резервирование ресурсов под каждый поток через RSVP. Точно, но не масштабируется (нужно состояние на каждый поток) — почти мёртв.
- DiffServ (Differentiated Services) ⭐ — трафик делится на классы, каждый помечается, и роутеры применяют политику к классу, не к потоку. Масштабируется, поэтому победил.
Дальше всё — про DiffServ: это де-факто стандарт.
3. Где живёт маркировка: CoS и DSCP
Чтобы применять политику к классу, пакет надо пометить. Метки есть на двух уровнях:
- CoS (L2) — 3 бита в теге 802.1Q (помнишь VLAN-тег из модуля 3?). Значения 0–7. Живёт только внутри L2-сегмента — на маршрутизаторе тег снимается, CoS теряется.
- DSCP (L3) — 6 бит в поле ToS/DS заголовка IP. Живёт end-to-end, пока кто-нибудь не перепишет. Это главный инструмент.
Стандартные классы (PHB — Per-Hop Behavior)
Чтобы все вендоры понимали метки одинаково, RFC задают стандартные значения DSCP:
| Класс | DSCP | Для чего |
|---|---|---|
| EF (Expedited Forwarding) | 46 | голос (VoIP) — минимальная задержка, строгий приоритет |
| AF (Assured Forwarding) | AF11–AF43 | видео, важные приложения; 4 класса × 3 уровня drop |
| CS (Class Selector) | CS0–CS7 | совместимость со старым IP Precedence; CS6/CS7 — сетевое управление |
| Default (BE) | 0 | best-effort — весь обычный трафик |
4. Классификация и trust boundary
Классификация — определить, к какому классу относится пакет. Способы: по входному интерфейсу, по ACL (адреса/порты), по уже стоящей метке DSCP/CoS, по протоколу (NBAR на Cisco — распознавание приложений).
Trust boundary — граница доверия меткам. Принцип: метить трафик как можно ближе к источнику, но не доверять меткам, которые поставил сам пользователь. Иначе любой ПК выставит себе EF и «обгонит» голос. Обычно доверяют IP-телефонам (через CDP/LLDP) и серверам, а пользовательский трафик ре-маркируют на access-порту.
5. Policing против shaping
Два способа ограничить скорость класса — и их постоянно путают:
Policing — «выбросить лишнее»
- Превышение лимита → пакет дропается (или ре-маркируется)
- Не вносит задержку, не буферизует
- Можно применять на вход и на выход
- Резкий, рваный трафик (особенно бьёт TCP)
- Потери → ретрансмиты
Shaping — «придержать в очереди»
- Превышение → пакет буферизуется и выпускается ровно
- Гладкий трафик, дружелюбен к TCP
- Идеален к скорости провайдера/контракту
- Вносит задержку (буфер)
- Только на выход; нужен буфер (память)
6. Очереди: кого пропускать вперёд
Когда на выходной интерфейс приходит больше, чем он может отправить, пакеты ждут в очередях. Дисциплина очереди решает, в каком порядке их выпускать:
| Механизм | Идея |
|---|---|
| FIFO | одна очередь, «кто первый пришёл». Никакого QoS. |
| WFQ | автоматически делит полосу «по-честному» между потоками |
| CBWFQ | классам выделяется гарантированная доля полосы (bandwidth) |
| LLQ ⭐ | CBWFQ + строгая приоритетная очередь для голоса (EF) — её обслуживают первой, всегда |
LLQ (Low Latency Queueing) — стандарт для голоса: EF-трафик идёт в priority-очередь и обслуживается раньше всех (минимальная задержка), но с ограничением (policer), чтобы голос не «съел» весь канал и не заморил остальных. Это лучшее из двух миров: приоритет + защита от голодания.
7. Управление перегрузкой: tail drop, RED/WRED, CoDel
Что делать, когда очередь переполнилась? Самое наивное — tail drop: новые пакеты просто отбрасываются. Проблема — TCP global synchronization: множество TCP-сессий одновременно теряют пакеты, разом сбрасывают скорость, потом разом разгоняются — канал «пилит» то пусто, то перегруз.
- RED / WRED (Random Early Detection) — начинает случайно подроняв пакеты заранее, до переполнения. Это «намекает» части TCP-сессий притормозить вразнобой — синхронизации нет. WRED учитывает DSCP (низкоприоритетные дропает раньше).
- CoDel / FQ-CoDel — современный ответ на bufferbloat (раздутые буферы дают огромную задержку). Управляет не длиной очереди, а временем пребывания пакета в ней. Стандарт в Linux сегодня.
- ECN — вместо дропа пометить пакет «впереди затор», и отправитель сам снизит темп. Без потерь.
fq_codel — дефолт во многих дистрибутивах. Понимание «большой буфер ≠ хорошо, он добавляет задержку» —
зрелый сетевой взгляд, который ценят и в DevOps.
8. Как это конфигурится: MQC (Cisco)
Cisco собирает QoS из трёх кирпичей — Modular QoS CLI:
- class-map — «что является этим классом» (классификация).
- policy-map — «что делать с классом» (маркировать, дать полосу, приоритет, shape).
- service-policy — «применить политику к интерфейсу».
9. Мост в DevOps
- DSCP в облаке: AWS/GCP в основном не гарантируют QoS внутри, но DSCP-маркировка сохраняется и важна на гибридных линках (Direct Connect, VPN к корпоративной сети с голосом/видео).
- Linux tc/qdisc: ровно те же идеи — classful qdisc (HTB ≈ CBWFQ),
fq_codelпротив bufferbloat, policing/shaping. Это и есть «QoS на сервере». - Kubernetes QoS classes (Guaranteed/Burstable/BestEffort) — это про CPU/память, другой QoS, но философия та же: при дефиците решаем, кого ужать первым. Не путай с сетевым DSCP.
- Service mesh / Envoy — rate limiting и приоритеты на L7 — современный наследник идей policing/shaping.
10. Вопросы с собеседования
11. Частые ошибки джунов
- QoS не создаёт полосу — распределяет дефицит при перегрузке. Враги: bandwidth, delay, jitter, loss.
- Победившая модель — DiffServ: классы + маркировка + политика к классу.
- CoS (3 бита, L2, локально) vs DSCP (6 бит, L3, end-to-end). EF=46 — голос, Default=0 — всё прочее.
- Классификация по ACL/интерфейсу/метке; trust boundary — где начинаем доверять меткам.
- Policing = выбросить лишнее (без задержки, рвано); shaping = придержать в буфере (гладко, с задержкой).
- Очереди: FIFO → WFQ → CBWFQ (доли) → LLQ (строгий приоритет голосу + лимит).
- Против перегрузки: WRED (ранний случайный дроп вместо tail drop), CoDel/FQ-CoDel против bufferbloat, ECN без потерь.
- Cisco MQC: class-map → policy-map → service-policy.
- В Linux/облаке те же идеи: tc/qdisc, HTB, fq_codel; не путать с QoS-классами Kubernetes (это про CPU/RAM).