局域网中的多播未被所有主机接收

局域网中的多播未被所有主机接收

我正在编写一个应用程序,用于从插入 LAN 的电流测量设备获取多播更新。该设备每隔几分钟向多播组 224.192.32.19:22600 发送数据包,我可以从其中一个主机(Raspberry Pi)读取它们。

奇怪的是,当我尝试添加第二个侦听器主机时,我在其接口上找不到来自该组的任何多播流量。

网络布局如下: 网络布局

所有网络都位于同一物理位置,在同一个 192.168.xx 子网下。发送方和接收方之间有 2 个运行 DD-WRT 的 TP-Link WDR3600 路由器和一个“哑”TP-Link 8 端口千兆交换机(用作端口扩展器)。一切都通过以太网连接。

更多细节:

  • “NOK”主机包括一台 Windows 7 笔记本电脑、同一台笔记本电脑上的桥接 Linux VM 和另一台 Linux 笔记本电脑
  • 将“NOK”主机直接插入“OK”主机所在的哑交换机没有任何效果
  • 直接插入辅助路由器(距离源更近的 1 个以太网“跳跃”)没有效果
  • 我在任何主机(包括正在运行的主机)上都找不到该组的 IGMP 流量
  • 监视 IGMP 的网络流量时,我可以看到当我的应用程序启动时有 2 个加入请求发出224.0.0.22

组成员身份由内核注册,并显示为

~ $ netstat -ng
IPv6/IPv4 Group Memberships
Interface       RefCnt Group
--------------- ------ ---------------------
lo              1      224.0.0.1
eth0            1      224.192.32.19
eth0            1      224.0.0.251
eth0            1      224.0.0.1

从侦听器应用程序初始化套接字的 Python 代码如下:

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((self.mcast_group, self.mcast_port))
mreq = struct.pack("4sl", socket.inet_aton(self.mcast_group), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

我在这里遗漏了什么?只需在工作主机上运行侦听器应用程序就足以接收多播流量,为什么其他侦听器不是这样呢?

答案1

事实证明这是一个路由器问题,重新启动辅助路由器后,所有主机都开始按预期接收多播数据包。

我认为这要么是 DD-WRT 错误,要么是某种损害了多播流量分布的国家腐败。

相关内容