Использование netem. Потери пакетов, дублирование пакетов, изменение порядка, повреждение пакетов.
1 Общая информация
1.1 Цели
- Освоить моделирование следующих параметров сети: потеря пакетов, дублирование пакетов, изменение порядка и повреждение пакетов.
1.2 Задачи
- В ходе работы требуется освоить следующие умения:
- эмуляция сети, характеризующихся такими параметрами, как задержка, потеря пакетов, повреждение пакетов, переупорядочивание пакетов и дублирование пакетов;
- измерение производительности глобальных сетей, характеризующихся различными значениями параметров.
1.3 Видео: Использование netem II. Введение
2 Теоретические сведения
2.1 Проблемы с передачей пакетов
- Потеря пакета
- Пакет, проходящий через сеть, не достигает пункта назначения.
- Распространённой причиной потери пакетов является неспособность маршрутизаторов удерживать пакеты, поступающие со скоростью, превышающей скорость отправления.
- Маршрутизатор ограничен объёмом буферной памяти, используемой для мгновенного хранения пакетов.
- Когда происходит потеря пакетов, TCP уменьшает окно перегрузки и, следовательно, пропускную способность вдвое.
- Переупорядочивание пакетов
- Пакеты принимаются в порядке, отличном от того, в котором они были отправлены.
- Переупорядочивание пакетов (неупорядоченная доставка пакетов) обычно является результатом того, что пакеты следуют по разным маршрутам для достижения пункта назначения.
- Переупорядочивание пакетов может ухудшить пропускную способность TCP-соединений в сетях с высокой пропускной способностью и высокой задержкой.
- Для каждого сегмента, полученного не по порядку, получатель TCP отправляет подтверждение (ACK) для последнего правильно принятого сегмента.
- Как только отправитель TCP получает три подтверждения для одного и того же сегмента (тройной дубликат ACK), отправитель считает, что получатель неправильно принял пакет, следующий за пакетом, который подтверждается три раза.
- Тогда отправитель уменьшает окно перегрузки и пропускную способность в два раза.
- Повреждение пакета
- Повреждение битов, составляющих пакет.
- Обычно происходит на физическом уровне.
- В случае повреждения некоторые биты могут иметь значения, отличные от первоначально отправленных узлом-отправителем.
- Узел получателя отбрасывает такие пакеты.
- Процесс-отправитель TCP не получит подтверждения для соответствующего сегмента и будет считать его потерянным сегментом.
- Отправитель уменьшает окно перегрузки и пропускную способность в два раза.
- Дублирование пакетов
- Несколько копий пакета присутствуют в сети и принимаются пунктом назначения.
- Дублирование пакетов является результатом повторных передач, когда узел-отправитель повторно передает неподтвержденные (NACK) пакеты.
3 Подготовка стенда
3.1 Лабораторная топология
В топологии используется сеть 10.0.0.0/8, назначенная Mininet по умолчанию.
Топология представляет собой коммутатор с двумя подключёнными к нему хостами.
Для запуска топологии (рис. 1) используем параметры командной строки:
1sudo mn --topo=single,2 -x
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
: - Создадим скрипт для эксперимента
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
: - Зададим права доступа:
1chmod +x ping_plot
- Создадим
Makefile
: - Выполним эксперимент:
1make
- Посмотрите график.
- Вычислите минимальное, среднее, максимальное и стандартное отклонение времени приёма-передачи.
- Очистите каталог от результатов проведения экспериментов:
1make clean