Я пишу приложение для получения многоадресных обновлений с устройства измерения тока, которое подключено к моей локальной сети. Устройство отправляет пакеты в группу многоадресной рассылки 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" не имеет никакого эффекта
  • подключение напрямую к вторичному маршрутизатору (1 Ethernet-узел, расположенный ближе к источнику) не имеет никакого эффекта
  • Я не могу найти трафик 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 ответ1

0

Оказалось, что это была проблема с маршрутизатором, после перезапуска вторичного маршрутизатора все хосты начали получать многоадресные пакеты, как и ожидалось.

Я бы сказал, что это либо ошибка DD-WRT, либо какое-то повреждение состояния, которое скомпрометировало распределение многоадресного трафика.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .