суббота, 24 ноября 2012 г.











Часто возникает задача исследовать влияние задержек, потерь
и джиттера на работу сетевого приложения. Подобная задача
стоит в первую очередь перед специалистами, которые
занимаются разработкой или внедрением решений VoIP, сетевых
игр, потокового медиа контентента. С большим
распространением беспроводных сетей передачи данных, таких
как GPRS,
CDMA, спутниковых систем связи, исследования влияния
параметров сетей передачи данных на работу приложений
становятся особенно важными.

   Рассмотрим схему, с помощью которой можно смоделировать влияние
   различных параметров сети передачи данных на исследуемое приложение.
   Для моделирование очень удобно использовать операционную систему
   GNU/Linux, в которой существуют все необходимые инструменты. В ядро ОС
   linux входит модуль netem, который предоставляет функционал для
   эмуляции WAN. Текущая версия модуля имеет следующие функции:
 * эмуляция задержки, с различной функцией распределения
* эмуляция потерь * эмуляция повтора пакетов
* эмуляция перемешивания пакетов * эмуляция искажения пакетов 
   Этот модуль включен по умолчанию в большинство современных
   дистрибутивов, основанных на ядре операционной системы Linux
   2.6(Fedora, OpenSuse, Gentoo, Debian, Mandriva, Ubuntu) и управляется
   при помощи команды tc из пакета iproute2. Если ваш дистрибутив не
   включает в себя этот модуль, то его можно включить самостоятельно:
 Networking --> Networking Options --> QoS and/or fair queuing --> Network emulator 
   Для изучения влияния параметров транспортной сети на приложение, проще
   всего использовать выделенный компьютер, который работает по схеме
   изображенной на рис. 1. На выделенном компьютере порты объедены в
   мост(ethernet bridge), что позволяет прозрачно перебрасывать пакеты с
   одного интерфейса на другой и выполнять роль коммутатора. Такое
   решение является оптимальным, тк теперь мы можем фильтровать трафик,а
   также изменять требуемые параметры транспортного потока.
   Для того, чтобы настроить мост, в системе должен быть установлен пакет
   bridge-utils. Для создания предложенной конфигурации нужно создать
   мост:
 #brctl add br0 
   Добавить к нему нужные интерфейсы:
 #brctl addif br0 eth0 #brctl addif br0 eth1 
   Настроить адрес на интерфейсе br0 для доступа к компьютеру по сети:
 #ifconfig br0 
   После этого ethernet фреймы приходящие в один интерфейс, будут
   пересылаться в другой. Стоит отметить, что пересылаемые пакеты
   проходят через netfilter, таким образом фильтрацией трафика можно
   управлять по средствам iptables на сетевом уровне и ebtables на
   канальном уровне модели OSI.

   Эмуляция задержки пакетов

   Самым простым примером добавлением корневого qdisc, эмулирующего
   задержку.
 # tc qdisc add dev eth1 root netem delay 800ms 
   Стоит запомнить, что мы можем контролировать только исходящий траффик,
   поэтому данная команда в нашей схеме установит задержку данных,
   которые идут в направлении от сервер-клиент, равной 800мс. Чтобы
   сделать наш сценарий более реалистичным можно, добавить стандартной
   отклонение. В дальнейшем мы будем изменять корневой qdisc.
 # tc qdisc change dev eth0 root netem delay 800ms 100ms 
   Теперь задержка будет изменяться с отклонением 100мс.

   В модуле netem существует возможность задавать неравномерное
   распределение задержки. Например, чтобы задать нормальную функцию
   распределения, нужно сделать следующие:
 # tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal 
   Другие таблицы распределения(normal, pareto, paretonormal)
   устанавливаются вместе с iproute2 в каталог /usr/lib/tc. Не составит
   большого труда сгенерировать свою таблицу распределения, отражающую
   задержки канала связи, основанную на экспериментальных данных.

   Эмуляция изменений потока пакетов

   Случайная потеря пакетов задается в процентах.
 # tc qdisc change dev eth0 root netem loss 0.1% 
   Это приведет к потере 1 из 1000 пакетов. В качестве опции можно
   добавить корреляцию потери пакетов. Это приведет к тому, что генератор
   случайных чисел будет <<менее случайно>> . Это можно использовать с
   целью эмулировать packet burst.
 # tc qdisc change dev eth0 root netem loss 0.5% 25% 
   В этом примере будет теряться 0.5% пакетов, при чем вероятность потери
   пакета вырастает на четверть, если предыдущий был потерян.

   Дублирование пакетов задается таким же образом, как и потеря.
 # tc qdisc change dev eth0 root netem duplicate 1% 
   В новых ядрах(2.6.16 и старше) возможно добавления белого шума в
   пакеты. Такая возможность задается также как и потеря пакетов:
 # tc qdisc change dev eth0 root netem corrupt 0.1% 
   Другая ситуация, случающаяся в сетях с задержками это перемешивание
   пакетов, когда отправленный ранее пакет приходит позже пакета
   отправленного после него. В модуле netem существует две методики
   перемешивания. Самым простым является метод gap. Этод метод
   перемешивает каждый N-ый пакет.
 # tc qdisc change dev eth0 root netem gap 5 delay 10ms 
   В данном примере каждый 5-й пакет будет отправлен немедленно, тогда
   как остальные будут задержаны на 10мс. Это приведет к тому, что пакеты
   придут в порядке отличном от того, как они были посланы. Такое
   поведение полезно при простой отладке транспортного протокола.
   Следующий метод reoder гораздо больше приближен к реальной жизни. С
   помощью него можно указывать какой процент пакетов можно перемешать.
 # tc qdisc change dev eth0 root netem delay 10ms reorder 25% 50% 
   В данном примере 25% пакетов( с корреляцией 50%) будут посланы
   немедленно, тогда как остальные будут задержаны на 10мс.

   Третий возможный вариант перемешивания.
 # tc qdisc change dev eth0 root netem delay 100ms 75ms 
   Если один пакет получит задержку 100мс, а следующий пакет посланный
   1мс позже получит задержку 50мс(100мс -- 50мс джиттер), то второй
   пакет будет послан раньше.

   Стоит отметить, что для реализации любого из методов нужно
   использовать задержку.

   Модуль netem является дисциплиной управления трафиком, поэтому его
   можно использовать в связках с другими дисциплинами, такими как
   TBF,CBQ и пр. Также можно строить цепочки дисциплин и применять к ним
   различные фильтры.
 # tc qdisc add dev eth0 root handle 1: prio # tc qdisc add dev eth0 parent
1:3 handle 30: netem delay 200ms 10ms distribution normal # tc qdisc add dev
eth0 parent 30:1 tbf rate 20kbit buffer 1600 limit 3000 # tc filter add dev
eth0 protocol ip parent 1:0 prio 3 u32 match ip dst 65.172.181.4/32 flowid 1:3 
   В этом примере мы создаем корневую дисциплину приоритетов,
   присоединяем к третьему приоритету дисциплину netem, а потом добавляем
   шейпинг скорости.

   Как мы видим, инструментальные средства ОС Linux позволяют нам
   произвести моделирование любых аномалий, которые могут произойти в
   сети. Таким образом, любой системный администратор может произвести
   необходимое тестирование при разворачивании распределенных сервисов и
   внедрения новых протоколов.
soft