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