Mininet. Использование netem (latency, jitter)

Mininet. Использование netem. Задержки, джтиттер.

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

  • В этом лабораторном занятии вы познакомитесь с NETEM и объясните, как его можно использовать для имитации сценариев реального мира, при этом контролируя параметры, влияющие на производительность сетей.
  • Сетевые параметры включают задержку, дрожание, потерю пакетов, изменение порядка и повреждение (latency, jitter, packet loss, reordering, and corruption).
  • Значения корреляции между сетевыми параметрами также будут установлены для обеспечения большей реалистичности сетевой среды.

1.1 Цели

  • Освоить моделирование задержек и джиттера в сетях.

1.2 Задачи

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

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

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

2.1 Дисциплины организации очередей в Linux

  • NETEM — сетевой эмулятор Linux для тестирования производительности реальных приложений в виртуальной сети.
  • Виртуальная сеть может воспроизводить глобальные сети в лабораторной среде.
  • NETEM позволяет пользователю изменять такие параметры, как задержка, джиттер, потеря пакетов, дублирование и изменение порядка пакетов.
  • NETEM реализован в Linux и состоит из двух частей: модуля ядра для организации очередей и утилиты командной строки для его настройки.
  • Между протоколом IP и сетевым устройством создаётся очередь с дисциплиной обслуживания.
  • Дисциплина обслуживания очередей по умолчанию есть простая очередь пакетов FIFO (первым пришел — первым обслужен).
  • Дисциплина реализуется как объект с двумя интерфейсами.
  • Один интерфейс ставит пакеты в очередь для отправки, а другой интерфейс отправляет пакеты на сетевое устройство.
  • На основе дисциплины обслуживания очередей принимается решение о том, какие пакеты отправлять, какие пакеты задерживать и какие пакеты отбрасывать.
  • Классовая дисциплина организации очередей, такая как NETEM, имеет настраиваемые внутренние модули.

2.2 Глобальные сети и задержка

  • В сетях есть несколько процессов и устройств, которые способствуют сквозной задержке между узлом-отправителем и узлом-получателем.
  • Во многих случаях сквозная задержка определяется задержкой распространения в глобальной сети.
  • Рассмотрим два соседних коммутатора A и B, соединённых глобальной сетью.
    • Как только бит передается в глобальную сеть коммутатором А, он должен пройти к коммутатору В.
    • Время, необходимое для распространения от начала глобальной сети до коммутатора В, является задержкой распространения.
    • Биты распространяются со скоростью канала.
    • Скорость распространения зависит от физической среды (оптоволокно, медная витая пара и т. д.) и равно или немного меньше скорости света.
    • Задержка распространения есть расстояние между двумя коммутатора, делённое на скорость распространения.
    • Как только последний бит пакета передается на коммутатор B, он и все предыдущие биты пакета сохраняются на коммутаторе B.
  • Сетевые инструменты обычно оценивают задержку для устранения неполадок и измерения производительности.
  • Например, оценкой сквозной задержки является время двойного оборота (RTT), которое представляет собой время, необходимое пакету для прохождения от отправителя к получателю, а затем обратно к отправителю.
  • RTT включает задержки распространения пакетов, задержки в очереди пакетов в промежуточных маршрутизаторах и коммутаторах и обработку пакетов.
  • Если задержка распространения преобладает над другими компонентами задержки (как в случае глобальных сетей), то RTT является хорошей оценкой задержки распространения.

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

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

  • В топологии используется сеть 10.0.0.0/8, назначенная Mininet по умолчанию.
  • Топология представляет собой коммутатор с двумя подключёнными к нему хостами.
  • Для запуска топологии используем параметры командной строки:
    sudo mn --topo=single,2 -x
    

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

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

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

4.1 Добавление/изменение задержки для эмуляции WAN

  • Работа с 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 Добавка задержки для интерфейса, подключающегося к WAN

  • Сетевые эмуляторы задают задержки на интерфейсе.

  • Например, задержка, вносимая в интерфейс коммутатора A, который подключён к интерфейсу коммутатора B, может представлять собой задержку распространения WAN, соединяющей оба коммутатора.

  • На хосте h1 введите следующую команду:

    sudo tc qdisc add dev h1-eth0 root netem delay 100ms
    
    • sudo: выполнить команду с более высокими привилегиями;
    • tc: вызвать управление трафиком Linux;
    • qdisc: изменить дисциплину очередей сетевого планировщика;
    • add: создать новое правило;
    • dev h1-eth0: указать интерфейс, на котором будет применяться правило;
    • netem: использовать эмулятор сети;
    • delay 100ms: задержка ввода 100 мс.
  • Эта команда добавляет задержку в 100 миллисекунд (мс) только к выходному интерфейсу.

  • Теперь пользователь может проверить, что соединение от хоста h1 к хосту h2 имеет задержку 100 миллисекунд, используя команду ping с хоста h1:

    ping 10.0.0.2
    
  • Все пакеты были получены успешно (0% потерь пакетов).

  • Задание: Запишите минимальное, среднее, максимальное и стандартное отклонение времени приёма-передачи (RTT).

  • Этот сценарий эмулирует задержку в 100 миллисекунд на интерфейсе узла h1, подключающегося к коммутатору.

  • Чтобы эмулировать глобальную сеть с двунаправленной задержкой, к соответствующему интерфейсу на хосте h2 также необходимо добавить задержку в 100 миллисекунд.

  • В терминале хоста h2 введите следующую команду:

    sudo tc qdisc add dev h2-eth0 root netem delay 100ms
    
  • Проверим, что соединение между хостом h1 и хостом h2 имеет RTT 200 миллисекунд (100 мс от хоста h1 к хосту h2 плюс 100 мс от хоста h2 к хосту h1), повторив команду ping на терминале хоста h1:

    ping 10.0.0.2
    
  • Все пакеты были получены успешно (0% потерь пакетов).

  • Задание: Запишите минимальное, среднее, максимальное и стандартное отклонение времени приёма-передачи (RTT).

4.4 Изменение задержки в эмулируемой глобальной сети

  • Изменим задержку со 100 миллисекунд до 50 миллисекунд как для отправителя, так и для получателя. RTT теперь будет 100 миллисекунд.
  • В терминале хоста h1 введите следующую команду:
    sudo tc qdisc change dev h1-eth0 root netem delay 50ms
    
  • Здесь добавлен новый параметр change, который изменяет ранее установленную задержку на 50 миллисекунд.
  • Применим также описанный выше шаг к терминалу хоста h2, чтобы изменить задержку на 50 мс:
    sudo tc qdisc change dev h2-eth0 root netem delay 50ms
    
  • Теперь можно проверить, что соединение от хоста h1 к хосту h2 имеет задержку 100 миллисекунд, используя команду ping с терминала хоста h1:
    ping 10.0.0.2
    
  • Все пакеты были получены успешно (0% потерь пакетов).
  • Задание: Запишите минимальное, среднее, максимальное и стандартное отклонение времени приёма-передачи (RTT).

4.5 Восстановление исходных значений (удаление правил)

  • Восстановим конфигурацию по умолчанию как для отправителя, так и для получателя, удалив все правила, применённые к сетевому планировщику интерфейса.
  • В терминале хоста h1 введите следующую команду:
    sudo tc qdisc del dev h1-eth0 root netem
    
  • Добавлена новая опция del, которая удаляет ранее установленные правила для данного интерфейса.
  • В результате tc qdisc восстановит значения по умолчанию для устройства h1-eth0.
  • Применим те же действия для удаления правил на хосте h2. В терминале хоста h2 введите следующую команду:
    sudo tc qdisc del dev h2-eth0 root netem
    
  • В результате дисциплина организации очереди tc восстановит свои значения по умолчанию для устройства h2-eth0.
  • Проверим, что соединение между хостом h1 и хостом h2 не имеет явно установленной задержки, используя команду ping с терминала хоста h1:
    ping 10.0.0.2
    
  • Все пакеты были получены успешно (0% потерь пакетов).
  • Задание: Запишите минимальное, среднее, максимальное и стандартное отклонение времени приёма-передачи (RTT).

4.6 Добавление джиттера в интерфейс подключения к WAN

  • В сетях нет постоянной задержки. Задержка может варьироваться в зависимости от других потоков трафика, конкурирующих за тот же путь.

  • Джиттер — это изменение времени задержки.

  • Параметры задержки описываются средним значением (\(\mu\)), стандартным отклонением (\(\sigma\)) и корреляцией.

  • По умолчанию NETEM использует равномерное распределение, так что задержка находится в пределах \(\mu \pm \sigma\).

  • Добавим задержку в 100 миллисекунд со случайным отклонением 10 миллисекунд.

  • Прежде чем сделать это, необходимо восстановите конфигурацию интерфейсов по умолчанию на узлах h1 и h2.

  • В терминале хоста h1 введите команду:

    sudo tc qdisc add dev h1-eth0 root netem delay 100ms 10ms
    
  • Добавленное здесь новое значение представляет джиттер, который определяет вариацию задержки.

  • Все пакеты, покидающие хост h1 через интерфейс h1-eth0, будут иметь задержку 100 мс со случайным отклонением ±10 мс.

  • Можно проверить, что соединение от хоста h1 к хосту h2 имеет задержку 100 мс со случайным отклонением ± 10 мс, с помощью команды ping на терминале хоста h1:

    ping 10.0.0.2
    
  • Все пакеты были получены успешно (0% потерь пакетов).

  • Задание: Запишите минимальное, среднее, максимальное и стандартное отклонение времени приёма-передачи (RTT).

  • В терминале хоста h1 введите следующую команду, чтобы удалить предыдущие конфигурации:

    sudo tc qdisc del dev h1-eth0 root netem
    

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

  • Параметр корреляции управляет отношением между последовательными псевдослучайными значениями.
  • Добавим задержку в 100 миллисекунд с вариацией ±10 миллисекунд при добавлении значения корреляции.
  • Прежде чем сделать это, необходимо восстановите конфигурацию интерфейсов по умолчанию на узлах h1 и h2.
  • В терминале хоста h1 введите следующую команду:
    sudo tc qdisc add dev h1-eth0 root netem delay 100ms 10ms 25%
    
  • Добавленное здесь новое значение представляет собой значение корреляции для джиттера и задержки.
  • Все пакеты, покидающие узел устройства h1 на интерфейсе h1-eth0, будут иметь время задержки 100 мс со случайным отклонением ±10 мс, при этом следующий случайный пакет зависит от предыдущего на 25%.
  • Можно проверить соединение между хостами h1 и h2 с помощью команды ping на терминале хоста h1:
    ping 10.0.0.2
    
  • Все пакеты были получены успешно (0% потерь пакетов).
  • Задание: Запишите минимальное, среднее, максимальное и стандартное отклонение времени приёма-передачи (RTT).
  • В терминале хоста h1 введите следующую команду, чтобы удалить предыдущие конфигурации:
    sudo tc qdisc del dev h1-eth0 root netem
    

4.8 Распределение задержки

  • NETEM позволяет пользователю указать распределение, которое описывает, как задержки изменяются в сети.
  • Обычно задержки неравномерны, поэтому может быть удобно использовать неравномерное распределение, такое как нормальное, парето или парето-нормальное.
  • Можно указать нормальное распределение задержки в эмулируемой сети.
  • Прежде чем сделать это, необходимо восстановите конфигурацию интерфейсов по умолчанию на узлах h1 и h2.
  • В терминале хоста h1 введите следующую команду:
    sudo tc qdisc add dev h1-eth0 root netem delay 100ms 20ms distribution normal
    
  • Добавленная здесь новая опция (distribution) задаёт тип распределения задержки.
  • Определим задержку так, чтобы она имела нормальное распределение, что обеспечивает более реалистичную эмуляцию сетей WAN.
  • Все пакеты, покидающие хост h1 на интерфейсе h1-eth0, будут иметь время задержки, которое распределяется в диапазоне 100 мс ± 20 мс.
  • Используем команду ping на терминале хоста h1:
    ping 10.0.0.2
    
  • Все пакеты были получены успешно (0% потерь пакетов).
  • Задание: Запишите минимальное, среднее, максимальное и стандартное отклонение времени приёма-передачи (RTT).
  • В терминале хоста h1 введите следующую команду, чтобы удалить предыдущие конфигурации:
    sudo tc qdisc del dev h1-eth0 root netem
    

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

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

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

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

5.2 Добавка задержки для интерфейса, подключающегося к WAN

  • Создадим каталог simple-delay:
    mkdir -p ~/work/lab_netem_i/simple-delay
    cd ~/work/lab_netem_i/simple-delay
    
  • Создадим скрипт для эксперимента lab_netem_i.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 delay\n')
        h1.cmdPrint( 'tc qdisc add dev h1-eth0 root netem delay 100ms' )
        h2.cmdPrint( 'tc qdisc add dev h2-eth0 root netem delay 100ms' )
    
        time.sleep(10)  # Wait 10 seconds
    
        info( '*** Ping\n')
        h1.cmdPrint( 'ping -c 100', 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
    
  • Посмотрите график.
  • Вычислите минимальное, среднее, максимальное и стандартное отклонение времени приёма-передачи.

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

Предыдущий
Следующий