假设我们在同一网络中有 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
则将在所有情况下捕获多播流量,因为交换机在其所有端口上泛洪流量。