Multicast na LAN não recebido por todos os hosts

Multicast na LAN não recebido por todos os hosts

Estou escrevendo um aplicativo para obter atualizações multicast de um dispositivo de medição de corrente conectado à minha LAN. O dispositivo envia pacotes para o grupo multicast 224.192.32.19:22600 a cada poucos minutos, e posso lê-los perfeitamente em um dos hosts (um raspberry pi).

O estranho é que quando tentei adicionar um segundo host ouvinte, não consegui encontrar nenhum tráfego multicast desse grupo em sua interface.

O layout da rede é o seguinte: layout de rede

Toda a rede está no mesmo local físico, na mesma sub-rede 192.168.xx. Entre o remetente e o (s) receptor (es) há 2 roteadores TP-Link WDR3600 executando DD-WRT e um switch gigabit "burro" de 8 portas TP-Link (usado como expansor de porta). Tudo está conectado via Ethernet.

Detalhes adicionais:

  • Os hosts "NOK" incluem um laptop Windows 7, uma VM Linux em ponte no mesmo laptop e um laptop Linux diferente
  • conectar um host "NOK" diretamente ao switch burro onde o host "OK" está não tem efeito
  • conectar diretamente ao roteador secundário (1 "salto" Ethernet mais próximo da fonte) não tem efeito
  • Não consigo encontrar nenhum tráfego IGMP para esse grupo em nenhum dos hosts, incluindo o que está funcionando
  • espionando o tráfego de rede para IGMP, posso ver duas solicitações de adesão saindo 224.0.0.22quando meu aplicativo é iniciado.

A associação ao grupo é registrada pelo kernel e exibida por

~ $ 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

O código Python que inicializa o soquete do aplicativo ouvinte é este:

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)

O que estou perdendo aqui? A simples execução do aplicativo ouvinte no host em funcionamento foi suficiente para receber o tráfego multicast. Por que não é o caso dos ouvintes adicionais?

Responder1

Acontece que este foi um problema do roteador, depois de reiniciar o roteador secundário, todos os hosts começaram a receber os pacotes multicast conforme o esperado.

Eu diria que foi um bug do DD-WRT ou alguma corrupção estatal que comprometeu a distribuição do tráfego multicast.

informação relacionada