Skip to content
akprof2000Public

About

Клиент TWAMP (RFC 5357) на Go — порт twping из perfSONAR owamp. Все четыре режима сессии, статистика как у оригинала, без потерь на 5 kpps.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

twping-go

Реализация на Go клиента TWAMP (RFC 5357) twping, портированного с C-реализации perfSONAR owamp. Клиент говорит на TWAMP-Control по TCP/862 и на тестовом протоколе TWAMP по UDP, а статистику выдаёт ту же, что и оригинал.

CI License

Сведения об авторстве оригинала — в файле NOTICE.

Установка

Скачайте готовый бинарник для Windows, Linux или macOS из последнего релиза или установите через Go:

go install github.com/akprof2000/twping-go/cmd/twping@latest

В каждом архиве релиза лежит бинарник плюс README.md, LICENSE и NOTICE; загрузку можно проверить по файлу SHA256SUMS, публикуемому рядом.

Сборка из исходников

go build -o twping ./cmd/twping

Проект собирается под Windows, Linux и macOS без внешних зависимостей — только стандартная библиотека. Скрипт scripts/build-release.sh собирает полный набор архивов релиза.

Документация

Документ Содержание
docs/PROTOCOL.md Форматы на проводе, смещения байтов, выработка ключей, расписание и определения статистик
docs/TESTING.md Набор тестов и стенд на Docker для проверки совместимости и нагрузочных прогонов
CHANGELOG.md История релизов

Использование

twping [аргументы] тест-адрес [адрес-сервера]

тест-адрес — отражатель, адрес-сервера — управляющий сервер; если он не указан, используется тест-адрес. Полный список параметров — twping -h.

twping -c 100 -i 0.1 twamp.example.net

Флаги те же, что у оригинала: -c количество пакетов, -i средний интервал между пакетами, -L порог потери, -s заполнение, -P диапазон локальных портов, -D DSCP, -z отложенный старт, -A/-u/-k аутентификация, -a дополнительные процентили, -b ширина корзины гистограммы, -n единицы измерения, -M машиночитаемая сводка, -R сырые записи, -v[=N] задержки по каждому пакету, -U метки времени UNIX, -Q без статистики, -Z обнулённые адреса для прохождения NAT, -4/-6 семейство адресов, -S/-B локальный адрес или интерфейс.

Режимы

Реализованы все четыре режима TWAMP: открытый, с аутентификацией, шифрованный и смешанный (шифрованное управление при тестовых пакетах в открытом формате). Как и в оригинале, шифрующие режимы предлагаются только при указанном идентификаторе:

twping -u alice -k /etc/twamp/passphrases -A E -c 100 twamp.example.net

Использование как библиотеки

Пакет twping выполняет замер по тем же аргументам, что и утилита, и пишет результат в переданный writer. Отмена контекста прерывает идущую сессию, не убивая процесс; своих обработчиков сигналов пакет не ставит.

import (
    "context"
    "os"

    "github.com/akprof2000/twping-go/twping"
)

err := twping.Run(context.Background(),
    []string{"-c", "100", "-i", "0.1", "twamp.example.net"},
    os.Stdout, os.Stderr)

Run печатает сводку подписями оригинального twping из perfSONAR — на них рассчитаны инструменты, которые её разбирают. Русский вариант выбирается через twping.RunLang(ctx, args, out, errOut, owamp.Russian); именно его использует сама утилита.

Пакет owamp даёт более низкий уровень — управляющее соединение, тестовую сессию и накопитель статистики — если нужен свой цикл замера, а не готовый разбор аргументов.

Флаги, которых нет в оригинале

Флаг Значение
--spin мкс Верхняя граница окна активного ожидания перед каждой отправкой по расписанию. Для каждого пакета ограничивается четвертью интервала до предыдущего. По умолчанию 200 мкс (1500 мкс в Windows, где таймеры грубее). Значение 0 отключает активное ожидание и оставляет только таймер ОС.
--sync Считать локальные часы синхронизированными. Без этого флага клиент печатает (без синхронизации), поскольку в Go нет переносимого способа опросить локальный демон NTP.
--esterror мкс Оценка погрешности локальных часов; включает --sync.

Отличия от оригинала на C

  • Синхронизация часов. Клиент на C читает состояние NTP в ядре (ntp_adjtime), чтобы заполнить оценку погрешности и бит синхронизации. В Go переносимого аналога нет, поэтому этот клиент сообщает «без синхронизации», если не указано иное через --sync или --esterror. Все остальные поля метки времени на проводе совпадают.
  • Число хопов обратного пути. Чтение принятого IP TTL требует вспомогательных данных сокета; это реализовано для Linux и macOS. На прочих системах, включая Windows, число хопов обратного пути помечается как «не сообщается». Число хопов до отражателя, которое отражатель кладёт внутрь пакета, работает всегда, а исходящий TTL выставляется в 255, как требует RFC 4656.
  • Нет файлов сессий. twping на C пишет файлы сессий в формате owamp и использует общий движок статистики с owstats и owfetch. Этот порт считает статистику в своём процессе; -F записывает поток сырых записей в текстовом формате -R, а не двоичный формат сессий owamp.
  • Подсводки сессии. Параметр -N принимается, но пока не реализован.
  • Параллелизм. Отправка и приём работают в отдельных горутинах, поэтому метка времени ответа снимается сразу по его приходу, а не после очередного решения планировщика отправки. На высоких скоростях это заметно улучшает точность и поведение при потерях — см. ниже.
  • Язык вывода. Справка и сообщения об ошибках выводятся на русском языке. Человекочитаемая сводка утилиты тоже русская, а библиотечный вызов twping.Run печатает подписи оригинального twping — см. раздел «Использование как библиотеки». Машинный формат -M и формат сырых записей -R сохранены без изменений, включая имена полей, чтобы оставалась совместимость с внешними разборщиками и с оригиналом.

Тестирование

go test ./...

В набор входит отражатель TWAMP, работающий внутри процесса, поэтому установление управляющей связи, все четыре режима, форматы тестовых пакетов, учёт потерь и дубликатов, а также оба формата вывода проверяются сквозным образом без внешнего сервера.

Совместимость и нагрузочные прогоны против настоящего сервера

Каталог testing/ собирает образ Docker с оригинальным сервером perfSONAR twampd и клиентом twping (компилируются из исходников) рядом с этим клиентом, так что оба работают в одинаковом окружении:

cd testing
GOOS=linux GOARCH=amd64 go build -o twping-go ../cmd/twping
docker build -f Dockerfile.owamp -t twamp-ref .
docker network create twamp-net
docker run -d --name twamp-server --network twamp-net twamp-ref
docker run --rm --network twamp-net twamp-ref loadtest.sh twamp-server 3

Оба клиента работают с одним и тем же twampd, а их вывод в форматах -R и -M совпадает поле за полем.

Измеренные результаты

Против twampd через сетевой мост Docker, по два прогона на сценарий:

Сценарий Клиент Время, с CPU, с RSS, КБ Отправлено Потеряно Медиана RTT
1 kpps, 1 000 пак. twping (C) 3.0 0.13 2 592 1 000 0 0.80 мс
twping-go 3.0 0.29 9 256 1 000 0 0.25 мс
1 kpps, 5 000 пак. twping (C) 7.0 0.70 2 528 5 000 0 0.90 мс
twping-go 7.1 1.49 9 292 5 000 0 0.25 мс
2 kpps, 10 000 пак. twping (C) 7.0 0.97 2 848 10 000 0 3.7 мс
twping-go 7.1 2.26 11 736 10 000 0 0.15 мс
5 kpps, 20 000 пак. twping (C) 6.1 1.09 3 952 20 000 19 022 нет данных
twping-go 6.0 2.34 14 072 20 000 0 0.15 мс
1 kpps, заполнение 1 000 Б twping (C) 7.2 0.79 2 520 5 000 0 0.90 мс
twping-go 7.1 1.83 9 296 5 000 0 0.25 мс

Кратко:

  • Пропускная способность. На 5 000 пакетов/с клиент на C теряет около 95 % сессии, поскольку его единственный цикл чередует планирование и приём; этот порт не теряет ничего. До 2 000 пакетов/с оба работают без потерь.
  • Точность. Измеренная медиана RTT здесь в 3-20 раз ниже, а максимум — на порядок ниже. Разница объясняется задержкой планирования на стороне клиента, а не сетью: выделенная горутина приёма убирает задержку между приходом ответа и снятием его метки времени.
  • Стоимость. Расход процессора примерно вдвое выше, чем у клиента на C, а резидентная память — примерно вчетверо (большая часть последней приходится на среду исполнения Go). На таких скоростях процессор занят в основном системными вызовами на каждый пакет, а не средой исполнения Go или активным ожиданием: на Linux вариант --spin 0 расходует примерно столько же процессора, сколько режим по умолчанию.
  • Клиент на C под нагрузкой иногда не выдавал статистику вовсе — в сыром выводе стенда это видно как строки nan; этот порт завершил каждый прогон.

About

Клиент TWAMP (RFC 5357) на Go — порт twping из perfSONAR owamp. Все четыре режима сессии, статистика как у оригинала, без потерь на 5 kpps.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages