如何检查某人是否通过特定多播地址流传输 RTP?

如何检查某人是否通过特定多播地址流传输 RTP?

假设我们在同一网络中有 ubuntu 机器 A(ip 192.168.0.20)和 ubuntu 机器 B(ip 192.168.0.21)。例如,如何检查机器 A 是否正在将 RTP 流式传输到多播地址和端口

239.0.0.1:5005

在机器B?

答案1

在 IP 多播并非简单地泛洪到哑交换机的所有端口的环境中,tcpdump单独使用可能不会捕获任何流量:交换机监听 IGMP 报告和查询(或进行自身查询),发现不需要此多播流量机器 B 的端口不会发送它。这setsockopt(fd, SOL_IP, IP_ADD_MEMBERSHIP, ...)需要在其套接字上使用的多播客户端。

安装socat及使用:

socat -d -d -u udp4-recv:5005,reuseaddr,ip-add-membership=239.0.0.1:192.168.0.21 /dev/null

这会:

  • 通过发送初始 IGMP 成员报告加入接口 192.168.0.21 上的多播组 239.0.0.1,当存在查询器的情况下由 IGMP 侦听网桥处理该报告时,该报告将使智能交换机将流量发送到机器 B 的交换机端口

    • 此处可选reuseaddr允许多次运行相同的命令(系统级别的多播仅使每个命令接收单个多播流的副本)。

    • -d -d使socat详细:它还将显示收到的数据包的来源。

    • 加入后,现在可以使用 捕获与 239.0.0.1 相关的任何内容tcpdump

    • 如果 192.168.0.20 正在发送到 239.0.0.1,则收到的数据包将以 192.168.0.20 作为源,显示发送它的系统。

  • 收到数据就忘记了/dev/null。如果数据是视频流(实际上在端口 5005,而不是 5004),则替换/dev/null为将使用该命令- | mpv -显示视频。mpv

什么时候索卡特停止时,内核将发送 IGMP 离开消息。根据交换机的设置,它将立即停止向计算机 B 发送该多播目标,或者这将在下一分钟内发生。tcpdump因此可能会继续捕获流量,但这不会持续下去。

笔记:

在网络由哑交换机(或虚拟 Linux 桥接器处理)的环境中mcast_查询器未设置切换)tcpdump则将在所有情况下捕获多播流量,因为交换机在其所有端口上泛洪流量。

相关内容