NetUP IPTVProbe

IPTV 流监控开源软件
许可证:GPL (GPLv2, GPLv3)

源代码 - iptvprobe_v0.4.tbz2

欢迎访问 NetUP 的 IPTV 论坛,讨论 IPTVProbe 的相关问题

更改日志

    版本 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

在本例中,收集器将统计信息写入本地主机 (127.0.0.1) 的 'iptvprobe' 数据库

建立 iptvprobe

建立用于 x86 平台的应用程序:

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

建立用于 x86 平台的 Linux 内核模块:

cd iptvprobe/kmodule/
make

建立用于 sh4 平台的 Linux 内核模块 (IP STB AmiNET 130):

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

aminet130_bin/ 目录包含已建立的 Linux 内核模块和一个用于 AmiNET 130 IP STB 的用户级应用程序。

启动探测器

加载 Linux 内核模块:

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

hook_position 参数指定 Netfilter 的 IP 数据包回调位置:

0 - 处理所有传入 IP 数据包(PREROUTING 策略) 1 - 处理所有传出 IP 数据包(POSTROUTING 策略)

在客户端设备(比如 IP STB AmiNET 130)运行此模块时,必须将值设为 "0"。在发送多播流的服务器上运行模块时,必须将值设为 "1" 。

当 netup_netprobe.ko 模块成功加载后,您需要在 /dev 文件系统建立一个节点,并启动 iptvpobe 应用程序:

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 设置要监控的多播流地址
-s 指定收集器的 IP 地址
-p 指定收集器从探测器接受连接的端口
-r 指定运行标识符

您可以在报告子系统找到完整的命令行说明。

报告子系统

要运行报告子系统,您需要将所有网页脚本从 iptvprobe/report_sys/ 复制到网页服务器的 cgi-bin 文件夹:

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

为了正常操作,必须在系统中安装 perl 和 GD 。

在网页浏览器访问下列 URL:

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

其中 "address" 是您的网页服务器地址。

起始页包含运行的下列探测器:

运行的 iptvprobe 目录

“在探测器上运行的命令”栏包含了应在探测器上执行的完整命令行。

通过 "UDP 时间线图示" 或 "PCR 到达间隔"链接,可以查看多播流的示意图。此图显示了大约最后 30 秒的多播流。

已运行完两个示例。第一个运行于通过简易 SOHO 交换机连接的 AmiNET 130 IP STB (无 IGMP 探听支持)。第二个运行于通过 Cisco Catalyst 交换机连接的 AmiNET 130 IP STB (有 IGMP 探听支持)。在第一个示例中,出现了很多 IP 数据包丢失的情况。下图显示了这两个示例:

IP 机顶盒 AmiNET 130 上的测量结果
IP 机顶盒 AmiNET 130 上的测量结果

示意图说明

X 轴上显示了最后的大约 15-30 秒。

Y 轴上显示下列参数:

  • 在 100 毫秒内分组的 IP 数据包计数。
  • 在 100 毫秒内分组的字节数。
  • 红线表示丢失的 IP 数据包。如果检测到 "IP 数据包 ID" 中断,则在图中显示峰值。0 值表示未检测到数据包丢失。

数据库说明

SQL 表单 说明
运行 运行列表。每个运行都有唯一的数字标识
data_ip 探测器检测到的 IP 数据包。IP 数据包到达时间(时间戳)以毫微秒为单位存储。同时存储数据包 ID (header_id)。
data_ts 探测器检测到的 MPEG 传输流 (TS) 数据包。将存储下列值:PID、PTS/DTS/PCR、计数器值 (cont_counter)
stat_bandwidth 分组的统计数据

IGMP 监控

从 iptvprobe v0.3 开始,由探测器跟踪通过 IP STB 发送和接收的 IGMP 请求。此外,还会记录离开组的最后一组数据包和进入组的第一个数据包的时间戳。这些数据可用于评估处理 IGMP 请求和 GMP 探听的网络设备的性能。

下面为此功能的示例,其中 Aminet 130 IP STB 为探测器,NetUP 中间件为收集器。Cisco Catalyst 3560 用作带 IGMP 探听支持的转接器,而 Cisco Catalyst C3550-12T 作为 IGMP 查询器。

在 IP STB 上切换电视频道。当 STB 发送 IGMP 请求离开多播组 224.121.0.4 时, 另一个 STB 则请求进入组 224.121.0.3。探测器将记录这些请求,并在网页界面中显示这些请求及其时间戳:

NetUP 的 IPTVProbe,IGMP 计时

我们感兴趣的项目均带有蓝框。很明显,当 IGMP 发出离开多播组 224.121.0.4 的请求后,STB 继续接收发送至该组的数据包 4996.2 毫秒。IGMP 进入 224.121.0.3 组的请求与该组接收到第一个数据包之间的时间延迟为 80 毫秒。两个 IGMP 请求(主要由 STB 软件决定)之间的延迟为 12.0 毫秒。

总而言之,在 IGMP 请求级的电视频道切换的总时间为 92 毫秒。而新频道显示在电视机屏幕上的实际延迟取决于许多参数,包括 MPEG 缓冲、音频/视频同步等。许多因素可能会造成长达 1 秒甚至更长时间的延迟。

除此之外,STB 从两个多播组接收数据包大约 5 秒钟,耗费了额外的带宽。为避免这样的损失,必须将转接器配置为瞬时离开。可执行下列操作:

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

配置此方式后,转接器会在瞬间关闭放弃组的数据流。其结果带有红色框。我们可以看到,在离开请求 "IGMPv2: Leave Group 224.121.0.11" 之后,STB 没有接收到 224.121.0.11 组的数据包。因此,无论何时,STB 只接收一个频道的数据包。

为了正确记录 IGMP 请求的时间参数,在 STB 上启动探测器之前,必须将网络接口设为 promisc 方式:

# ifconfig eth0 promisc

任务列表

  • 图表改进(缩放,移动等)
  • "PCR 抖动"图表,其他图表
  • 为各类IP STB 建立探测器二进制
  • 用于网络管理的探测器可用性监控


Get Adobe Flash player