
Чтобы создать тяжелые условия мы нашли и применили специализированный инструмент WANem, о котором я расскажу под катом.
Что такое WANem?
Это дистрибутив на основе knoppix, который позволяет эмулировать различные условия сетевого подключения клиентов. В первую очередь, это полезно для тестирования и отладки приложений, которым предстоит работать в не-пойми-каких условиях без физического погружения в эти самые условия.
Правила для работы можно создавать как вручную, так и через более-менее удобный web-интерфейс.
Как применять WANem?
Взять любую систему виртуализации и загрузить в ней LiveCD. Или, если вы используете решения VMWare — скачать готовую виртуальную машину. В дальнейшем я буду исходить из загрузки с LiveCD.
Подготовка WANem
- Создаем новую виртуальную машину (1core/256ram будет вполне достаточно), указываем источником загрузки LiveCD
- Подтверждаем загрузку с LiveCD
- Подтверждаем конфигурацию всех сетевых интерфейсов через DHCP (или отказываемся, и позже указываем IP вручную)
- Стартовый скрипт создает юзера perc и спрашивает, какой пароль ему установить (ssh разрешен по умолчанию)
- Указав пароль, мы можем подключиться к SSH
- Мы попадаем в интерфейс командной строки WANem. Начнем с простой команды help, которая выведет список всех доступных команд с их кратким описанием
- help — вывод помощи
- about — вывод версии и копирайтов
- clear — очистка экрана
- reset — сброс сетевых настроек и перезапуск сервисов
- shutdown — выключение системы
- restart — перезапуск системы
- status — вывод текущего статуса системы (IP-адреса, маршруты, состояния сервисов)
- wanemreset — сброс правил самого WANem (если вы там намудрили злого и доступ к web-интерфейсу плохо работает)
- assign — указать IP-адрес вручную (если ранее отказались от DHCP)
- quit — выйти из консоли WANem

- WANalyzer — простое средство проверки параметров и свойств соединения, выдающее вот такие результаты
- Basic Mode — простой режим настроек эмуляции, позволяющий ограничить пропускную способность и добавить задержку обработки пакетов в миллисекундах
- Advanced Mode — расширенный режим настроек эмуляции, позволяющий указывать не только более детальные настройки, но и их временное распределение, что приближает эмуляцию еще на шаг ближе к реальности.
- Save/Restore — сохранение текущих настроек в локальный файл профиля для повторного использования (пример формата)
Проверка работоспособности

- Windows: route add 0.0.0.0 mask 0.0.0.0 WANemIPaddress
- Debian: route add default gw WANemIPaddress eth0
- Всякие другие ОС: http://tinyurl.com/4yovdph
После этого нехитрого действия достаточно сделать traceroute от тестовой машины до внешнего мира и убедиться, что первый хоп — это IP виртуалки с WANem и что задержка пакетов ±совпадает с заданной в настройках.
Тонкая настройка

Заранее расшифрую самые непонятные опции:
- MTTF — среднее время до возникновения ошибки
- MTTR — среднее время до восстановления после ошибки
- Jitter — в контексте IP-сетей термин детально раскрыт в RFC 3393, а вкратце — это разница (в миллисекундах) между задержкой доставки пары пакетов
Например можно задать параметры пропадания и восстановления связи, можно сэмулировать наличие соединения но непрохождение пакетов с данными, потерю или повреждение % пакетов.
При необходимости WANem может работать с несколькими сетевыми интерфейсами одновременно (создавая для них разные правила), что позволяет реализовать самую изощренную сетевую конфигурацию.
Альтернативы WANem
Мне известен платный продукт для Windows, под названием SoftPerfect Connection Emulator ($99/$149).
UPD: Для OS X goshakkk_reborn рекомендует Network Link Conditioner из XCode.
UPD: Для Windows x1shn1k подсказал также TMnetSim Network Simulator (freeware, есть версии ×32 и ×64)
Выводы
Отличный, достаточно простой и эффективный инструмент. Мне лично немного не хватает логирования на стороне WANem, но подозреваю, что это решается third-party утилитами, с которыми еще предстоит разобраться.
Вот пара примеров профилей, которые мы использовали для тестов: CDMA EV-DO rev.A, EDGE.
Официальный сайт: wanem.sourceforge.net, дистрибутив ~400мб
Последняя версия: 2.3, 15.03.2011