gpt4 book ai didi

sockets - 组播中的环回

转载 作者:行者123 更新时间:2023-12-02 16:09:02 25 4
gpt4 key购买 nike

这个问题是关于在同一主机内发送和接收多播,同时将其发送到其他主机。

即使经过几个小时的谷歌搜索,我仍然无法弄清楚多播数据报是如何在同一主机内路由的..!

这里是问题的详细描述:

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

最佳答案

环回本地进程(本地套接字)应该可以工作,而无需向 lo 添加多播路由。只需确保您已设置到某个外部接口(interface)的有用路由即可。数据包仍将在内部路由。 (Linux 在幕后执行大量路由操作。)

您需要 IP_MULTICAST_LOOP,这看起来不错。

您是否在所有进程中正确加入了多播组? IP_ADD_MEMBERSHIP?如果没有这个,你就会得到各种虚假行为。

您可以查看本地路由表以了解 Linux 在本地对数据包执行的操作。它通常绝非微不足道:

sudo ip route show table local

您还可以查看当前的多播组成员身份:

netstat -g

输出和引用计数对您的情况有意义吗?

关于sockets - 组播中的环回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33121208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com