![局域网中的多播未被所有主机接收](https://linux22.com/image/1520269/%E5%B1%80%E5%9F%9F%E7%BD%91%E4%B8%AD%E7%9A%84%E5%A4%9A%E6%92%AD%E6%9C%AA%E8%A2%AB%E6%89%80%E6%9C%89%E4%B8%BB%E6%9C%BA%E6%8E%A5%E6%94%B6.png)
我正在编写一个应用程序,用于从插入 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 错误,要么是某种损害了多播流量分布的国家腐败。