NetUP IPTVProbe

Мониторинг IPTV потоков в сети. Проект open source.
Лицензия: GPLv2, GPLv3

Исходный код – iptvprobe_v0.6.tbz2

Обсуждение проекта на форуме NetUP о IPTV

История версий

Версия 0.6

  • Установлены значения по умолчанию для подключения к MySQL
  • Исправлены ошибки сборки iptvprobe_server на некоторых платформах
  • Добавлены бинарные сборки для D-Link DIB-120 IP STB

Версия 0.4

    Внимание! При обновлении с предыдущих версий необходимо полностью пересоздать структуру базы данных.
  • Выполняется периодическая очистка базы данных
  • Появилась возможность мониторинга нескольких мультикаст-потоков на одном зонде
  • Исправлена проблема с утечкой памяти в iptvprobe_server

Версия 0.3

  • Добавлена обработка IGMP-запросов и отображение временных параметров работы с IGMP
  • Очистка кода, исправление ошибок
  • Новая версия протокола обмена данными с зондами

Версия 0.2

  • Добавлена поддержка Aminet 110 (ppc)

Версия 0.1

  • Первоначальный релиз
  • Отображение скорости примема UDP-пакетов
  • Контроль потерянных пакетов

Общая схема организации сети при проведении тестирования

Схема организации сети при проведении тестирования

Схема работы зонда (iptvprobe) и коллектора

Схема работы зонда

Сборка и установка пакета

Весь пакет можно условно разделить на следующие составные части:

  • Коллектор – собирает статистику с зондов. Статистика накапливается в базе данных (mysql)
  • Зонд – удаленный "вынос", который фиксирует проходящие IP-пакеты и передает информацию по сети на коллектор. Зонд состоит из двух подчастей – модуль ядра linux netup_netprobe.ko и пользовательское приложение iptvprobe.
  • Подсистема отчетов – Подключается к базе данных и выводит информацию в виде графиков и таблиц.

Сборка и запуск коллектора

Сборка коллектора:

cd iptvprobe/userver/
cmake --debug-output . -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON
make

Создание базы данных:

mysqladmin create iptvprobe
mysql iptvprobe < db.sql

Запуск коллектора:

./iptvprobe_server -l root -s 127.0.0.1

При таком запуске коллектор будет записывать информацию в базу данных "iptvprobe" на локальном хосте (127.0.0.1)

Сборка зонда

Сборка приложения под платформу x86:

cd iptvprobe/udaemon/
cmake --debug-output . -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON
make

Сборка модуля ядра под платформу x86:

cd iptvprobe/kmodule/
make

Сборка модуля ядра под платформу sh4 (IP STB aminet 130):

cd iptvprobe/kmodule/
export CROSS_COMPILE=sh4-unknown-linux-gnu-
make ARCH=sh amino130

В директории aminet130_bin/ находятся уже собранные ядро и приложение для AmiNET 130 IP STB.

Запуск зонда

Загрузка модуля ядра linux:

cd iptvprobe/kmodule/
insmod netup_netprobe.ko hook_position=0

При помощи параметра hook_position можно регулировать положение перехватчика пакетов:

0 – перехватчик фиксирует все входящие пакеты с сетевого интерфейса (PREROUTING), 1 – исходящие (POSTROUTING).

При запуске модуля на абонентском устройстве (например, Aminet 130) необходимо использовать значение 0 (PREROUTING). В случае если запуск производится на сервере генерирующем мультикаст, необходимо использовать значение 1 (POSTROUTING).

После того как модуль ядра успешно загружен необходимо создать символьное устройство в папке /dev и запустить пользовательское приложение iptvprobe:

mknod /dev/iptvprobe c 61 0
cd iptvprobe/udaemon/
./iptvprobe -i 224.117.117.10 -s 10.1.4.242 -r 5 -p 7700

Параметры запуска приложения:

-i Sets the multicast address for monitoring
-s Specifies the IP address of the collector
-p Specifies the port for the collector to accept connections from probes
-r Specifies a run identifier

Полностью строку запуска можно увидеть в подсистеме отчетов.

Подсистема отчетов

Для запуска подсистемы отчетов скопируйте веб-скрипты из папки iptvprobe/report_sys/ в папку с cgi-bin скриптами для вашей системы:

cd iptvprobe/report_sys/
cp *.pl /var/www/localhost/cgi-bin/

В системе должны быть установлены perl, GD.

Далее необходимо на рабочей станции оператора запустить браузер и перейти по адресу:

http://address/cgi-bin/iptvprobe_runs.pl

где address – адрес сервера с подсистемой отчетов.

Стартовая страница содержит перечень запусков зондов:

Table of iptvprobe runs

В колонке "Command to run on probe" приводится строка запуска приложения-зонда со всеми необходимыми параметрами.

Пройдя по ссылке "UDP timeline graphic" либо "PCR Arrival Interval" можно увидеть графическое представление текущего мультикаст потока (на графике отображаются последние 30 секунд).

На следующих скриншотах отображены тестовые запуски ТВ-канала на Aminet 130, длительностью по 1 часу каждый. В первом случае использовался коммутатор Cisco Catalyst 2950T с поддержкой IGMP Snooping, а во втором случае использовался обычный коммутатор без поддержки IGMP snooping. Как видно во втором случае присутствует существенное количество потерянных IP-пакетов.


Описание графиков:

По оси x отложено время от текущего момента минус 15 секунд.

По оси y откладываются значения:

  • Количество зафиксированных IP-пакетов с группировкой по 100 мсек.
  • Количество зафиксированных килобайт с группировкой по 100 мсек.
  • Красным цветом отмечена линия потери пакетов т.е. если зафиксирован сбой в счетчике "ID-пакета", то на графике рисуется пик. Если потерь нет, то рисуется прямая линия со значением 0.

Описание базы данных

SQL таблицаОписание
runsСписок запусков зонда. Каждый запуск имеет уникальный номер
data_ipСписок IP-пакетов зафиксированных зондом. Фиксируется время (timestamp) прихода пакета в наносекундах. Так же фиксируется ID-пакета (header_id ) для контроля целостности потока
data_tsИнформация о MPEG Transport Stream (TS) пакетах зафиксированных зондом. Для пакетов фиксируются значения PID, PTS/DTS/PCR и значение счетчика непрерывности (cont_counter)
stat_bandwidthСгруппированные данные для построения графиков

Мониторинг работы IGMP

В версии iptvprobe v0.3 появилась возможность отслеживать IGMP запросы отправляемые и принимаемые зондом на IP STB. При этом так же фиксируется время получения последнего группового пакета при выходе из группы и первого группового пакета, при вступлении в группу. Используя эти данные, можно судить о качестве работы сетевого оборудования осуществляющего обработку IGMP-запросов и обеспечивающих работу IGMP snooping.

Для примера, рассмотрим работу данного функционала, используя IP STB Aminet 130 и NetUP Middleware. В качестве коммутатора с поддержкой IGMP Snooping выступает Cisco Catalyst 3560, а в качестве IGMP querier выступает Cisco Catalyst C3550-12T.

Проведем переключение ТВ-каналов на IP STB. При этом приставка посылает IGMP-запрос о выходе из мультикаст-группы 224.121.0.4 и затем посылает запрос на вступление в группу 224.121.0.3. Эти запросы фиксируются зондом и отображаются в веб-интерфейсе подсистемы отчетов с указанием временных параметров:

Интересующие нас запросы выделены синей рамкой. Как видно, после отправки IGMP-запроса на выход из группы 224.121.0.4, приставка еще в течение 4996.2 мс получала пакеты для мультикаст-группы 224.121.0.4. Так же видно, что после отправки IGMP-запроса на вступление в группу 224.121.0.3 приставка ожидала 80 мс первый пакет в группу 224.121.0.3. Время между IGMP-запросами составило 12.0 мс (это время по большей части зависит от скорости работы ПО на приставке).

Как видно, для данной конфигурации общее время переключения ТВ-каналов на уровне IGMP-запросов составляет порядка 92 мсек. Реальное же время появления изображения нового канала на экране телевизора зависит от многих параметров. В частности, от буферизации MPEG-потока, синхронизации аудио-видео и т.д., и может занимать до 1 секунды и более.

Как следует из этих цифр, приставка в течение 4996.2 мсек получала пакеты для двух мультикаст групп одновременно, что приводит к избыточному потреблению пропускной способности канала. Во избежании таких "накладок" необходимо установить режим моментального выхода из группы на коммутаторе. Для этого в режиме конфигурирования необходимо указать команду:

c3560(config)#ip igmp snooping vlan 1 immediate-leave

В результате такой настройки коммутатор моментально выключает поток для мультикаст-группы, из которой произведен выход. Результаты работы в этом режиме выделены на скриншоте красной рамкой. Как видно после отправки запроса "IGMPv2: Leave Group 224.121.0.11", приставка больше не получала пакетов для группы 224.121.0.11. Таким образом, в момент переключения ТВ-каналов приставка одновременно получает пакеты только для одного канала.

Для корректного фиксирования временных показателей IGMP-запросов на приставке перед запуском зонда необходимо перевести сетевой интерфейс в режим promisc:

# ifconfig eth0 promisc

TODO лист

  • Возможность движения по графику вправо-влево, масштабирование и т.д.
  • График "PCR jitter", другие графики
  • Сборка зонда под различные IP STB
  • Мониторинг доступности зондов для контроля работы сети