Наблюдать, не вмешиваясь: неинтрузивный мониторинг SRT изнутри

Наблюдать, не вмешиваясь: неинтрузивный мониторинг SRT изнутри

Дисклеймер: На момент публикации статьи решение всё ещё находится в активной разработке и проходит расширенное тестирование. Отдельные технические детали могут быть уточнены в последующих релизах.

Что такое неинтрузивный мониторинг

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

Зонд не устанавливает отдельную сессию до источника и не создаёт промежуточных соединений, в отличие от решений на базе relay или proxy.

Преимущества данного подхода

  1. Зонд мониторит только желаемую сессию.
  2. Зонд не создает вторую сессию, а значит не удваивает трафик и нагрузку на источник.
  3. Не используется relay/proxy — нет дополнительной задержки и не увеличивается вероятность отказа.

Но есть и минусы

  1. Требуется настройка как зонда, так и коммутационного оборудования. Необходимы компетенции сетевого инженера.
  2. Измерения на стороне приёмника могут отличаться от данных мониторинга. Тем не менее этот подход остается более точным, чем создание отдельной сессии мониторинга для оценки QoS.
  3. Запуск задач мониторинга не всегда тривиален (подробнее об этом далее).
  4. Мониторинг зашифрованных потоков может вызвать сложности или оказаться невозможным.

Тем не менее преимущества этого подхода перевешивают указанные недостатки и хорошо соответствуют ожиданиям пользователей.

Что такое зонд?

Boro зонд — это программное обеспечение, предназначенное для работы на x86-совместимых машинах под управлением Windows или Linux. Как правило, он разворачивается на отдельном сервере и устанавливается в качестве сервиса. Сервер оснащается требуемым количеством сетевых адаптеров с необходимым максимальным битрейтом, через которые зонд получает потоки.

Приложение также можно устанавливать непосредственно на кодерах, передатчиках, приёмниках и другом оборудовании при условии, что оно работает на платформах x86 под управлением Windows или Linux.

Зонд Boro принимает поток и собирает детальные метаданные о параметрах QoS и QoE. Статистика — не сами потоки — передаётся на сервер Boro, который обычно разворачивается на отдельной машине. Сервер обеспечивает управление зондами, визуализацию данных в виде графиков и таблиц, а также настройку триггеров и оповещений.

Способы доступа к данным при неинтрузивном мониторинге

Неинтрузивный мониторинг может быть реализован несколькими способами. Все эти подходы объединяет общий принцип: они не создают отдельную сессию. В идеале мониторинг не должен прерывать уже установленные сессии.

Network TAP (Test Access Point)

Network TAP — это аппаратное устройство, которое встраивается в сетевой кабель для пассивного копирования всего трафика в обоих направлениях. Оно позволяет осуществлять мониторинг, анализ безопасности или диагностику без нарушения работы основного потока данных. В отличие от SPAN-портов TAP-устройства работают как идеальные зеркала сетевого трафика и не теряют пакеты.

Это могут быть как простые пассивные устройства, которые вставляются в разрез кабеля, так и более сложные устройства с агрегацией нескольких портов в один и прочими функциями. Основной момент, который следует учитывать: данный подход требует установки дополнительного оборудования, физически разделяющего сеть, и может стать дополнительной точкой отказа.

Зеркалирование портов (SPAN)

Зеркалирование портов, также известное как SPAN (Switched Port Analyzer), — это функция мониторинга сетевого трафика, которая копирует пакеты с одного или нескольких исходных портов на порт назначения. Устройство мониторинга, подключённое к этому порту, может анализировать трафик без нарушения работы сети.

Практически все современные коммутаторы поддерживают эту функцию. Основное преимущество состоит в том, что дополнительное оборудование не требуется, так как коммутатор обычно уже присутствует в сети.

Однако потеря пакетов на зеркалируемом порту остаётся потенциальной проблемой. Это может происходить по двум причинам:

  1. Зеркалируемый порт имеет более низкий приоритет по сравнению с другими портами и при высокой нагрузке будет первым терять пакеты.
  2. Зеркалирование может направлять на порт назначения объёмы трафика, превышающие его пропускную способность.

Установка непосредственно на источник или приёмник

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

В какой точке отбирать SRT-сигнал?

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

В таком случае необходимо логировать два набора данных: текущая картина в точке измерения и с учетом перезапроса со стороны приемника.

Приложению Boro-зонда не важно, каким способом сигнал отводится на мониторинг. Ниже в качестве примера рассмотрим получение данных через зеркалирование трафика.

Особенности работы зонда при захвате данных через SPAN

На схеме ниже мониторинг осуществляется в промежуточной точке ближе к приёмнику. К коммутатору, к которому подключён SRT-приёмник, также подключается машина с зондом.

Схема мониторинга SRT-сессии путем зеркалирования трафика

Рис. 1. Схема мониторинга SRT-сессии путем зеркалирования трафика.


Коммутационное оборудование должно поддерживать технологию Port Mirroring (SPAN). Данное решение позволяет дублировать весь трафик, поступающий на порт, к которому подключен приемник SRT сигнала, на порт, к которому подключен зонд. При настройке зеркалирования необходимо указать, что копируется как входящий, так и исходящий трафик, так как SRT-протокол двунаправленный.

Если зонд, как в нашем случае, запущен на отдельном сервере, он не может принимать дублированный трафик обычным способом. Зеркалированные пакеты адресованы другим получателям и не могут быть приняты через обычные сокеты (стандартный API для сетевого взаимодействия). Обычно такие пакеты будут отброшены фильтрами сетевой карты или сетевой подсистемой ОС.

Поэтому зонд при работе с захватом трафика должен переводить сетевую карту в неразборчивый режим (promiscuous mode). В этом режиме карта принимает весь трафик, приходящий на порт, а не только тот, что предназначен конкретно этой машине. Дополнительно зонд использует библиотеку захвата пакетов PCAP (Packet Capture API) — она позволяет перехватить трафик до того, как он пройдёт через сетевые фильтры операционной системы. При этом у PCAP есть собственный набор фильтров, с помощью которых можно выделить нужную SRT-сессию и передать её на дальнейший анализ.

Запуск задач мониторинга на зонде

Мониторинг через захват пакетов — процесс нетривиальный, поэтому система запуска задач в зонде сделана достаточно гибко.

Пользователь может указать полный набор параметров захвата: srcIP:port + dstIP:port (4-tuple), а может — только часть: srcIP:port или dstIP:port. Порт указывается обязательно. Дополнительно задаётся тип протокола захватываемого потока — в нашем случае это SRT.

В текущей реализации мы тестировали работу с соединениями в режимах Caller–Listener. Это означает, что как минимум один IP-адрес всегда известен. Ещё один важный момент: одна сессия всегда работает в рамках одного соединения с неизменным 4-tuple. Рукопожатие, передача команд, перезапрос пакетов, полезные данные — всё идёт через одно соединение.

Приведем пару примеров для наглядности.

Пример 1

Зонд стоит рядом с приёмником в режиме Caller, сессия между пирами уже запущена. Нам достоверно известны IP-адрес и порт источника, а также IP-адрес приёмника. Порт приёмника неизвестен. Указав известные параметры, мы запускаем задачу, которая точно выделит нужную сессию — даже если на приёмнике параллельно работает ещё одна сессия в режиме Caller.


Пример 2

Зонд стоит рядом с приёмником в режиме Listener. К нему пока никто не подключён, и мы знаем только IP и порт приёмника. Указываем пару dstIP:port — зонд создаёт master-задачу, которая слушает весь поток на этой паре. Как только первый Caller подключается, master-задача захватывает пакеты и, убедившись, что это SRT-протокол, автоматически создаёт подзадачу анализа. Первые захваченные данные передаются в неё сразу — это позволяет сохранить Handshake control packets. Для каждого следующего Caller-источника создаётся новая подзадача.

Мониторинг SRT

Протокол SRT оказался довольно удобным для сниффинга в Boro:

  1. используется небольшое число понятных команд;
  2. шифрование затрагивает только пакеты с данными;
  3. при получении сессионных ключей не используются алгоритмы perfect forward secrecy;
  4. работа ведётся в рамках одного порта;
  5. данные передаются в формате MPEG-TS.

После захвата в задачу мониторинга попадают пакеты, относящиеся только к конкретной сессии. Их нужно разобрать согласно SRT-спецификации. Как и SRT-приёмник, зонд организует буфер, в котором накапливаются принятые пакеты. Если анализатор видит перезапрошенный пакет, он логирует это действие. Перезапрошенные пакеты помещаются в буфер, если нужная позиция ещё не была из него вытеснена. Так формируется восстановленный поток данных.

Дальше полученный транспортный поток направляется на классический анализ — как если бы это был обычный мультикаст: измеряется IAT, проверяется целостность потока, параметры TR 101 290 и так далее, вплоть до проверки QoE. Помимо этого, зонд логирует набор метрик, идентичный стандартному способу мониторинга SRT, включая Estimated Bandwidth и RTT (на основе захвата ACK-пакетов).

Пока мы описали процесс мониторинга в общих чертах, дальше остановимся на наиболее значимых деталях.

Как понять, что отфильтрованный поток — это SRT?

Даже если SRT-поток зашифрован, заголовки пакетов остаются открытыми. Этим зонд и пользуется. Сначала он ищет предполагаемый SRT-заголовок и проверяет поле Socket ID — его значение должно повторяться от пакета к пакету. Затем зонд изучает поля со счётчиками, которые должны возрастать. Если оба условия выполняются, можно с высокой вероятностью утверждать, что пакеты принадлежат SRT-протоколу.

Шифрованный SRT

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

Почему это важно? В режиме Caller–Listener именно Caller инициирует сессию, отправляя Handshake control packets для обмена конфигурациями и согласования параметров соединения. Если выбран режим с шифрованием, эти пакеты будут содержать Key Material Message — информацию, необходимую для кодирования и декодирования потока. Перехватив пакеты рукопожатия, зонд получает полный набор данных для декодирования потока: ключи, векторы и пароль.

Периодически пиры выполняют ротацию ключей. Зонд захватывает новые ключи и применяет их в нужный момент.

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

Шифрование — один из ограничивающих факторов для неинтрузивного мониторинга. Но, как видно, это препятствие вполне преодолимо. Главное — соблюдать последовательность запуска процессов.

Проблема мультиплексированных потоков

SRT-протокол поддерживает мультиплексированные потоки: несколько SRT-сокетов могут использовать один и тот же UDP-сокет. Пакеты, приходящие на этот UDP-сокет, корректно распределяются по целевым SRT-сокетам. Во время рукопожатия стороны обмениваются своими SRT Socket ID, которые затем указываются в поле Destination SRT Socket ID каждого пакета.

Допустим, в сессии передаётся мультиплекс из двух потоков. Зонд будет захватывать пакеты с четырьмя идентификаторами: два для данных, два для команд.

Без захвата Handshake control packets невозможно определить, какому потоку принадлежит тот или иной идентификатор. Та же проблема касается измерений RTT и Estimated Bandwidth — зонд отслеживает измерительные пакеты, которые тоже содержат Socket ID.

Как и с шифрованием, мониторинг мультиплексированных потоков требует соблюдения последовательности процессов: сначала необходимо запустить задачу мониторинга, а затем организовать SRT сессию.

Размер буфера

Размер буфера — ключевая метрика при анализе SRT путём сниффинга. Критически важно, чтобы он совпадал со значением, о котором договорились приёмник и передатчик. Только тогда картина восстановления пакетов в задаче мониторинга будет идентична тому, что происходит на приёмнике.

На этапе переговоров пиры выбирают наибольший из двух размер буфера и передают его в Handshake control packets. Зонд будет использовать именно это значение. Но на случай, если перехватить Handshake control не удается, в форме добавления задачи есть поле «Размер буфера» — пользователь заполняет его вручную перед запуском.

Параметры мониторинга

Ниже приведён список специфичных для SRT метрик, которые удалось собрать путем неинтрузивного мониторинга.

Анализатор вычисляет самостоятельно:

  1. Maximum Inter-packet Arrival Time (IAT) — для пакетов с данными
  2. SRT Packet Loss
  3. SRT Packet Drop — измеряется на стороне задачи мониторинга и может не совпадать со статистикой на стороне приемника
  4. SRT Packet Receive
  5. SRT Packet Retransmit
  6. SRT Retransmit Rate
  7. SRT Bitrate
  8. SRT RcvBuf
  9. SRT Latency

Зонд извлекает из перехваченных ACK-пакетов:

  1. SRT Bandwidth
  2. SRT Smoothed round-trip time (SRTT)

Зонд извлекает из перехваченных NAK-пакетов (дополнительно к тому, что вычисляется на стороне зонда):

  1. SRT Packet Loss

Кодовая база

Неинтрузивный мониторинг даёт серьёзные преимущества перед другими способами, но требует существенных вложений в разработку.

Мы не можем взять готовую библиотеку libsrt и модифицировать ее, так как она базируется на стандарте, который подразумевает последовательный обмен данными как на этапе рукопожатия, так и на этапе отправки данных от источника к приемнику. Работа с сокетами архитектурно заложена в библиотеку.

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

Далее зонд разбирает пакеты на команды и данные согласно стандарту SRT и собирает принятый поток — аналогично тому, как это делает приёмная сторона.

Поэтому библиотека приема была практически полностью написана командой Elecard. Из libsrt используется лишь небольшой набор функций — примерно 7–10% кода. И ещё один важный момент: мы не отходим от стандарта SRT, не расширяем и не модифицируем его. Зонд не отправляет ни единого пакета в исследуемую сессию и использует немодифицированную библиотеку libsrt.

Производительность

К сожалению, на момент написания статьи масштабных тестов ещё не проводилось. Однако система захвата пакетов в зонде существует достаточно давно и успела собрать подводные камни. PCAP-процесс выполняется на одном ядре процессора и в среднем способен обрабатывать до 2 Гбит/с входящего трафика. В последнем релизе зонда был добавлен интеллектуальный алгоритм, который при необходимости создаёт несколько процессов, чтобы захват не становился бутылочным горлышком.

Задача PCAP-процесса — только отобрать пакеты, принадлежащие определенной сессии. Дальнейшая обработка передаётся другим процессам. На данном этапе можно сказать, что анализ путем сниффинга будет сопоставим по производительности с классическим анализом SRT. Наибольшую нагрузку всегда создаёт декодирование видео и углублённый анализ QoE, который в разы и десятки раз более трудоемок, чем прием данных. Декодирование видео в любых подходах мониторинга идентично.

Выводы

Неинтрузивный мониторинг SRT-протокола — перспективное и давно ожидаемое решение. Даже при наличии определенных ограничений и относительных сложностей с настройкой системы его достоинства полностью перекрывают недостатки. Как показали исследования, такой способ позволяет собрать все метрики сигнала, которые были доступны при классическом мониторинге SRT.

Стоит подчеркнуть еще один важный фактор: стоимость неинтрузивного мониторинга практически идентична стоимости обычного, так как не требует увеличения производительности аппаратной части зонда. Кроме того, затраты на коммутатор можно не учитывать, поскольку, скорее всего, в реальной эксплуатации он и так будет присутствовать в системе.


Автор: Антон Прошутя — менеджер продукта Elecard Boro.

Работает в сфере контроля качества видео с 2007 года.

Elecard Boro — многофункциональное программное решение для контроля качества потокового вещания в UDP, RTP, HTTP, HLS, DASH, SRT и RTMP и отслеживания QoS и QoE параметров в распределенной сети с централизованным доступом к статистике и генерацией регулярных отчетов