O UDP multicast não está funcionando

11

Multicast UDP no raspberry pi

Eu não reduzi as coisas o suficiente para saber se meu problema é por causa do debian, especificamente do raspbian, ou se estou perdendo algo completamente.

Eu tenho um aplicativo python que usa UDP multicast para permitir que outros dispositivos na rede saibam que meu aplicativo está em funcionamento e disponível em um endereço IP específico.

O grupo de difusão seletiva UDP é 239.255.250.250 e a porta é 9131. Se eu executar o tcpdump, posso ver que o pacote que estou tentando enviar está realmente enviando dados, mas nunca vejo nada acontecer em outras máquinas na rede.

Existem outros dispositivos que usam esse mesmo tipo de "beacon" com o mesmo grupo e porta multicast e posso ver esses pacotes sendo recebidos em outras máquinas. O roteador não tem firewall, e estou realmente sem opções neste momento.

Abaixo estão os diagnósticos básicos que sei executar. O chksum de udp ruim parece que provavelmente não é útil, mas eu realmente não sei nada sobre isso.

Saída de ifconfig

eth0      Link encap:Ethernet  HWaddr b8:27:eb:b2:79:12  
          inet addr:192.168.2.7  Bcast:192.168.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1682 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1686 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:119105 (116.3 KiB)  TX bytes:169570 (165.5 KiB)

Saída do tcpdump enquanto o aplicativo está em execução

    tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
03:29:15.722653 IP (tos 0x0, ttl 1, id 0, offset 0, flags [DF], proto UDP (17), length 221)
    192.168.2.7.33335 > 239.255.250.250.9131: [bad udp cksum 0xae84 -> 0xaabe!] UDP, length 193
    0x0000:  4500 00dd 0000 4000 0111 cb66 c0a8 0207  E.....@....f....
    0x0010:  efff fafa 8237 23ab 00c9 ae84 414d 5842  .....7#.....AMXB
    0x0020:  3c4d 4143 2d41 4444 523d 6238 3a32 373a  <MAC-ADDR=b8:27:
    0x0030:  6562 3a62 323a 3739 3a31 323e 3c2d 5555  eb:b2:79:12><-UU
    0x0040:  4944 3d32 3032 3438 3135 3937 3537 3734  ID=2024815975774
    0x0050:  3930 3e3c 2d53 444b 436c 6173 733d 5574  90><-SDKClass=Ut
    0x0060:  696c 6974 793e 3c2d 4d61 6b65 3d69 5275  ility><-Make=iRu
    0x0070:  6c65 426f 783e 3c2d 4d6f 6465 6c3d 5265  leBox><-Model=Re
    0x0080:  6d6f 7465 426f 783e 3c2d 5265 7669 7369  moteBox><-Revisi
    0x0090:  6f6e 3d30 2e31 3e3c 2d50 6b67 5f4c 6576  on=0.1><-Pkg_Lev
    0x00a0:  656c 3d47 4350 4b30 3032 3e3c 2d43 6f6e  el=GCPK002><-Con
    0x00b0:  6669 672d 5552 4c3d 6874 7470 3a2f 2f31  fig-URL=http://1
    0x00c0:  3932 2e31 3638 2e32 2e37 3a38 303e 3c2d  92.168.2.7:80><-
    0x00d0:  5374 6174 7573 3d52 6561 6479 3e         Status=Ready>
^C
1 packet captured
1 packet received by filter
0 packets dropped by kernel

Saída do netstat enquanto o programa está sendo executado

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
udp        0      0 0.0.0.0:31144           0.0.0.0:*                           1510/dhclient   
udp        0      0 0.0.0.0:33335           0.0.0.0:*                           2089/python     
udp        0      0 0.0.0.0:68              0.0.0.0:*                           1510/dhclient   
udp        0      0 192.168.2.7:123         0.0.0.0:*                           1911/ntpd       
udp        0      0 0.0.0.0:123             0.0.0.0:*                           1911/ntpd  
Alex
fonte
Você pode fornecer a saída do netstat -gn em 2 hosts?
unx
Talvez útil: superuser.com/questions/324824/…
cpugeniusmv

Respostas:

13

Entendo que seu host 192.168.2.7 está enviando pacotes multicast para o grupo 239.255.250.250 na porta 9131

NOTA: Presumo, no entanto, que os servidores estejam atendendo na porta 9131. você não forneceu nenhuma informação sobre isso.

Na saída ifconfig, posso ver que o MULTICAST está ativado e o tcpdump confirma isso.

Primeiro, verifique se o host que está executando os servidores (aquele que recebe o pacote multicast) ingressou no grupo multicast.

Em cada tipo de host do servidor:

netstat -gn

Se você vir seu endereço multicast, ele ingressou no grupo. Caso contrário, algo está errado com o programa do servidor ou possivelmente com as configurações do kernel.

Se o servidor ingressou no grupo, mas você não vê nenhum pacote recebido do cliente, verifique no roteador se você ativou o igmp (seu roteador deve ser compatível com igmp)

Por exemplo, no roteador Cisco

enable
conf t
ip multicast-routing
For each interface involved.
int <NIC>
ip pim sparse-dense-mode

Se o igmp estiver ativado no roteador, procure os recursos de depuração para rastrear os pacotes.

No lado do servidor, inicie uma captura de pacote:

tcpdump -i <NIC> host 239.255.250.250

Se você não vir nenhum pacote chegando, o pacote multicast não será encaminhado (assumindo que

Em seguida, no cliente, envie um pacote multicast (use o script no link abaixo para solucionar problemas)

NOTA: o pacote UDP parece malformado, portanto, não tenho certeza se os servidores poderão lê-lo. Você pode usar o script no link abaixo para confirmar se a mensagem no tcpdump está sendo exibida como malformada ou não (elas não estão no meu caso)

Exemplo de código python usando multicast:

/programming/603852/multicast-in-python

NOTA: Eu usei esse script em um debian raspi (não raspbian e pacotes recebidos pelo servidor através do roteador - como configurado acima - bem)

Guia do Linux: http://stlinux.com/howto/network/short-guide

Cisco: http://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst3750/software/release/12-2_52_se/configuration/guide/3750scg/swmcast.html#wp1024278

UnX
fonte
Resposta muito longa e a menor parte é o que realmente parecia ser o problema. O problema de solução de problemas que você mencionou, eu já fiz, mas foi depois que eu postei isso. Tudo parecia bom no servidor e no cliente. IGMP no router era o problema, mas essa configuração estava escondido
Alex
2
sua descrição não era clara o suficiente para dar uma resposta direta, então pensei em escrever um mini guia de solução de problemas.
UnX, 02/04/14
1

Percebi que isso também pode ser um problema de hardware e / ou driver. Eu usei UDP multicast (transmitir e receber) nos meus raspberryPI sem nenhum problema - com programas em C, Java e / ou Python.

No entanto, acabei de saber que o multicast UDP não funciona com o pequeno adaptador USB nano wifi da EDIMAX - o envio de trabalhos UDP (multicast), recebendo também as próprias mensagens (locais).

os detalhes dos pendrives de lsusb:

O recebimento de multicast UDP não funciona: ID 7392: 7811 Edimax Technology Co., Ltd Adaptador sem fio EW-7811Un 802.11n [Realtek RTL8188CUS]

O recebimento de multicast UDP funciona bem: ID 148f: 3070 Ralink Technology, Corp. Adaptador sem fio RT2870 / RT3070

Michael
fonte
também trabalha: esta vara da ASUS com ID 0b05: 1791 ASUSTek Computer, Inc. WL-167G v3 802.11n Adaptador [Realtek RTL8188SU]
Michael
0

Encontrei um problema semelhante no qual os pacotes estavam chegando e eu podia vê-los, tcpdumpmas nenhum programa podia receber os dados.

O problema nesse caso era que eu tinha usado iptablesapenas para permitir o tráfego da minha sub-rede local, 192.168.0.0/24mas é claro que o multicast vem 224.0.0.0/4. Em vez de abrir toda a sub-rede (talvez também não tenha um firewall), apenas permiti o tráfego de todos os hosts na porta UDP específica que eu estava usando para multicast, e isso resolveu o problema.

Malvineous
fonte
0

Para nós, tivemos um problema semelhante em que o grupo multicast se juntou perfeitamente, mas as mensagens não estavam sendo recebidas.

Verificamos as configurações do igmp no roteador, que parecia estar em ordem.

No final, deixamos de usar o endereço multicast IPv6 para IPv4 e o resolvemos para esse sistema específico.

Adam Reis
fonte