[Ninux-Wireless] multicast routing e comportamento inaspettato

Luca Dionisi luca.dionisi a gmail.com
Mar 4 Maggio 2010 13:02:58 CEST


Ciao a tutti.
Sto facendo degli esperimenti con il multicast routing su linux.
Riscontro un comportamento che non mi aspettavo.

Cerco di illustrare i miei esperimenti qui sotto. Mi scuso se risulta
pesante la lettura soprattutto da un client di posta che non usa i
caratteri a larghezza fissa.
Allego lo stesso testo anche come file .txt, forse per qualcuno
risulta migliore.

Ho preparato (con netkit) una topologia come rappresento sotto.
                 *
 0       2        *
 ↖↘   ↗   ↘      *
    1  ←--  4    *
      ↘   ↗      *
        3        *
                 *

Il nodo <1>, oltre ad una rotta verso il nodo <0>, ha 2 rotte
 verso <2> e <3> e attraverso di queste raggiunge il <4> con un
 multipath con load-balancing (con peso relativo 10 e 7)
Cioè:
 ip route add default \
 nexthop via 1.1.1.3 dev eth0 weight 10 \
 nexthop via 1.1.1.2 dev eth2 weight 7

Gli altri nodi hanno tutti una sola rotta, come da disegno.

Inoltre, il nodo <1> periodicamente ripulisce la sua tabella di cache,
 per evitare che una volta scelta una rotta per una certa destinazione
 venga usata sempre quella. Cioè esegue una volta al secondo:
 ip route flush cache

Ho lanciato sui nodi 2 e 3 tcpdump per verificare dove passano i pacchetti.
I test fatti ed i risultati:
1)
 Dal nodo 0 un ping al nodo 4.
 I pacchetti passano su 2 e 3 alternandosi all'incirca in base ai pesi usati
2)
 Dal nodo 0 una connessione TCP al nodo 4. Ho usato nc (netcat).
 Traffico va da 0 verso 4:
 I pacchetti passano su 2 e 3 alternandosi all'incirca in base ai pesi usati
 Traffico va da 4 verso 0:
 I pacchetti di tipo ACK passano su 2 e 3 alternandosi all'incirca in
base ai pesi usati
 Nell'eventualità che il nodo 3 muore mentre la connessione è aperta:
 Sia per il traffico da 0 a 4, sia per il traffico da 4 a 0:
  I pacchetti passano su 2, ma non in maniera costante; la
caratteristica di reliability del TCP
  viene rispettata.
3)
 Dal nodo 0 invio pacchetti UDP al nodo 4. Ho usato nc (netcat).
 I pacchetti passano su 2 e 3 alternandosi all'incirca in base ai pesi usati
 Nell'eventualità che il nodo 3 muore:
 I pacchetti passano su 2, ma non in maniera costante; quando viene
scelta la rotta
 verso 3 i pacchetti sono persi.
4)
 Dal nodo 1 un ping al nodo 4.
 I pacchetti passano su 2 e 3 alternandosi all'incirca in base ai pesi usati
5)
 Dal nodo 1 una connessione TCP al nodo 4. Ho usato nc (netcat).
 Traffico va da 1 verso 4:
 I pacchetti passano o sempre su 2 o sempre su 3
 Traffico va da 4 verso 1:
 I pacchetti di tipo ACK passano o sempre su 2 o sempre su 3
 Nell'eventualità che il nodo scelto inizialmente muore mentre la
connessione è aperta:
 Per il traffico da 1 a 4:
  Dopo un periodo in cui i pacchetti sono tutti persi, circa 20
secondi, i pacchetti cominciano a
  fluire per l'altra rotta e vi passano da quel momento in poi in
modo costante; la caratteristica
  di reliability del TCP viene rispettata.
 Per il traffico da 4 a 1:
  I pacchetti ti tipo ACK (da 1 verso 4) non raggiungono più la
destinazione e quindi la comunicazione
  si interrompe; non riprende più. A meno che non venga inviato del
traffico nella direzione
  opposta, cioè da 1 verso 4. In questo caso dopo un po' viene scelta
l'altra rotta e da quel
  momento la comunicazione riprende in modo costante in ambedue le direzioni.
6)
 Dal nodo 1 invio pacchetti UDP al nodo 4. Ho usato nc (netcat).
 I pacchetti passano o sempre su 2 o sempre su 3
 Nell'eventualità che il nodo scelto inizialmente muore:
 Nessun pacchetto raggiunge più la destinazione.



In conclusione, tutti i comportamenti riscontrati sono più o meno in
linea con quello che mi aspettavo.
I punti che mi lasciano perplesso sono 5 e 6.
Sembra come se ci fosse una particolare "information base" per il
kernel per trovare le rotte per una
 certa destinazione quando il mittente originale dei pacchetti è
proprio il nodo stesso.

Vi pare normale come comportamento? Siete a conoscenza di cosa dovrei
fare per uniformare
 il comportamento in 5 e 6 allo stesso che si riscontra in 2 e 3?
Avete suggerimenti su strade diverse che dovrei percorrere per
ottenere un multicast routing?

Se volete allego i comandi per riprodurre l'esperimento (requires netkit)

Grazie
Luca
-------------- parte successiva --------------
Ciao a tutti.
Sto facendo degli esperimenti con il multicast routing su linux.
Riscontro un comportamento che non mi aspettavo.

Cerco di illustrare i miei esperimenti qui sotto. Mi scuso se risulta pesante la lettura soprattutto da un client di posta che non usa i caratteri a larghezza fissa.
Allego lo stesso testo anche come file .txt, forse per qualcuno risulta migliore.

Ho preparato (con netkit) una topologia come rappresento sotto.
                  *
 0       2        *
  ↖↘   ↗   ↘      *
     1  ←--  4    *
       ↘   ↗      *
         3        *
                  *

Il nodo <1>, oltre ad una rotta verso il nodo <0>, ha 2 rotte
 verso <2> e <3> e attraverso di queste raggiunge il <4> con un
 multipath con load-balancing (con peso relativo 10 e 7)
Cioè:
 ip route add default \
  nexthop via 1.1.1.3 dev eth0 weight 10 \
  nexthop via 1.1.1.2 dev eth2 weight 7

Gli altri nodi hanno tutti una sola rotta, come da disegno.

Inoltre, il nodo <1> periodicamente ripulisce la sua tabella di cache,
 per evitare che una volta scelta una rotta per una certa destinazione
 venga usata sempre quella. Cioè esegue una volta al secondo:
 ip route flush cache

Ho lanciato sui nodi 2 e 3 tcpdump per verificare dove passano i pacchetti.
I test fatti ed i risultati:
1)
 Dal nodo 0 un ping al nodo 4.
 I pacchetti passano su 2 e 3 alternandosi all'incirca in base ai pesi usati
2)
 Dal nodo 0 una connessione TCP al nodo 4. Ho usato nc (netcat).
 Traffico va da 0 verso 4:
  I pacchetti passano su 2 e 3 alternandosi all'incirca in base ai pesi usati
 Traffico va da 4 verso 0:
  I pacchetti di tipo ACK passano su 2 e 3 alternandosi all'incirca in base ai pesi usati
 Nell'eventualità che il nodo 3 muore mentre la connessione è aperta:
  Sia per il traffico da 0 a 4, sia per il traffico da 4 a 0:
   I pacchetti passano su 2, ma non in maniera costante; la caratteristica di reliability del TCP
   viene rispettata.
3)
 Dal nodo 0 invio pacchetti UDP al nodo 4. Ho usato nc (netcat).
  I pacchetti passano su 2 e 3 alternandosi all'incirca in base ai pesi usati
 Nell'eventualità che il nodo 3 muore:
  I pacchetti passano su 2, ma non in maniera costante; quando viene scelta la rotta
  verso 3 i pacchetti sono persi.
4)
 Dal nodo 1 un ping al nodo 4.
 I pacchetti passano su 2 e 3 alternandosi all'incirca in base ai pesi usati
5)
 Dal nodo 1 una connessione TCP al nodo 4. Ho usato nc (netcat).
 Traffico va da 1 verso 4:
  I pacchetti passano o sempre su 2 o sempre su 3
 Traffico va da 4 verso 1:
  I pacchetti di tipo ACK passano o sempre su 2 o sempre su 3
 Nell'eventualità che il nodo scelto inizialmente muore mentre la connessione è aperta:
  Per il traffico da 1 a 4:
   Dopo un periodo in cui i pacchetti sono tutti persi, circa 20 secondi, i pacchetti cominciano a
   fluire per l'altra rotta e vi passano da quel momento in poi in modo costante; la caratteristica
   di reliability del TCP viene rispettata.
  Per il traffico da 4 a 1:
   I pacchetti ti tipo ACK (da 1 verso 4) non raggiungono più la destinazione e quindi la comunicazione
   si interrompe; non riprende più. A meno che non venga inviato del traffico nella direzione
   opposta, cioè da 1 verso 4. In questo caso dopo un po' viene scelta l'altra rotta e da quel
   momento la comunicazione riprende in modo costante in ambedue le direzioni.
6)
 Dal nodo 1 invio pacchetti UDP al nodo 4. Ho usato nc (netcat).
  I pacchetti passano o sempre su 2 o sempre su 3
 Nell'eventualità che il nodo scelto inizialmente muore:
  Nessun pacchetto raggiunge più la destinazione.



In conclusione, tutti i comportamenti riscontrati sono più o meno in linea con quello che mi aspettavo.
I punti che mi lasciano perplesso sono 5 e 6.
Sembra come se ci fosse una particolare "information base" per il kernel per trovare le rotte per una
 certa destinazione quando il mittente originale dei pacchetti è proprio il nodo stesso.

Vi pare normale come comportamento? Siete a conoscenza di cosa dovrei fare per uniformare
 il comportamento in 5 e 6 allo stesso che si riscontra in 2 e 3?
Avete suggerimenti su strade diverse che dovrei percorrere per ottenere un multicast routing?

Se volete allego i comandi per riprodurre l'esperimento (requires netkit)

Grazie
Luca



Maggiori informazioni sulla lista Wireless