Принцип делить все и вся существует столько, сколько миллиардов лет существует Вселенная. Чаще всего объекты делятся в одинаковых пропорциях и неравный отхваченный кусок кем или чем-либо вызывает недовольство поделенных. Подобные ситуации часто возникают тогда, когда объект деления имеет весомое значение в системе. Перенесемся в 21 век. Наблюдая процессы в обществе и, в первую очередь в информационной сфере, можно заметить, что разумно делить все-таки научились. И, порой алгоритмы настолько неподдельны и устойчивы, что не оставляют никакой возможности взять больше или меньше дозволенного. Применив все вышеизложенное к передаче данных можно понять о чем идет речь.
Современное общество и каждый человек в нем требует к себе одинакового отношения во всех сферах, что зачастую становится головной болью для тех, кто предоставляет услуги. В частности касаясь предоставления услуг доступа к Интернету за последние несколько лет произошел огромный прорыв, позволивший решить ряд проблем, порожденных появлением всемирной паутины у нас в домах и на работе, превратив ее из некого деликатеса в фаст-фуд для сотен тысяч людей.
Несколько раньше на нашем сайте мы опубликовали статью о RouterOS Mikrotik, в которой говорилось о возможностях, установке и первоначальной настройке этой операционной системы. Судя по количеству вопросов и ответов на нашем форуме стало ясно, что в Интернет тема настройки и управления системой раскрыта плохо и не полно.
Не секрет, что зачастую администраторам, в особенности начинающим, сложно разобраться во всех приведенных алгоритмах и принципах работы шейпера, вынуждая учиться методом проб и зачастую не безобидных ошибок. Так сложилось, что для этой категории пользователей очень мало простой и доступной русскоязычной документации, одним из первых начинаний которой и станет эта статья.
Теория
Для начала рассмотрим несколько понятий, которыми мы будем пользоваться в дальнейшем.
Технология, которая позволяет ограничивать скорость и качество доступа в Интернет, называется шейпинг (от англ. Shape - форма). Образно говоря - это технология придания некой формы графику загрузки канала.
Шейпер - это алгоритм, который помимо управления очередностью пакетов позволяет отбрасывать не удовлетворяющие условиям. К таковым относятся алгоритмы PCQ и HTB (о них поговорим несколько позже).
Существует ещё один тип алгоритмов, используемых для управления движением пакетов внутри шейпера Schedulers. Их задача состоит только в формировании очередей согласно приоритетам пакетов, адресу источника, получателя и другим параметрам. К этому типу алгоритмов относятся PFIFO, BFIFO,SFQ, PCQ, RED.
Под-очередь - очередь, сформированная из пакетов по тому или иному признаку.
Queuing discipline (qdisc - дисциплина очереди) - алгоритм, который захватывает пакеты и точно определяет в каком порядке и каким образом они будут двигаться.
HTB
В основе шейпинга, используемого в Mikrotik, лежит дисциплина очереди HTB, реализованная во многих Linux-системах. Ее изучение является достаточно сложной, однако необходимой задачей для новичка, потому как без этих знаний дальше неудачных попыток и копирования правил из документации мало кто заходит.
Список основных возможностей по управлению трафиком в Mikrotik выглядит следующим образом:
- ограничение скорости по IP-адресам, подсетям, протоколам, портам, времени суток и другим параметрам;
- ограничение P2P-трафика (BitTorrent, eMule);приоритизация одних потоков пакетов над другими;
- использование пиковых скоростей для быстрого WEB-браузинга;
- разделение канала между пользователями поровну или в других пропорциях;
- возможность задания гарантированной скорости.
Ключевым понятием для HTB является класс. Приставка Hierarhical в аббревиатуре HTB означает, что дисциплина позволяет строить иерархию классов.
Схематически иерархию классов (для упрощения будем называть классы правилами) HTB можно представить в виде некого гибридного разделенного уровнями дерева, конечными вершинами которого являются клиенты. Классы, которые не имеют дочерних, будем называть клиентами или листьями. Обычно они находятся на нулевом уровне иерархии и первыми захватывают относящийся к ним трафик, передавая его родителям. Два или более класса, имеющие одного прямого родителя находятся на одном уровне и подсоединены к одной локальной выходной очереди.
Схематическое изображение структуры HTB
На схеме выше изображена иерархия классов, в которую из файервола (Filter) поступают пакеты с данными. В зависимости от приоритета, параметров классов и загрузки канала они попадают или в локальные очереди (Self Feed), или передаются в очереди родительских классов (Inner Feed).
Класс характеризуют следующие параметры:
- limit-at – гарантированная скорость;
- max-limit – ограничение скорости;
- priority – приоритет класса.
Класс может находиться в одном из трех состояний:
- Зеленый - пропускная способность правила не превышает параметр limit-at. В этом случае пакеты не двигаются вверх по иерархии, а перемещаются сразу в выходной поток своего уровня согласно приоритетам.
- Желтый - пропускная способность правила больше limit-at, но меньше max-limit. В этом случае класс отключается от выходного потока своего уровня и подключается к родительскому классу.
- Красный - пропускная способность правила больше max-limit. В этом состоянии класс отключается от родительского и подключается к локальной очереди.
Пользуясь уже даже этими данными, можно составлять правила, однако на практике некоторые вещи могут выглядеть несколько иначе.
В Mikrotik предусмотрены два типа правил, разнесенные на разные закладки в графической утилите Winbox (с ее помощью можно конфигурировать Mikrotik из-под Windows):
- Simple Queues;
- Queue Trees.
О них мы поговорим несколько позже, а сейчас рассмотрим несколько примеров работы HTB
Создадим несколько правил
[admin@MikroTik] queue tree> add name=ClassA parent=Local max-limit=2048000
|
1. Рассмотрим первый случай, когда клиенты 1 и 2 передают данные со скоростью меньше, чем указано в параметре limit-at, а клиент 3 не работает.
Как видим, пакеты с данными от leaf1 и leaf2 (клиенты) не передаются в родительские классы, а выстраиваются в локальную очередь в соответствии со своими приоритетами
2. Сейчас посмотрим что будет, в случае если клиент leaf2 будет передавать данные со скоростью больше limit-at, но меньше max-limit указанных в его параметрах и меньше limit-at в параметрах ClassB, к которому он прикреплен. Одновременно с ним leaf1 будет передавать данные со скоростью не превышающей limit-at.
В данном случае получается интересная ситуация: клиент leaf1 будет иметь больший приоритет, чем leaf2, хотя в параметрах последнего указан больший приоритет. Это связано с тем, что передавая данные со скоростью более limit-at leaf2 подключился к родительскому классу, имеющему приоритет 8. При этом существует правило, что на нижних уровнях приоритет пакетов при одинаковых условиях больше, чем на верхних.
3. Рассмотрим следующий пример: скорости передачи данных для leaf1 превысила допустимое max-limit, клиент leaf2 передает данные на скорости больше limit-at и меньше max-limit, клиент leaf3 работает на скорости меньше limit-at.
Это весьма интересный случай. В данной ситуации видно, что ClassA перегружен данными из Leaf1, поэтому ClassB не получит разрешения на передачу.В результате работоспособным окажется только клиент leaf3, подключенный в локальную очередь на нулевом уровне.
4. Теперь рассмотрим пример, когда данные будут одновременно передавать leaf1, leaf2, leaf3, ClassB будет желтым, а ClassA зеленым.
В результате этого на втором уровне leaf2 попадет в очередь первым (так как имеет больший приоритет), а leaf1 и leaf3 подвергнутся случайному выбору для определения порядка следования.
Как видим алгоритм работы HTB весьма логичен и не так уж сложен, как могло показаться сразу. Он был принят многими производителями программного и аппаратного обеспечения за свою гибкость, надежность и отсутствие свойственных его предшественникам недостатков. Благодаря огромной универсальности с помощью него можно строить практически любые возможные иерархии правил, в точности разграничивая и давая возможность управлять потоками данных на достаточно низком уровне.