UDP multicast non funzionante


11

UDP multicast su lampone pi

Non ho ristretto le cose abbastanza da sapere se il mio problema è dovuto a debian, raspbian in particolare, o se mi manca qualcosa completamente.

Ho un'applicazione Python che utilizza UDP multicast per comunicare ad altri dispositivi sulla rete che la mia applicazione è attiva e funzionante e disponibile a un indirizzo IP specifico.

Il gruppo multicast UDP è 239.255.250.250 e la porta è 9131. Se eseguo tcpdump, posso vedere che il pacchetto che sto cercando di inviare sta effettivamente inviando dati, ma non vedo mai nulla accadere su altre macchine sulla rete.

Ci sono altri dispositivi che usano questo stesso tipo di "beacon" con lo stesso gruppo multicast e la stessa porta e posso vedere che i pacchetti arrivano su altre macchine. Il router non ha firewall, e sono davvero un po 'fuori dalle opzioni a questo punto.

Di seguito è riportata la diagnostica di base che so eseguire. Il cattivo udp chksum sembra che probabilmente non sia utile, ma non ne so davvero nulla.

Uscita di 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)

Output di tcpdump mentre l'app è in esecuzione

    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

Emissione di netstat mentre il programma è in esecuzione

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  

Potete fornire l'output di netstat -gn su 2 host?
UnX

Risposte:


13

Comprendo che il tuo host 192.168.2.7 sta inviando il pacchetto multicast al gruppo 239.255.250.250 sulla porta 9131

NOTA: suppongo tuttavia che i server siano in ascolto sulla porta 9131. Non hai fornito alcuna informazione al riguardo.

Dall'output di ifconfig, vedo che MULTICAST è abilitato e il tcpdump lo conferma.

Assicurarsi innanzitutto che l'host che esegue i server (quello che riceve il pacchetto multicast) si sia unito al gruppo multicast.

Su ciascun tipo di host del server:

netstat -gn

Se vedi il tuo indirizzo multicast, si è unito al gruppo. In caso contrario, o qualcosa non va nel programma del server o eventualmente nelle impostazioni del kernel.

Se il server si è unito al gruppo ma non vedi alcun pacchetto in arrivo dal client, controlla sul tuo router che hai abilitato igmp (il tuo router deve essere compatibile con igmp)

Ad esempio, sul router Cisco

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

Se igmp è abilitato sul router, cerca le funzionalità di debug per tenere traccia dei pacchetti.

Sul lato server, avvia un'acquisizione di pacchetti:

tcpdump -i <NIC> host 239.255.250.250

Se non vedi alcun pacchetto in arrivo, il pacchetto multicast non viene inoltrato (supponendo che

Quindi sul client inviare un pacchetto multicast (utilizzare lo script nel collegamento seguente per risolvere i problemi)

NOTA: il pacchetto UDP sembra non valido, quindi non sono sicuro che i server saranno in grado di leggerlo. È possibile utilizzare lo script nel collegamento seguente per confermare se il messaggio in tcpdump viene visualizzato o meno come non valido (non è nel mio caso)

Esempio di codice Python usando multicast:

/programming/603852/multicast-in-python

NOTA: ho usato questo script su un debian raspi (non raspbian e il server ha ricevuto i pacchetti attraverso il router - come sopra impostato - va bene)

Guida di 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


Risposta molto lunga e la parte più piccola è quello che in realtà sembrava essere il problema. Le cose per la risoluzione dei problemi che hai citato, l'ho già fatto, ma è stato dopo che l'ho pubblicato. Tutto sembrava a posto sul server e sul client. IGMP sul router era il problema, ma quell'impostazione era nascosta
Alex

2
la tua descrizione non era abbastanza chiara per dare una risposta diretta, quindi ho pensato di poter scrivere una mini guida alla risoluzione dei problemi.
UnX

1

Ho notato che questo può anche essere un problema hardware e / o driver. Ho usato UDP multicast (trasmissione e ricezione) sui miei raspberryPI senza problemi - con i programmi C, Java e / o Python.

Tuttavia, ho appena appreso che la ricezione multicast UDP NON FUNZIONA con il piccolo adattatore wifi nano USB di EDIMAX: l'invio di UDP (multicast) funziona e la ricezione dei propri messaggi (locali).

i dettagli delle chiavette USB di lsusb:

La ricezione multicast UDP non funziona: ID 7392: 7811 Edimax Technology Co., Ltd EW-7811Un adattatore wireless 802.11n [Realtek RTL8188CUS]

La ricezione multicast UDP funziona correttamente: ID 148f: 3070 Ralink Technology, Corp. Adattatore wireless RT2870 / RT3070


funziona anche: questo stick di ASUS con ID 0b05: 1791 Adattatore ASUSTek Computer, Inc. WL-167G v3 802.11n [Realtek RTL8188SU]
Michael,

0

Ho riscontrato un problema simile in cui i pacchetti stavano arrivando e potevo vederli tcpdumpma nessun programma poteva ricevere i dati.

Il problema in questo caso era che avevo usato iptablessolo per consentire il traffico dalla mia sottorete locale, 192.168.0.0/24ma ovviamente il multicast proviene 224.0.0.0/4invece. Invece di aprire l'intera sottorete (potrebbe anche non avere un firewall), ho solo permesso il traffico da tutti gli host sulla porta UDP specifica che stavo usando per il multicast e questo ha risolto il problema.


0

Per noi abbiamo avuto un problema simile in cui il gruppo multicast è stato unito correttamente, ma i messaggi non venivano ricevuti.

Abbiamo controllato le impostazioni di igmp sul router, che sembrava essere in ordine.

Alla fine siamo passati dall'uso dell'indirizzo multicast IPv6 a IPv4 e questo lo ha risolto per quel particolare sistema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.