Mininet. Использование netem (потери пакетов)

Использование netem. Потери пакетов, дублирование пакетов, изменение порядка, повреждение пакетов.

1 Общая информация

1.1 Цели

  • Освоить моделирование следующих параметров сети: потеря пакетов, дублирование пакетов, изменение порядка и повреждение пакетов.

1.2 Задачи

  • В ходе работы требуется освоить следующие умения:
    • эмуляция сети, характеризующихся такими параметрами, как задержка, потеря пакетов, повреждение пакетов, переупорядочивание пакетов и дублирование пакетов;
    • измерение производительности глобальных сетей, характеризующихся различными значениями параметров.

1.3 Видео: Использование netem II. Введение

2 Теоретические сведения

2.1 Проблемы с передачей пакетов

  1. Потеря пакета
    • Пакет, проходящий через сеть, не достигает пункта назначения.
    • Распространённой причиной потери пакетов является неспособность маршрутизаторов удерживать пакеты, поступающие со скоростью, превышающей скорость отправления.
    • Маршрутизатор ограничен объёмом буферной памяти, используемой для мгновенного хранения пакетов.
    • Когда происходит потеря пакетов, TCP уменьшает окно перегрузки и, следовательно, пропускную способность вдвое.
  2. Переупорядочивание пакетов
    • Пакеты принимаются в порядке, отличном от того, в котором они были отправлены.
    • Переупорядочивание пакетов (неупорядоченная доставка пакетов) обычно является результатом того, что пакеты следуют по разным маршрутам для достижения пункта назначения.
    • Переупорядочивание пакетов может ухудшить пропускную способность TCP-соединений в сетях с высокой пропускной способностью и высокой задержкой.
    • Для каждого сегмента, полученного не по порядку, получатель TCP отправляет подтверждение (ACK) для последнего правильно принятого сегмента.
    • Как только отправитель TCP получает три подтверждения для одного и того же сегмента (тройной дубликат ACK), отправитель считает, что получатель неправильно принял пакет, следующий за пакетом, который подтверждается три раза.
    • Тогда отправитель уменьшает окно перегрузки и пропускную способность в два раза.
  3. Повреждение пакета
    • Повреждение битов, составляющих пакет.
    • Обычно происходит на физическом уровне.
    • В случае повреждения некоторые биты могут иметь значения, отличные от первоначально отправленных узлом-отправителем.
    • Узел получателя отбрасывает такие пакеты.
    • Процесс-отправитель TCP не получит подтверждения для соответствующего сегмента и будет считать его потерянным сегментом.
    • Отправитель уменьшает окно перегрузки и пропускную способность в два раза.
  4. Дублирование пакетов
    • Несколько копий пакета присутствуют в сети и принимаются пунктом назначения.
    • Дублирование пакетов является результатом повторных передач, когда узел-отправитель повторно передает неподтвержденные (NACK) пакеты.

3 Подготовка стенда

3.1 Лабораторная топология

  • В топологии используется сеть 10.0.0.0/8, назначенная Mininet по умолчанию.

  • Топология представляет собой коммутатор с двумя подключёнными к нему хостами.

  • Для запуска топологии (рис. 1) используем параметры командной строки:

    1sudo mn --topo=single,2 -x
    

    h110.0.0.1h210.0.0.2s1h1-eth0s1-eth1s1-eth2h2-eth0

    Рис. 1.: Лабораторная топология

3.2 Рабочие файлы

  • Подключимся к виртуальной машине:
    1ssh -Y mininet@192.168.x.y
    
  • Для рабочих файлов будем использовать каталог ~/work/lab_netem_ii:
    1mkdir -p ~/work/lab_netem_ii
    

4 Интерактивный эксперимент

4.1 Добавление/изменение потери пакетов

  • Работа с NETEM осуществляется с помощью утилиты командной строки tc.

  • Без дополнительных параметров NETEM ведёт себя как базовая очередь FIFO без задержек, потерь, дублирования или переупорядочения пакетов.

  • Основной синтаксис tc, используемый с NETEM, следующий:

    1sudo tc qdisc [add|del|replace|change|show] dev dev_id root netem opts
    
    • sudo: выполнить команду с более высокими привилегиями;
    • tc: команда, используемая для взаимодействия с NETEM;
    • qdisc: дисциплина очереди (qdisc) представляет собой набор правил, определяющих порядок, в котором обслуживаются пакеты, поступающие по протоколу IP.
      • Дисциплина очереди применяется к очереди пакетов, чтобы решить, когда отправлять каждый пакет.
    • [add|del|replace|change|show] (добавить, удалить, заменить, изменить, показать): операция над qdisc:
      • чтобы добавить задержку на определённом интерфейсе, применяется операция add;
      • чтобы изменить или удалить задержку на определённом интерфейсе, применяется операция change или del;
    • dev_id: параметр указывает интерфейс, подлежащий эмуляции;
    • opts: параметр указывает величину задержки, потери пакетов, дублирования, повреждения и другие.

4.2 Определение интерфейсов хостов h1 и h2

  • Необходимо идентифицировать интерфейсы на подключенных хостах.
  • На хосте h1 введите команду ifconfig, чтобы отобразить информацию, относящуюся к его сетевым интерфейсам и назначенным им IP-адресам.
    • Вывод команды ifconfig показывает, что хост h1 имеет два интерфейса: h1-eth0 и lo.
    • Интерфейс h1-eth0 необходимо использовать в tc при эмуляции WAN.
  • На хосте h2 введите команду ifconfig.
  • Вывод команды ifconfig показывает, что хост h2 имеет два интерфейса: h2-eth0 и lo.
  • Интерфейс h2-eth0 необходимо использовать в tc при эмуляции WAN.

4.3 Добавка потери пакетов на интерфейс, подключённый к глобальной сети

  • Пакеты могут быть потеряны во время передачи из-за таких факторов, как битовые ошибки и перегрузка сети.
  • Скорость потерянных пакетов часто измеряется как процентная доля потерянных пакетов по отношению к количеству отправленных пакетов.
  • В терминале хоста h1 введите следующую команду:
    1tc qdisc add dev h1-eth0 root netem loss 10%
    
  • Эта команда добавляет 10% потери пакетов к интерфейсу h1-eth0 хоста h1.
  • Теперь можно проверить наличие потерь пакетов, используя команду ping с терминала хоста h1. Параметр -c указывает общее количество пакетов для отправки:
    1ping 10.0.0.2 -c 200
    
  • Обратите внимание на значения icmp_seq. Некоторые номера последовательности отсутствуют из-за потери пакетов.
  • В сводном отчёте ping сообщает о проценте потерянных пакетов после завершения передачи.
  • Данный сценарий эмулирует 10% потери пакетов в однонаправленном канале от хоста h1 к хосту h2.
  • Если мы хотим эмулировать потерю пакетов в обоих направлениях, к хосту h2 также необходимо добавить потерю пакетов в размере 10%.
  • В терминале хоста h2 введите следующую команду:
    1tc qdisc add dev h2-eth0 root netem loss 10%
    
  • Можно убедиться, что соединение между хостом h1 и хостом h2 имеет больше потерь пакетов (10% от хоста h1 + 10% от хоста h2), повторив команду ping на терминале хоста h1:
    1ping 10.0.0.2 -c 200
    
  • Обратите внимание на значения icmp_seq. Некоторые номера последовательности отсутствуют из-за потери пакетов.
  • В сводном отчёте ping сообщает о проценте потерянных пакетов после завершения передачи.
  • Чтобы удалить добавленную потерю пакетов и восстановить конфигурацию по умолчанию, необходимо удалить правила интерфейсов на хосте h1 и хосте h2.
  • В терминале хоста h1 введите следующую команду:
    1tc qdisc del dev h1-eth0 root netem
    
  • Примените те же действия для удаления правил на хосте h2. В терминале хоста h2 введите следующую команду:
    1tc qdisc del dev h2-eth0 root netem
    
  • В результате дисциплина организации очереди tc восстановит свои значения по умолчанию.
  • Теперь можно убедиться, что соединение от хоста h1 к хосту h2 не имеет явной потери пакетов.
  • Запустите команду ping с терминала хоста h1:
    1ping 10.0.0.2
    
  • Нажмите Ctrl+c, чтобы остановить тест.

4.4 Добавка значения корреляции для потери пакетов

  • Можно добавить необязательную корреляцию.
  • В терминале хоста h1 введите следующую команду:
    1tc qdisc add dev h1-eth0 root netem loss 50% 50%
    
  • Команда вводит коэффициент потери пакетов 50% (такой высокий уровень потери пакетов маловероятен), и каждая последующая вероятность зависит на 50% от последней.
  • Теперь пользователь может проверить, что между хостом h1 и хостом h2 теряются пакеты, используя команду ping с терминала хоста h1:
    1ping 10.0.0.2 -c 50
    
  • Обратите внимание на значения icmp_seq. Некоторые номера последовательности отсутствуют из-за потери пакетов.
  • В сводном отчёте ping сообщает о проценте потерянных пакетов после завершения передачи.
  • В терминале хоста h1 введите следующую команду, чтобы удалить предыдущие конфигурации:
    1tc qdisc del dev h1-eth0 root netem
    

4.5 Добавка повреждения пакетов

  • Помимо потери пакетов, с помощью NETEM можно эмулировать повреждение пакетов.
  • В терминале хоста h1 введите следующую команду:
    1tc qdisc add dev h1-eth0 root netem corrupt 0.01%
    
  • Добавленное здесь новое значение представляет собой процент повреждения пакетов (0,01%).
  • Теперь пользователь может проверить предыдущую конфигурацию с помощью инструмента iperf3 для проверки повторных передач.
  • Запустите iPerf3 в режиме сервера в терминале хоста h2:
    1iperf3 -s
    
  • Запустите iPerf3 в клиентском режиме в терминале хоста h1:
    1iperf3 -c 10.0.0.2
    
  • Посмотрите значения повторной передачи на каждом временном интервале и общее количество повторно переданных пакетов.
  • В терминале хоста h1 введите следующую команду, чтобы удалить предыдущие конфигурации:
    1tc qdisc del dev h1-eth0 root netem
    
  • Чтобы остановить сервер, нажмите Ctrl+c в терминале хоста h2.

4.6 Добавка переупорядочивание пакетов

  • Иногда пакеты доставляются не в том порядке, в котором они были отправлены.
  • Для эмуляции переупорядочивания в NETEM используется опция переупорядочивания.
  • Посмотрим поведение трафика без переупорядочивания пакетов.
  • В терминале хоста h1 введём:
    1ping 10.0.0.2
    
  • Нажмите Ctrl+c, чтобы остановить тест.
  • В терминале хоста h1 введите следующую команду:
    1tc qdisc add dev h1-eth0 root netem delay 10ms reorder 25% 50%
    
  • В этой команде 25% пакетов (со значением корреляции 50%) будут отправлены немедленно, а остальные 75% будут задержаны на 10 мс.
  • Пользователь может проверить эффект переупорядочивания пакетов с помощью команды ping на терминале хоста h1 (нажмите Ctrl+c, чтобы остановить тест):
    1ping 10.0.0.2
    
  • Первый и второй пакеты не будут иметь задержки (один из четырех, или 25%), а следующие три пакета будут иметь задержку около 10 миллисекунд (три из четырех, или 75%).
  • В терминале хоста h1 введите следующую команду, чтобы удалить предыдущие конфигурации:
    1tc qdisc del dev h1-eth0 root netem
    

4.7 Добавка дублирования пакетов

  • Дублированные пакеты могут присутствовать в сетях в результате повторных передач.
  • NETEM предоставляет возможность эмуляции дублирования пакетов.
  • В терминале хоста h1 введите следующую команду:
    1tc qdisc add dev h1-eth0 root netem duplicate 50%
    
  • Команда создаст дублирование 50% (т. е. 50% пакетов будут получены дважды).
  • Пользователь может проверить эффект дублирования пакетов с помощью команды ping на терминале хоста h1 (нажмите Ctrl+c, чтобы остановить тест):
    1ping 10.0.0.2
    
  • Дубликаты пакетов помечаются как DUP!.
  • Измеренная скорость дублирования пакетов будет приближаться к настроенной скорости по мере выполнения большего количества попыток.
  • В терминале хоста h1 введите следующую команду, чтобы удалить предыдущие конфигурации:
    1tc qdisc del dev h1-eth0 root netem
    

4.8 Видео: Использование netem II. Интерактивный эксперимент

5 Воспроизводимый эксперимент

5.1 Постановка задания

  • Будем исследовать задержки и построим графики для них.
  • Выполните все интерактивные эксперименты в виде воспроизводимых.
  • Для каждого эксперимента expname создайте свой каталог:
    1mkdir -p ~/work/lab_netem_ii/expname
    
  • В него мы будем помещать файлы эксперимента.
  • Здесь expname может принимать значения simple-drop, correlation-drop и т.п.
  • Для каждого эксперимента создайте скрипт для проведения эксперимента lab_netem_i.py и скрипт для визуализации ping_plot.
  • Кроме визуализации вычислите минимальное, среднее, максимальное и стандартное отклонение времени приёма-передачи.
  • Для примера реализуем задание простейшей задержки.

5.2 Добавление потери пакетов на интерфейс, подключённый к эмулируемой глобальной сети

  • В качестве примера исследуем
  • Создадим каталог simple-drop:
    1mkdir -p ~/work/lab_netem_ii/simple-drop
    2cd ~/work/lab_netem_ii/simple-drop
    
  • Создадим скрипт для эксперимента lab_netem_ii.py:
     1#!/usr/bin/env python
     2
     3"""
     4Simple experiment.
     5Output: ping.dat
     6"""
     7
     8from mininet.net import Mininet
     9from mininet.node import Controller
    10from mininet.cli import CLI
    11from mininet.log import setLogLevel, info
    12import time
    13
    14def emptyNet():
    15
    16    "Create an empty network and add nodes to it."
    17
    18    net = Mininet( controller=Controller, waitConnected=True )
    19
    20    info( '*** Adding controller\n' )
    21    net.addController( 'c0' )
    22
    23    info( '*** Adding hosts\n' )
    24    h1 = net.addHost( 'h1', ip='10.0.0.1' )
    25    h2 = net.addHost( 'h2', ip='10.0.0.2' )
    26
    27    info( '*** Adding switch\n' )
    28    s1 = net.addSwitch( 's1' )
    29
    30    info( '*** Creating links\n' )
    31    net.addLink( h1, s1 )
    32    net.addLink( h2, s1 )
    33
    34    info( '*** Starting network\n')
    35    net.start()
    36
    37    info( '*** Set loss\n')
    38    h1.cmdPrint( 'tc qdisc add dev h1-eth0 root netem loss 10%' )
    39    h2.cmdPrint( 'tc qdisc add dev h2-eth0 root netem loss 10%' )
    40
    41    time.sleep(10)  # Wait 10 seconds
    42
    43    info( '*** Ping\n')
    44    h1.cmdPrint( 'ping -c 200', h2.IP(), '| grep "time=" | awk \'{print $5, $7}\' | sed -e \'s/time=//g\' -e \'s/icmp_seq=//g\' > ping.dat' )
    45
    46    info( '*** Stopping network' )
    47    net.stop()
    48
    49
    50if __name__ == '__main__':
    51    setLogLevel( 'info' )
    52    emptyNet()
    
  • Создадим скрипт для визуализации ping_plot:
    1#!/usr/bin/gnuplot --persist
    2
    3set terminal png crop
    4set output 'ping.png'
    5set xlabel "Sequence number"
    6set ylabel "Delay (ms)"
    7set grid
    8plot "ping.dat" with lines
    
  • Зададим права доступа:
    1chmod +x ping_plot
    
  • Создадим Makefile:
     1all: ping.dat ping.png
     2
     3ping.dat:
     4        sudo python lab_netem_i.py
     5        sudo chown mininet:mininet ping.dat
     6
     7ping.png: ping.dat
     8        ./ping_plot
     9
    10clean:
    11        -rm -f *.dat *.png
    
  • Выполним эксперимент:
    1make
    
  • Посмотрите график.
  • Вычислите минимальное, среднее, максимальное и стандартное отклонение времени приёма-передачи.
  • Очистите каталог от результатов проведения экспериментов:
    1make clean
    
Предыдущий
Следующий