Linux Advanced Routing & Traffic Control HOWTO
Шрифт:
Самым большим преимуществом модели DiffServ является то, что она действует на границе "облака". После того как данные пересекли границу, внутренним маршрутизаторам можно не заниматься поддержанием информации о статусе QoS и полностью сосредоточиться на своей основной функции — маршрутизации.
Фактически, внутри своих локальных доменов, вы можете диктовать любую политику обслуживания, но при соединении с другими DS-доменами вы должны следовать Соглашению об Уровне Обслуживания (SLA).
К
14.3.4. Как работать с Dsmark.
Как уже было определено выше, в случае с DiffServ, пограничные и внутренние узлы различаются между собой. Это два важных пункта на пути трафика. Оба типа узлов выполняют классификацию трафика. Результат классификации может использоваться для различной DS-обработки, прежде чем пакет уйдет в сеть. Код diffserv представляет пакет в виде структуры sk_buff, в которой имеется поле skb->tc_index. В данном поле сохраняется результат начальной классификации, который может использоваться для различной интерпретации DS на пограничных и внутренних маршрутизаторах.
Значение skb->tc_index изначально устанавливается дисциплиной DSMARK qdisc для каждого входящего пакета, в соответствии с полем DS в IP-заголовке. Кроме того, классификатор cls_tcindex считывает, целиком или частично, значение skb->tcindex и использует его для выбора нужного класса.
Для начала рассмотрим команду DSMARK qdisc и ее параметры:
Каково назначение этих параметров?
• indices: размер таблицы пар маска-значение. Максимальное значение 2^n, где n >= 0.
• Default_index: индекс в таблице, принимаемый по-умолчанию, если классификатор не находит ни одного совпадения.
• Set_tc_index: инструкция, которая считывает значение поля DS и записывает его в skb->tc_index.
14.3.5. Как работает SCH_DSMARK.
Эта дисциплина выполняет следующие шаги:
• Если вставлена инструкция set_tc_index, то считывается поле DS и сохраняется в skb->tc_index.
• Вызывается классификатор. Он возвращает идентификатор класса, который будет сохранен в skb->tc_index. Если такой класс не найден, то используется класс по-умолчанию из параметра default_index. Если ни set_tc_index, ни default_index не объявлены, то результат может оказаться непредсказуемым.
• После этого управление передается внутренней qdisc, где вы можете повторно использовать
• Таким образом, конечный результат получается в результате объединения по "И" ds_field и маски, и затем объединения по "ИЛИ" с параметром value. Следующая диаграмма иллюстрирует этот процесс:
Как установить метку? Просто измените mask и value класса. См. следующий код:
Это изменение пары (mask,value) в хеш-таблице, пометит пакеты, принадлежащие классу 1:1.
Теперь перейдем к описанию фильтра TC_INDEX. Кроме всего прочего, фильтр TC_INDEX может использоваться и в других конфигурациях, а не только в тех, которые включают DS услуги.