В этой лабораторной нас ждёт знакомство с утилитой tc
(traffic control).
Она является частью пакета iproute2
и представлена в большинстве дистрибутивов Linux.
Говорящее название утилиты не врёт. А самый важный аспект управления трафиком для нас - эмуляция поведения сети. Разрабатывая приложение локально, мы используем loopback интерфейс, а это почти самые идеальные условия из возможных. Это позволяет легко забыть, как неблагоприятен реальный мир. И разработать ПО, которое не будет в нём корректно функционировать.
Мобильный телефон посреди поля, далеко за пределами крупного города, вряд ли сможет найти 5G с максимальным уровнем сигнала. Хорошо, если это будет сеть третьего поколения больше, чем с одной “палочкой”. В такой ситуации страдает не только пропускная способность канала, но и количество потерь, целостность пакетов.
Как много клиентов будут пользоваться нашим приложением в таких условиях? В полях нужно наслаждаться природой, а не в телефоне сидеть! Трактор от John Deere или их конкурентов, может выступить в роли несогласного телефона, уверенного работающего в поле.
К сожалению, есть примеры плохих сетевых условий, куда более близкие к повседневной жизни. Неудачно расставленные WiFi точки доступа в офисе и учебном кампусе. Многоквартирные дома с “шумными” WiFi каналами. Проводное подключение тоже не решение всех проблем. Провод, неудачно проложенный рядом с силовой линией, может иметь количество потерь не совместимое с его работоспособностью.
Traffic control позволяет имитировать проблемы возникающие во всех вышеупомянутых условиях. И ещё чуть-чуть.
Задержка
Прежде, чем вносить изменения снимем исходные показания.
ping -c 10 github.com
C большой вероятностью, обошлось без потерь пакетов, а значения задержки могут быть меньше одной миллисекунды.
Добавим константную задержку:
tc qdisc add dev eth0 root netem delay 200ms
К значениям задержки добавятся те самые 200 мс. Если упражнение выполняется на удалённом сервере, то ощутимой должна стать и задержка при работе по ssh. Ведь и это тоже сетевое взаимодействие, а мы только что добавили по 1/5 секунды на каждый вывод информации пользователю.
Вывод текущего состояния:
tc qdisc show dev eth0
Очистка всех egress правил
tc qdisc del dev eth0 root
Добавим правило с динамическим распределением задержки:
tc qdisc add dev eth0 root netem delay 50ms 5ms
Изменим имеющееся правило, добавив корреляцию (TODO: докинуть, кого и с кем и зачем)
tc qdisc change dev eth0 root netem delay 50ms 5ms 25%
Также можно указать тип распределения (normal
, pareto
и paretonormal
):
tc qdisc change dev eth0 root netem delay 50ms 10ms distribution normal
Потеря пакетов
tc qdisc add dev eth0 root netem loss 10%
Перемешивание пакетов
reorder
Повреждение пакетов
Имитируем изменение одного случайного бита:
tc qdisc change dev eth0 root netem corrupt 5%
Дyбликация пакета
tc qdisc change dev eth0 root netem duplicate 1%
Ограничение пропускной способности
tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms
Extra
Как губить не всю сеть - фильтры