多播 - 如何向路由器发送提示?

网络工程 多播 igmp
2022-02-26 13:00:23

我在http://ntrg.cs.tcd.ie/undergrad/4ba2/multicast/antony/example.html找到了一个多播示例纠正一些错误后,该程序似乎在我们的网络中运行良好。

我现在需要多播到不同的子网。这是我的设置:我的机器 ==> cisco 路由器 ==> Internet ==> cisco hub ==> 客户端机器。

我的本地 IP 地址是 10.10.15.20。客户端机器的 IP 地址是 192.168.15.101。

我们的网络提供商已在 cisco 路由器和 cisco hub 之间配置了一条 GRE 隧道。如果我从我的机器 ssh 或 ping 到 192.168.15.101,它工作得很好。

我现在需要在我的机器上运行我的多播服务器程序,并在客户端机器上运行客户端程序。但是,来自我的服务器的消息似乎从未到达客户端。

网络服务提供商演示了一个似乎可以进行多播的程序。不幸的是,他们没有应用程序的源代码。他们所说的只是他们使用 239.255.255.255 作为组 ID,使用 6000 作为端口。我更改了我们的应用程序以使用这些参数,但仍然无法让客户端和服务器进行通信。

我在想多播数据报可能会到达路由器,但路由器不知道数据报是否必须在 GRE 隧道上发送或发送到 Internet。这是因为服务器代码没有具体提及 192.168.15.xx 网络。

我觉得我需要以某种方式向路由器传递多播数据包必须真正转发到内部网络的提示。鉴于目标客户端 id 为 192.168.15.xx,我尝试将服务器的 groupid 设置为 224.192.168.15(从网上看来,多播的前四位必须是 1110。我使用的是 0b11100000)。然而,即使这样似乎也不起作用。

我很茫然。您能否指导我如何提示路由器多播是指 192.168.15.x 网络?问候。

2个回答

您可能需要使用IGMP

IGMP 是终端主机用来让他们的路由器知道他们有兴趣收听哪些多播组的协议。终端主机通知它们的路由器,路由器依次通过广域网加入相关组。

这是从维基百科无耻地窃取的过程概述:

在此处输入图像描述

客户端使用 LAN 上的 IGMP 让他的本地路由器知道他对某个多播组感兴趣。然后路由器使用多播协议(在这种情况下为PIM)加入组(在这种情况下由路由器 1 组成)

感谢大家的帮助。我终于让它工作了。我在这里发布我的解决方案,希望它可以节省您的时间。

在 Cisco 路由器中,多播设置规则要求您指定组 ID 和您打算使用的端口。看来我最初在服务器代码中遗漏了另一个参数,那就是 TTL 值。

默认情况下,如果 TTL 值小于或等于 1,则 Cisco 路由器会丢弃数据报。

在你的服务器代码中,如果你没有专门设置TTL值,默认假定为1。你可以通过参数调用来setsocketopt设置IP_MULTICAST_TTL

一旦我使用了正确的组 ID、端口和 TTL 值,我的客户端-服务器通信就开始工作了。

PS:在Cisco路由器中,显然你可以使用ip multicast ttl-threshold命令来改变它,但我没有尝试过。