Mentre l’instradamento LS usa informazioni globali, quello distance-vector è iterativo, asincrono e distribuito.
È distribuito nel senso che ciascun nodo riceve parte dell’informazione da uno o più dei suoi vicini direttamente connessi, a cui, dopo aver effettuato il calcolo, restituisce i risultati.
È iterativo nel senso che questo processo si ripete fino a quando non avviene ulteriore scambio informativo tra vicini.
Aspetto interessante, l’algoritmo è anche auto-terminante: non vi è alcun segnale che il calcolo debba fermarsi, semplicemente si blocca.
È asincrono nel senso che non richiede che tutti i nodi operino al passo con gli altri.
Prima di presentare l’algoritmo usato dall’instradamento DV sarà bene discutere un’importante relazione esistente tra costi e percorsi a costo minimo.
Sia
Vediamo un esempio per comprendere meglio:
verifichiamo la formula per il nodo sorgente
Ponendo tali valori nell'equazione di Bellman-Ford e facendo altrettanto con i costi
Il risultato dà:
Che è il risultato che abbiamo ottenuto con Dijkstra nel paragrafo in cui su LS.
Le variabili
La formula di Bellman-Ford ha una significativa importanza pratica, in quanto fornisce le righe della tabella di inoltro nel nodo
L'idea di base è la seguente:
ciascun nodo
A ciascun nodo x:
Inizializzazione:
per tutte le destinazioni y in N:
D_x(y) = c(x,y) // se y non è adiacente allora c(x,y) = infinito
per ciascun vicino w di x
D_w(y) = ? per tutte le destinazioni y in N
// in quanto non sono note le distanze tra i vicini w di x
// e gli altri nodi y in N
per ciascun vicino w
inva il vettore delle distanxe D_x = [D_x(y): y in N] a w
Ciclo
attendi (fino a che vedi cambiare il costo di uno collegamento verso
qualche vicino w o fino a che ricevi un vettore delle distanze
da qualche vicino w)
per ogni y in N:
D_x(y) = min_v(c(x,v) + D_v(y)) (***)
se D_x(y) è cambiato per qualche destinazione y
invia il vettore delle distanze D_x = [D_x(y): y in N] a tutti i vicini
ripeti ciclo indefinitamente
L'algoritmo di Bellman-Ford mostra come un nodo (***)
dell'algoritmo. Se esistono più vicini (***)
, per ciascuna destinazione
L'algoritmo di Bellman-Ford a differenza di quello di Dijkstra (e l'instradamento Link-State in generale) è decentralizzato. In Dijkstra è necessario che ciascun nodo della rete riceva una mappa della rete, prima di cominciare l'esecuzione dell'algoritmo.
Le sole informazioni possedute dai nodi in Bellman-Ford sono il costo dei collegamenti verso i vicini direttamente connessi e quelle ricevute da questi vicini. Ogni nodo attende aggiornamenti dai suoi vicini, quando li riceve (nell'algoritmo attendi (fino a che vedi cambiare...)
) e li distribuisce ai suoi vicini (invia il vettore delle distanze D_x = ...
).
L'instradamento DV viene utilizzato in molti protocolli reali tra cui RIP e BGP per Internet, ISO IDRP, IPX di Novell e ARPAnet originale.
Il funzionamento dell’algoritmo viene mostrato in modo sincrono, in quanto tutti i nodi ricevono simultaneamente i vettori delle distanze dai propri vicini, calcolano i rispettivi nuovi vettori e informano i vicini degli eventuali cambiamenti. Dopo aver studiato questo esempio vi dovreste convincere che l’algoritmo opera correttamente anche in modo asincrono, con calcoli ai nodi, generazione e ricezione di aggiornamenti in qualsiasi istante.
La colonna di sinistra mostra tre tabelle di instradamento (routing table) iniziali per ciascuno dei tre nodi. All’interno di una specifica tabella di instradamento le righe rappresentano i vettori delle distanze: più precisamente, la tabella di instradamento di ciascun nodo include il proprio vettore delle distanze e quello dei suoi vicini.
Pertanto, la prima riga nella tabella di instradamento iniziale del nodo
La seconda e la terza riga di questa tabella rappresentano i vettori delle distanze ricevuti più di recente rispettivamente dai nodi
Dopo l’inizializzazione, ciascun nodo invia il proprio vettore ai suoi vicini come
mostrato dalle frecce dalla prima alla seconda colonna delle tabelle.
Per esempio, il nodo
Dopo aver ricevuto gli aggiornamenti, i nodi ricalcolano il vettore delle distanze. Per esempio, il nodo
(***)
dell’algoritmo Bellman-Ford; quindi, a questo stadio dell’algoritmo, per il nodo Quando un nodo che esegue l’instradamento DV rileva un cambiamento nel costo dei collegamenti con un vicino aggiorna il proprio vettore delle distanze e, se si verifica un cambiamento nel costo del percorso a costo minimo, trasmette ai suoi vicini il proprio nuovo vettore delle distanze. La figura di seguito mostra uno scenario in cui avviene il cambiamento del costo di un collegamento passando da 4 a 1.
Ci concentreremo solo su
Prendiamo in considerazione ora che cosa può avvenire quando il costo di un collegamento aumenta. Supponiamo che il costo del collegamento tra x e y passi da 4 a 60.
..i pacchetti vengono fatti rimbalzare di continuo tra
Il ciclo proseguirà per diverse iterazioni fino a quando
Il risultato è che c'è stato un rallentamento. Ma se il costo anziché aumentare da 4 a 60 passava da 4 a 10.000? Il processo di aumento delle distanze sarebbe stato ancora più alto, per questo, tale problema viene chiamato anche count to infinity problem (problema di conteggio all'infinito).
Lo scenario appena descritto può essere evitato utilizzando una tecnica nota come poisoned reverse.
L'idea è semplice: se
Dato che
Vediamo come viene risolto il problema dei cicli che abbiamo incontrato nella figura:
utilizzando la tecnica dell'inversione avvelenata.
Come risultato dell'inversione avvelenata la tabella di distanza
Quando il costo del collegamento
Una volta ricevuto l’aggiornamento all’istante
Dato che questo è il nuovo percorso a costo minimo verso
Dato che
La risposta è negativa: i cicli che non riguardano semplicemente due nodi adiacenti non verranno rilevati dalla tecnica dell’inversione avvelenata.
Con DV ciascun nodo dialoga solo con i vicini direttamente connessi, informandoli delle stime a costo minimo da sé stesso a tutti i nodi che conosce nelle rete. Con LS invece, ciascun nodo dialoga con tutti gli altri nodi via broadcast, ma comunica loro solo i costi dei collegamenti direttamente connessi.
Ricordiamo che