Контроль трафика

Введение

Контроль трафика - набор алгоритмов, выполняющих анализ и обработку трафика для уменьшения влияния высокой загруженности соединения на производительность сети передачи данных в целом.

Контроль трафика в общем случае реализует следующие функции:

  • поддержка гарантированной полосы пропускания;

  • уменьшение потерь;

  • управление перегрузками;

  • формирование (шейпинг) трафика;

  • настройка приоритетов (классификация) трафика в сети.

Выделим основные понятия:

Очередь (queue) – буфер устройства, реализованный виртуально или физически и используемый для хранения совокупности пакетов, коллективно ожидающих передачи сетевым устройством на основании планировщика пакетов.

Планировщик пакетов (qdisc) – это механизм, который управляет очередью распределения сетевых пакетов. С его помощью можно отбрасывать пакеты, если буфер переполнился, а также изменять порядок отправки пакетов. Планировщики обычно пытаются достичь баланса между эффективностью использования ресурсов и временем запуска приложения.

Шейпинг пакетов (packet shaping) – это механизм управления трафиком, который задерживает некоторые или все пакеты, чтобы привести их в соответствие с желаемым профилем трафика.

Важно

Планировщик пакетов обрабатывает трафик перед отправкой на интерфейс, таким образом все настройки Контроля трафика применяются к Исходящим интерфейсам

Планировщик пакетов по умолчанию

На каждом интерфейсе содержится неявный (неотображаемый) планировщик пакетов по умолчанию. Когда пользователь создаёт свой планировщик - планировщик по умолчанию удаляется. Если пользователь удаляет свой планировщик - планировщик по умолчанию возвращается на интерфейс.

На скриншоте ниже указаны параметры планировщика по умолчанию:

../../../../_images/traffic_control1.png

Бесклассовые планировщики пакетов

Бесклассовые планировщики пакетов (classless qdisc) реализуют базовые функции контроля трафика, такие как шейпинг и ограничение пропускной способности.

Список бесклассовых планировщиков и их параметры:

Packets FIFO (pfifo) - простой планировщик пакетов. Он не выполняет ограничения входящего трафика и переупорядочивания пакетов. Он обрабатывает трафик по принципу «первый пришел, первый ушел».

Параметры:

  • Лимит очереди (limit) - размер буфера, измеряемая в количестве пакетов.

Bytes FIFO (bfifo) - простой планировщик пакетов. Он не выполняет ограничения входящего трафика и переупорядочивания пакетов. Он обрабатывает трафик по принципу «первый пришел, первый ушел».

Параметры:

  • Лимит очереди (limit) - размер буфера, измеряемая в количестве байтов.

Packets FIFO with priority (pfifo_fast) - основан на алгоритме FIFO, но обладает некоторыми функциями приоритезации. Содержит три очереди для распределения трафика, которые обрабатывает в соответствии с приоритетом, вычисляемым исходя из меток DSCP.

Stochastic Fairness Queueing (sfq) - планировщик SFQ пытается поровну распределить возможность передавать данные между произвольным количеством потоков. Это достигается использованием хэш-функции для разделения трафика на отдельные очереди типа FIFO, которые потом циклически обрабатываются.

Параметры:

  • Частота смены хеш-алгоритма (perturb) - задает интервал в секундах, через который происходит изменение хэш функции. Поскольку существует вероятность совпадения значения хэш-функции, она должна периодически меняться, рекомендуемое значение - 10 сек.

  • Скорость передачи данных (quantum) - количество байт, используемых как «дефицит» в алгоритме справедливой организации очереди (Fair Queuing). Рекомендуемое значение 1514 байт: значение в MTU Ethernet (обычно 1500 байт) + аппаратный заголовок (14 байт)

FlowQueue-CoDel (Fair Queuing with Controlled Delay) (fq_codel) - Планировщик реализует справедливое распределение по очередям типа CoDel, которые обеспечивают низкую задержку и пропуск всплесков трафика.

Параметры:

  • Размер очереди (limit) - лимит количества пакетов в буфере, при превышении которого пакеты отбрасываются.

  • Количество потоков (flows) - количество очередей, используемых при справедливой организации очереди (Fair Queuing).

  • Quantum (quantum) - количество байт, используемых как «дефицит» в алгоритме справедливой организации очереди (Fair Queuing). Рекомендуемое значение 1514 байт: значение в MTU Ethernet (обычно 1500 байт) + аппаратный заголовок (14 байт)

Token bucket filter (tbf) - Планировщик пакетов, служащий для ограничения пропускной способности, основанный на токенах. Каждый тик генерируются токены и помещаются в буфер токенов. Пакеты передаются только в случае наличия достаточного количества токенов. При недостатке токенов, пакеты начинают помещаться в буфер пакетов, а после его заполнения - уничтожаться.

Параметры:

  • Скорость восстановления токенов (rate) - позволяет задать полосу пропускания, указав скорость генерации токенов, измеряется в Мбит.

  • Размер буфера токенов (burst) - размер буфера токенов, в байтах. Задает максимальное количество байт данных, для которых доступны токены в один момент времени.

  • Размер очереди пакетов (limit) - размер буфера пакетов, при превышении пакеты уничтожаются. Нельзя использовать одновременно с параметром «Задержка пакета в очереди».

  • Задержка пакета в очереди (latency) - максимальное время (в секундах) нахождения в буфере пакетов, при превышении пакет уничтожается.

Важно

При задании Размера буфера токенов следует учитывать, что токены сначала помещаются в буфер, а лишь затем используются для пропуска трафика. И если задать большую пропускную способность при маленьком буфере токенов - то количество токенов выделяемых за один тик может превысить размер буфера токенов. В таком случае часть токенов будет пропадать, и скорость передачи данных будет ограничена не скоростью передачи данных, а размером буфера токенов. Например, для прохождения трафика со скоростью 1Гб/с Размер буфера токенов должен быть не менее 4000.

Важно

Рекомендуется не задавать значение Размер буфер токенов меньше MTU - иначе большие пакеты не смогут пройти, так как для прохождения им потребуется больше токенов, чем может находиться в буфере.

Классовый планировщик пакетов

Классовый планировщик Hierarchical Token Bucket (HTB) подразумевает разделение полосы пропускания для определенных типов потока в отдельные классы, каждый из которых имеет собственную полосу пропускания. HTB выстраивает классы в виде дерева: они могут разделяться на дочерние классы, каждый из которых делит между собой полосу родительского класса.

Алгоритм подразумевает классификацию трафика по определенным признакам, таким как: IP-адрес назначения или источника, порт назначения или источника, протокол передачи данных и т.д. Каждый класс соответствует определенному типу трафика. Каждый класс имеет свою очередь накопления пакетов, при этом алгоритм HTB выстраивает классы в виде дерева.

Планировщик HTB управляет потоком сетевых пакетов путем выделения токенов на их передачу в соответствии с приоритетами. Любой дочерний (конечный) класс, который хочет заимствовать токен, будет запрашивать его у своего родительского класса, который, в свою очередь, может заимствовать у своего родительского класса, пока токен не будет найден или корневой класс не будет достигнут. Шейпинг происходит только в конечных классах. HTB гарантирует, что пропускная способность, предоставляемая каждому классу, составляет по крайней мере минимум назначенного ему значения. Когда класс требует меньше назначенного количества, оставшаяся (избыточная) полоса пропускания распределяется среди других классов, которые требуют обслуживания.

Параметры Класса Hierarchical Token Bucket:

  • Имя класса - пользовательское имя класса

  • Тип класса - указывает на тип класса, Hierarchical Token Bucket

  • Родительский класс, Родительская очередь - в зависимости от положения в дереве наследования должен быть указан либо какой-то Родительский класс, либо какая-то Родительская очередь

  • Позиция класса в иерархии - определяет роль класса в иерархическом дереве. Промежуточный класс должен иметь дочерние классы, его роль - только распределение токенов. Конечные классы имеют встроенный шейпер в котором обрабатывается весь трафик.

  • Пропускная способность (rate) - позволяет задать гарантированную полосу пропускания, указав скорость генерации токенов, измеряется в Мбит.

  • Заимствование пропускной способности (ceil) - позволяет задать максимальную полосу пропускания, доступную при наличии неистраченных токенов у родительского класса, измеряется в Мбит.

  • Burst (burst) - размер буфера токенов, в байтах. Задает максимальное количество байт данных, для которых доступны токены в один момент времени.

  • Описание - пользовательское описание

Важно

Параметр Размер буфера токенов (burst) относится только к незаимствованной Пропускной способности (rate). Аналогичный параметр для Заимствованной пропускной способности (ceil) тоже есть (cburst), однако он не изменяется и всегда равен 1600 байт

Правила фильтрации

Правила фильтрации нужны для классификации трафика при использовании классового планировщика пакетов Hierarchical Token Bucket. После сопоставления трафика с каким-то из классов - он обрабатывается в соответствии с параметрами этого класса.

Параметры Правил фильтрации:

  • Включен - Включить правило

  • Метка на пакете - фильтрация по Метке, проставленной в модуле Фильтрация трафика

  • L3 Протокол - фильтрация по принадлежности к определённому L3 протоколу (ipv4/ipv6)

  • L4 Протокол - фильтрация по принадлежности к определённому L4 протоколу (udp/tcp/icmp/igmp/esp)

  • Отправитель - фильтрация по IP источника (по хосту или подсети)

  • Порт источника - фильтрация по порту источника

  • Получатель - фильтрация по IP назначения (по хосту или подсети)

  • Порт назначения - фильтрация порту назначения

  • DSCP - фильтрация по метке DSCP

  • Связать с классом - указывает класс, в который необходимо направить трафик, удовлетворяющий условиям фильтрации

  • Описание - пользовательское описание

Настройка бесклассового планировщика пакетов

На вкладке Очереди необходимо нажать кнопку добавления, в появившемся окне ввести Название очереди, выбрать в поле Механизм необходимый Планировщик пакетов, и несколько опций специфичных для различных Планировщиков пакетов.

../../../../_images/traffic_control2.png

После сохранения необходимо применить настройки (кнопка Применить слева снизу). Затем можно перейти на вкладку Статистические данные для просмотра статистики по обработанным пакетам/байтам.

../../../../_images/traffic_control3.png

Настройка классового планировщика пакетов

На вкладке Очереди необходимо нажать кнопку добавления, в появившемся окне ввести Название очереди и выбрать в поле Механизм классовый планировщик - Hierarchical Token Bucket (classful)

../../../../_images/traffic_control4.png

Затем на вкладке Классы создать несколько Промежуточных и Конечных классов

../../../../_images/traffic_control5.png
../../../../_images/traffic_control6.png

После чего на вкладке Правила фильтрации создать правила, распределяющие трафик по Классам

../../../../_images/traffic_control7.png

На последнем этапе необходимо на вкладке Очереди отредактировать созданный ранее Планировщик пакетов, указав Класс по умолчанию, куда будет попадать трафик, не попавший ни под одно из правил.

../../../../_images/traffic_control8.png

После сохранения и применения настроек можно перейти на вкладку Статистические данные для просмотра статистики по обработанным пакетам/байтам.

../../../../_images/traffic_control9.png