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) используем параметры командной строки:

    sudo mn --topo=single,2 -x
    

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • В качестве примера исследуем
  • Создадим каталог simple-drop:
    mkdir -p ~/work/lab_netem_ii/simple-drop
    cd ~/work/lab_netem_ii/simple-drop
    
  • Создадим скрипт для эксперимента lab_netem_ii.py:
    #!/usr/bin/env python
    
    """
    Simple experiment.
    Output: ping.dat
    """
    
    from mininet.net import Mininet
    from mininet.node import Controller
    from mininet.cli import CLI
    from mininet.log import setLogLevel, info
    import time
    
    def emptyNet():
    
        "Create an empty network and add nodes to it."
    
        net = Mininet( controller=Controller, waitConnected=True )
    
        info( '*** Adding controller\n' )
        net.addController( 'c0' )
    
        info( '*** Adding hosts\n' )
        h1 = net.addHost( 'h1', ip='10.0.0.1' )
        h2 = net.addHost( 'h2', ip='10.0.0.2' )
    
        info( '*** Adding switch\n' )
        s1 = net.addSwitch( 's1' )
    
        info( '*** Creating links\n' )
        net.addLink( h1, s1 )
        net.addLink( h2, s1 )
    
        info( '*** Starting network\n')
        net.start()
    
        info( '*** Set loss\n')
        h1.cmdPrint( 'tc qdisc add dev h1-eth0 root netem loss 10%' )
        h2.cmdPrint( 'tc qdisc add dev h2-eth0 root netem loss 10%' )
    
        time.sleep(10)  # Wait 10 seconds
    
        info( '*** Ping\n')
        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' )
    
        info( '*** Stopping network' )
        net.stop()
    
    
    if __name__ == '__main__':
        setLogLevel( 'info' )
        emptyNet()
    
  • Создадим скрипт для визуализации ping_plot:
    #!/usr/bin/gnuplot --persist
    
    set terminal png crop
    set output 'ping.png'
    set xlabel "Sequence number"
    set ylabel "Delay (ms)"
    set grid
    plot "ping.dat" with lines
    
  • Зададим права доступа:
    chmod +x ping_plot
    
  • Создадим Makefile:
    all: ping.dat ping.png
    
    ping.dat:
            sudo python lab_netem_i.py
            sudo chown mininet:mininet ping.dat
    
    ping.png: ping.dat
            ./ping_plot
    
    clean:
            -rm -f *.dat *.png
    
  • Выполним эксперимент:
    make
    
  • Посмотрите график.
  • Вычислите минимальное, среднее, максимальное и стандартное отклонение времени приёма-передачи.
  • Очистите каталог от результатов проведения экспериментов:
    make clean
    
Предыдущий
Следующий