Блог



Основы шейпинга в MikroTik RouterOS


Содержание:

  1. HTB шейпер
  2. Пиковая скорость Burst
  3. Алгоритмы Schedulers
    • PFIFO/BFIFO
    • SFQ
    • PCQ
    • RED
  4. Типы очередей
    • Queue Trees
    • Simple Queues

Шейпинг — это технология, позволяющая ограничивать скорость и качество доступа в интернет.

Шейпер — это программа, осуществляющая ограничение скорости. Шейпер работает по алгоритму, который управляет очередностью пакетов данных и ограничивает скорость путем отбрасывания пакетов, не удовлетворяющих определенным условиям.

HTB Шейпер

В различных операционных системах шейперы реализованы по разному.

В Windows шейперы представляют собой программные пакеты, в основном платные и практически не настраиваемые.

В Linux гораздо больше простора для создания шейперов, поскольку операции с сетевыми пакетами встроены непосредственно в ядро операционной системы. За счет этого достигается лучшее быстродействие и надежность.

В Linux шейпер создается путем добавления требуемой очереди непосредственно к сетевому интерфейсу. Этот элемент называется qdisc (Queueing Discipline — Дисциплина организации очереди).

Дисциплина организации очереди (qdisc) — это алгоритм, который захватывает пакеты и определяет, в каком порядке и каким образом они будут двигаться. Задавая разные qdisc на интерфейсе, можно применять разные алгоритмы управления трафиком.

Дисциплины организации очереди делятся на два вида:

  1. Безклассовые дисциплины организации очередей (Classless qdisc).

    К ним относятся: PFIFO/BFIFO, Token Bucket Filter (TBF), Stochastic Fairness Queueing (SFQ), Random Early Detection (RED) и тд. По сути, они являются именно очередями, в которых движутся пакеты. Поэтому для простоты будем называть такие qdisc просто «очередь».
  2. Полноклассовые дисциплины организации очередей (Classful qdisc).

    К ним относятся PRIO, Class Based Queueing (CBQ), Hierarchical Token Bucket (HTB) и т.д. В дальнейшем такие qdisc будем называть просто «дисциплина». Они являются костяком для организации иерархии из очередей.

Управление пропускной способностью в Mikrotik RouterOS основано на дисциплине HTB (Hierarchical Token Bucket). Она одна из самых удобных, простых и надежных дисциплин для организации шейпера.

В Mikrotik RouterOS есть следующие основные возможности по управлению трафиком:

  • ограничение скорости по IP-адресам, подсетям, протоколам, портам, времени суток и другим параметрам;
  • ограничение P2P трафика торрентов и приоритезация одних потоков пакетов над другими;
  • использование пиковых скоростей для быстрого WEB-браузинга;
  • разделение канала между пользователями поровну или в других пропорциях;
  • возможность задания гарантированной скорости.

HTB позволяет организовать древовидную иерархию из очередей и направлять в них трафик при помощи системы фильтров. Для понимания принципа работы HTB рассмотрим следующую аналогию:

Есть дорога, по которой ходят трамвай, троллейбус и такси. Согласно ПДД скорости каждого из транспортных средств строго определены — у трамвая это 40 км/ч, у троллейбуса — 70 км/ч и у такси — 100 км/ч. У каждого из транспортов на дороге своя полоса. У трамвая — рельсы, у троллейбуса — дорога под проводами. Ну а у такси вся остальная дорога. Пассажиры выбирают транспорт в соответствии со своим достатком или желанием. Те, кто побогаче — едут на такси, самые бедные — на трамвае, ну а средний класс — на троллейбусе.

HTB состоит из следующих элементов:

  1. Класс (class). С точки зрения нашей аналогии это строка в ПДД, определяющая, с какой скоростью должен ехать определенный транспорт.
  2. Очередь (qdisc). В нашей аналогии это само транспортное средство, вместе с его полосой на дороге.
  3. Фильтр (filter). В нашей аналогии это критерий, который определяет, в какое транспортное средство сядет пассажир. Пассажир представляет пакет данных. Для нашего примера критериев только два: доход или желание.

Таким образом, трафик сначала отфильтровывается в соответствующую очередь, а затем движется по ней (точнее выдается из нее) со скоростью, определённой в классе. На практике это работает именно в таком порядке. Хотя первым делом пакет проходит фильтр.

Из классов строится иерархия HTB. Иерархия нужна для сложного распределения скорости пакетов в классах. Нижестоящие классы получают разрешенную скорость от вышестоящих.

Пример иерархии классов HTB можно увидеть на рисунке ниже. Иерархия представлена в виде некого гибридного дерева разделенного уровнями Level0, Level1, конечными вершинами которого являются клиенты или листья Leaf1, Leaf2. Классы, которые не имеют дочерних, будем называть клиентами или листьями. Обычно они находятся на нулевом уровне иерархии и первыми захватывают относящийся к ним трафик, передавая его родителям. Два или более класса, имеющие одного прямого родителя находятся на одном уровне и подсоединены к одной локальной выходной очереди.

<br>					<span>
<br>						<span>Основы шейпинга в MikroTik RouterOS</span>
<br>					</span>
<br>

Схематическое изображение структуры HTB.

В иерархию классов из файервола (Filter) поступают пакеты с данными. В зависимости от приоритета, параметров классов и загрузки канала они попадают или в локальные очереди (Self Feed), или передаются в очереди родительских классов (Inner Feed).

Любой класс HTB обладает следующими параметрами:

  • limit-at — гарантированная скорость;
  • max-limit — ограничение скорости;
  • priority — приоритет класса.

Класс может находиться в одном из трех состояний:

  • Зеленый — пропускная способность класса не превышает параметр limit-at. В этом случае пакеты не двигаются вверх по иерархии, а перемещаются сразу в выходной поток своего уровня согласно приоритетам.
  • Желтый — пропускная способность класса больше limit-at, но меньше max-limit. В этом случае класс отключается от выходного потока своего уровня и подключается к родительскому классу.
  • Красный — пропускная способность класса больше max-limit. В этом состоянии класс отключается от родительского и подключается к локальной очереди.

 

Рассмотрим несколько примеров работы HTB.

Выполните в консоли New Terminal следующие команды:

# Создаем основной класс ClassA с ограничением скорости 2 Мбит/с.

queue tree add name=ClassA parent=Local max-limit=2048000

# Создаем класс ClassB с ограничением скорости 1 Мбит/с. Для ClassB класс ClassA будет родительским.

queue tree add name=ClassB parent=ClassA max-limit=1024000

# Добавляем лист Leaf1 с родительским классом ClassA, ограничением скорости 2 Мбит/с, гарантированной скоростью 1 Мбит/с и приоритетом 8.

queue tree add name=Leaf1 parent=ClassA max-limit=2048000 limit-at=1024000 packet-mark=packet_mark1 priority=8

# Добавляем лист Leaf2 с родительским классом ClassB, ограничением скорости 1 Мбит/с, гарантированной скоростью 256 Кбит/с и приоритетом 7. Данные пакеты будут промаркированы как packet_mark2.

queue tree add name=Leaf2 parent=ClassB max-limit=1024000 limit-at=256000 priority=7 packet-mark=packet_mark2

# Добавляем лист Leaf3 с родительским классом ClassB, ограничением скорости 1 Мбит/с, гарантированной скоростью 768 Кбит/с и приоритетом 8. Данные пакеты будут промаркированы как packet_mark3.

queue tree add name=Leaf3 parent=ClassB max-limit=1024000 limit-at=768000 priority=8 packet-mark=packet_mark3


СМОТРИ ТАКЖЕ