twping-go

module
v1.3.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 5, 2026 License: Apache-2.0

README

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; этот порт завершил каждый прогон.

Directories

Path Synopsis
cmd
twping command
Команда twping измеряет двусторонние задержки до сервера TWAMP (RFC 5357).
Команда twping измеряет двусторонние задержки до сервера TWAMP (RFC 5357).
Пакет twping измеряет двусторонние задержки до сервера TWAMP (RFC 5357).
Пакет twping измеряет двусторонние задержки до сервера TWAMP (RFC 5357).

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL