QoS на практике: очереди, DSCP, FQ_CoDel и борьба с bufferbloat
Почему 100 Мбит/с не равно 100 Мбит/с — и как сеть выбирает, чей пакет уедет первым
Самое распространённое заблуждение о скорости интернета: тариф «100 Мбит/с» означает, что вы всегда получаете 100 мегабит. На практике 100 Мбит/с — это потолок, под которым в любой момент времени десятки потоков делят ресурсы. И когда канал упирается в потолок, сеть должна решить, чей пакет уедет первым. Эту задачу решает QoS — Quality of Service.
Без QoS канал работает как FIFO-очередь: пришёл первым — уехал первым. Это означает, что большой бэкап может «забить» канал так, что звонок в Zoom начнёт заикаться. С правильным QoS чувствительные к задержке пакеты пропускаются раньше тяжёлых, и пользователь не замечает разницы между загруженным и пустым каналом.
Поток пакетов на маршрутизаторе с QoS
[входящий]
│
▼
[ Классификатор: DSCP/порт/DPI ]
│
├── EF (Expedited) → realtime ──┐
├── AF41 (Voice) │
├── AF31 (Streaming) ▼
├── AF21 (Web/API) ┌─Планировщик─┐
└── BE (Best Effort) │ DRR / WFQ │ ──► [исходящий]
│ FQ_CoDel │
└────────────┘
EF идёт почти без ожидания.
BE может постоять — но не более X миллисекунд.Скорость и задержка — разные ресурсы
Между двумя метриками часто путают понятия. Простой пример:
- 1 Гбит/с с RTT 200 мс — отлично для скачивания файлов, но в голосовом звонке вы будете слышать собеседника с задержкой полсекунды.
- 5 Мбит/с с RTT 20 мс — мало для 4К-стриминга, но идеально для звонков и онлайн-игр.
QoS как раз про то, чтобы не путать эти ресурсы и распределять их по нуждам приложений: видео любит пропускную способность, голос — низкую задержку, игры — низкий jitter. Один и тот же канал может одновременно обслуживать всё, если правильно настроены приоритеты.
Классификация: как отличить пакет голоса от пакета бэкапа
Прежде чем дать пакету приоритет, нужно понять, какого он класса. Способов несколько:
- DSCP (Differentiated Services Code Point) — 6 бит в IP-заголовке. Стандартизированные значения: EF (Expedited Forwarding) для голоса, AF11–AF43 для разных классов, CS6/CS7 для управляющего трафика, BE (Best Effort) — по умолчанию.
- Порт + протокол. SIP/RTP-трафик идёт на типовых портах, можно классифицировать по 5-tuple.
- DPI-классификация. Анализ содержимого/поведения потока. На зашифрованном трафике — по сигнатурам и таймингам.
- Marking от приложения. Современные приложения (Zoom, Teams, Discord) сами расставляют DSCP — но провайдер может это переписывать.
На практике уважающий себя оператор не доверяет marking от пользователей и всегда переразмечает на access-уровне. Иначе любой бэкап мог бы маркироваться как EF и захватить приоритет.
Дисциплины очередей: от FIFO до FQ_CoDel
Сама очередь — алгоритм, по которому планировщик выбирает следующий пакет. Эволюция:
- FIFO. Простая, единственная очередь. Если в начало встал большой поток, всё остальное ждёт.
- Priority Queueing (PQ). Несколько очередей по приоритетам. Высокий приоритет всегда обслуживается первым. Минус — если высокого много, низкий не получает ничего вообще.
- WFQ / WRR. Weighted Fair Queueing — каждой очереди выделяется доля канала пропорционально весу. Голос получает 20%, веб — 60%, бэкапы — 20%.
- HTB (Hierarchical Token Bucket). Иерархия классов с гарантиями — у одного класса минимум 5 Мбит, у другого — потолок 50 Мбит, можно «занимать» у соседей. Стандарт корпоративных и домашних QoS на Linux.
- FQ_CoDel. Современная дисциплина: разносит каждый поток в свою очередь, активно борется с раздуванием буферов. По умолчанию в OpenWRT, ядре Linux 5+, в виде CAKE с дополнительной shaping-функцией.
Shaping vs Policing: складывать или дропать
Когда поток превышает разрешённую скорость, есть два подхода:
- Shaping (token bucket). Лишние пакеты складываются в буфер и выпускаются с разрешённой скоростью. Поток выглядит ровным, но приходит с задержкой. Хорошо для TCP — он адаптируется к задержке.
- Policing. Превышение просто дропается. Поток выглядит «рваным», но без буферизации. Это жёстче по ощущениям, но не создаёт лишней задержки.
Shaping обычно ставят на отдающей стороне (исходящий канал контролируется владельцем), policing — на входе чужого трафика. Математика token bucket подробно разобрана в статье про traffic shaping.
AQM и bufferbloat: невидимая беда домашних роутеров
В 2010-х Jim Gettys обнаружил, что во многих роутерах буферы такие огромные (мегабайты), что когда канал упирается в потолок, очередь раздувается на сотни миллисекунд — и весь трафик начинает страдать. Это назвали bufferbloat.
Симптом легко проверить: запустите большую загрузку и одновременно ping 1.1.1.1. Если RTT подскакивает с 10 мс до 100–500 мс — у вас bufferbloat. Лечение — Active Queue Management (AQM):
- RED (Random Early Detection) — старый алгоритм, дропает случайные пакеты при заполнении буфера.
- CoDel (Controlled Delay) — современный, отслеживает время, проведённое пакетом в очереди, и дропает старых жителей.
- PIE — алгоритм от Cisco, похожий на CoDel.
- FQ_CoDel — комбинация Fair Queueing + CoDel, по умолчанию в современных Linux-ядрах.
Включить FQ_CoDel на OpenWRT-роутере занимает 2 минуты и часто заметнее, чем смена тарифа.
Мобильные QCI/5QI: QoS в LTE и 5G
В мобильных сетях QoS встроен в архитектуру. Каждое соединение (bearer) имеет профиль:
- QCI 1 (5QI 1) — гарантированная пропускная способность для VoLTE-голоса. Максимальная задержка 100 мс.
- QCI 5 — IMS signaling. Низкая задержка для SIP.
- QCI 9 — best effort, основной интернет-трафик. Тут живёт 99% пакетов вашего телефона.
- 5QI 80–87 в 5G — для AR/VR и mission-critical.
Это значит, что в перегруженной соте VoLTE-голос продолжает работать, а HTTP-страницы могут грузиться медленно — оператор намеренно жертвует best effort, чтобы сохранить голос. Подробнее это в статье про мобильные сети.
Домашний QoS: что можно сделать руками
На домашнем роутере правильно настроенный QoS даёт больше эффекта, чем смена тарифа в полтора раза:
- OpenWRT с CAKE — пакет sqm-scripts. Указываете upstream и downstream скорость, остальное делается автоматически. Отлично борется с bufferbloat.
- Ubiquiti EdgeRouter / UDM — встроенный smart queues с FQ_CoDel.
- MikroTik — queue tree с HTB-дисциплиной, гибче, но требует знаний.
- Marking приложений. Discord и Zoom умеют автоматически ставить DSCP — главное, чтобы роутер этому доверял (или переразмечал и потом учитывал).
Эталонный тест после настройки: waveform.com/tools/bufferbloat. До настройки часто получают F или D, после — A или A+.
Итого
QoS — это не «ускоритель интернета», а диспетчер очереди. Он не создаёт пропускную способность, но позволяет тратить её так, чтобы голос и игры не страдали из-за бэкапов. На уровне провайдера это базовая инженерная гигиена, в мобильной сети — встроенная архитектура, дома — пятиминутная настройка с большим эффектом. Понимание QoS превращает «у меня медленный интернет» в «у меня bufferbloat 200 мс на upstream».
Нужен стабильный защищённый доступ к интернету?
TooTimes — зашифрованный туннель до серверов в 9 странах, без логов.
Посмотреть тарифы