源代码 - iptvprobe_v0.4.tbz2
欢迎访问 NetUP 的 IPTV 论坛,讨论 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' 数据库
建立用于 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" 是您的网页服务器地址。
起始页包含运行的下列探测器:
“在探测器上运行的命令”栏包含了应在探测器上执行的完整命令行。
通过 "UDP 时间线图示" 或 "PCR 到达间隔"链接,可以查看多播流的示意图。此图显示了大约最后 30 秒的多播流。
已运行完两个示例。第一个运行于通过简易 SOHO 交换机连接的 AmiNET 130 IP STB (无 IGMP 探听支持)。第二个运行于通过 Cisco Catalyst 交换机连接的 AmiNET 130 IP STB (有 IGMP 探听支持)。在第一个示例中,出现了很多 IP 数据包丢失的情况。下图显示了这两个示例:
X 轴上显示了最后的大约 15-30 秒。
Y 轴上显示下列参数:
| SQL 表单 | 说明 |
| 运行 | 运行列表。每个运行都有唯一的数字标识 |
| data_ip | 探测器检测到的 IP 数据包。IP 数据包到达时间(时间戳)以毫微秒为单位存储。同时存储数据包 ID (header_id)。 |
| data_ts | 探测器检测到的 MPEG 传输流 (TS) 数据包。将存储下列值:PID、PTS/DTS/PCR、计数器值 (cont_counter) |
| stat_bandwidth | 分组的统计数据 |
从 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。探测器将记录这些请求,并在网页界面中显示这些请求及其时间戳:
我们感兴趣的项目均带有蓝框。很明显,当 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