Многоадресная рассылка в локальной сети не принимается всеми хостами

Многоадресная рассылка в локальной сети не принимается всеми хостами

Я пишу приложение для получения многоадресных обновлений с устройства измерения тока, подключенного к моей локальной сети. Устройство отправляет пакеты в многоадресную группу 224.192.32.19:22600 каждые несколько минут, и я могу их нормально читать с одного из хостов (raspberry pi).

Странно то, что когда я попытался добавить второй хост-слушатель, я не смог обнаружить на его интерфейсе никакого многоадресного трафика от этой группы.

Схема сети следующая: сетевая компоновка

Вся сеть находится в одном физическом месте, в одной подсети 192.168.xx. Между отправителем и получателем(ями) находятся 2 маршрутизатора TP-Link WDR3600, работающих под управлением DD-WRT, и «тупой» 8-портовый гигабитный коммутатор TP-Link (используется как расширитель портов). Все подключено через Ethernet.

Более подробная информация:

  • Хосты «NOK» включают ноутбук с Windows 7, подключенную виртуальную машину Linux на том же ноутбуке и другой ноутбук с Linux.
  • подключение хоста «NOK» напрямую к коммутатору, где находится хост «OK», не дает никакого эффекта
  • подключение напрямую к вторичному маршрутизатору (на один «удар» Ethernet ближе к источнику) не дает никакого эффекта
  • Я не могу найти трафик IGMP для этой группы ни на одном из хостов, включая рабочий.
  • Отслеживая сетевой трафик на предмет IGMP, я вижу, что 224.0.0.22при запуске моего приложения отправляется 2 запроса на присоединение.

Членство в группе регистрируется ядром и отображается

~ $ 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, либо какое-то государственное нарушение, которое поставило под угрозу распределение многоадресного трафика.

Связанный контент