这个问题是关于在同一主机内发送和接收多播,同时将其发送到其他主机。
即使经过几个小时的谷歌搜索,我仍然无法弄清楚多播数据报是如何在同一主机内路由的......!
下面是问题的详细描述:
Linux 盒子“A”通过电缆连接到交换机/路由器(我们将交换机/路由器称为“R”)。
在Linux盒子A中,我有一个进程(A0)将UDP数据包发送到多播地址“224.0.0.0”,端口5000。
同样,在同一个盒子 A 中,我有两个进程(A1 和 A2),它们都连接到 224.0.0.0、端口 5000 并消耗 UDP 数据包。
现在,盒子 A 中的内核如何管理路由?
因此,A0 发送了一个数据报,该数据报被 A1 和 A2 使用。这样的数据报是否会进行往返 A --> R --> A ?
..或者“A”中的内核路由是否足够智能,可以避免这种不必要的往返? (即数据报由 A0 发送并立即由 A1 和 A2 消耗,从未离开 A)。
当然,可以通过创建并强制执行多播环回设备来确保多播数据报永远不会离开 A:
sudo ifconfig lo multicast
sudo route add -net 224.0.0.0 netmask 240.0.0.0 dev lo
但现在,如果我想在另一个 Linux 机器(例如“B”)中同时使用 UDP 数据报,它们就无法到达那里。
因此,理想情况下,(1) A 中消耗的数据报永远不会离开 A(即没有往返 A --> R --> A),而 (2) B 中消耗的数据报应该正常作为 A --> R -- > B. 我想同时实现这两件事。
有什么方法可以实现这一点,例如使用“route”命令?
进程 A1 和 A2 的套接字设置了以下标志:
SO_REUSEADDR
SO_REUSEPORT
虽然我检查了进程 A0(发送多播数据报的进程)具有以下标志:
IP_MULTICAST_LOOP