El *_*psa 6 sockets router multicast loopback
这个问题是关于在同一主机内发送和接收多播,同时将其发送到其他主机。
即使经过数小时的谷歌搜索,我也无法弄清楚如何在同一主机内路由多播数据报..!
下面是问题的详细描述:
Linux 机器“A”通过电缆连接到交换机/路由器(我们称交换机/路由器为“R”)。
在 linux box A 中,我有一个进程(A0)将 UDP 数据包发送到多播地址“224.0.0.0”,端口 5000。
同样,在同一个框 A 中,我有两个进程(A1 和 A2),都连接到 224.0.0.0、端口 5000 并消耗 UDP 数据包。
现在,box 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
Run Code Online (Sandbox Code Playgroud)
但是现在,如果我想在另一个 linux 机器中同时使用 UDP 数据报,比如说“B”,它们就无法到达那里。
因此,理想情况下,(1)在 A 中消耗的数据报永远不应该离开 A(即没有往返 A --> R --> A),而(2)在 B 中消耗的数据报应该正常地作为 A --> R -- > B. 我想同时实现这两件事。
有什么方法可以实现这一点,例如,使用“路由”命令?
套接字是进程 A1 和 A2 设置了以下标志:
SO_REUSEADDR
SO_REUSEPORT
Run Code Online (Sandbox Code Playgroud)
虽然我检查了进程 A0(发送多播数据报的进程)具有以下标志:
IP_MULTICAST_LOOP
Run Code Online (Sandbox Code Playgroud)
环回本地进程(本地套接字)应该可以在不向 lo 添加多播路由的情况下进行。只需确保您已设置到某个外部接口的有用路由即可。数据包仍将在内部路由。(Linux 在幕后执行大量路由操作。)
您需要 IP_MULTICAST_LOOP,这看起来不错。
您是否在所有进程中正确加入了多播组?IP_ADD_MEMBERSHIP?如果没有这个,你就会得到各种虚假的行为。
您可以查看本地路由表来了解 Linux 在本地对数据包执行的操作。它通常绝非微不足道:
sudo ip route show table local
您还可以查看当前的多播组成员身份:
netstat -g
输出和引用计数对您的情况有意义吗?