Эмуляция влияния глобальных сетей


Часто возникает задача исследовать влияние задержек, потерь и джиттера (jitter) на работу сетевого приложения.

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

Рассмотрим схему, с помощью которой можно смоделировать влияние различных параметров сети передачи данных на исследуемое приложение.
Для моделирование очень удобно использовать операционную систему GNU/Linux, в которой существуют все необходимые инструменты.

В ядро ОС linux входит модуль netem, который предоставляет функционал для эмуляции WAN.
Текущая версия модуля имеет следующие функции:

  • эмуляция задержки, с различной функцией распределения
  • эмуляция потерь
  • эмуляция повтора пакетов
  • эмуляция перемешивания пакетов
  • эмуляция искажения пакетов

Этот модуль включен по умолчанию в большинство современных дистрибутивов, основанных на ядре операционной системы Linux 2.6
и управляется при помощи команды tc из пакета iproute2. Если ваш дистрибутив не включает в себя этот модуль,
то его можно включить самостоятельно (Networking —>Networking Options —>QoS and/or fair queuing —>Network emulator)

Для изучения влияния параметров транспортной сети на приложение, проще всего использовать выделенный компьютер.
На выделенном компьютере порты объедены в мост(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 позволяют нам произвести моделирование любых аномалий, которые могут произойти в сети.
Таким образом, любой системный администратор может произвести необходимое тестирование при разворачивании распределенных сервисов и внедрения новых протоколов.

По материалу статьи: Эмуляция влияния глобальных сетей

Используемый источник Kernel Networking на linux-foundation.org

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *