Come abbiamo già detto in un instradamento link-state la topologia di rete e tutti i costi dei collegamenti sono noti, ossia disponibili in input all'algoritmo. Ciò si ottiene facendo inviare a ciascun nodo, pacchetti sullo stato dei suoi collegamenti a tutti gli altri nodi della rete. Questi
pacchetti contengono identità e costi dei collegamenti connessi al nodo che li invia.
In pratica, questo risultato si ottiene (come per esempio nel protocollo OSPF) tramite un algoritmo di link-state broadcast.
L’algoritmo di calcolo dei percorsi che presentiamo associato all’instradamento
link-state è noto come algoritmo di Dijkstra, dal nome del suo ideatore. Un algoritmo
strettamente collegato è quello di Prim.
Dijkstra calcola il percorso a costo minimo da un nodo (l'origine, che chiameremo
Adotteremo la seguente notazione:
L'algoritmo di instradamento centralizzato consiste in un passo di inizializzazione seguito da un ciclo che viene eseguito una volta per ogni nodo del grafo. Quando termina, l'algoritmo avrà calcolato il percorso minimo dal nodo origine
Inizializzazione:
N' = {u}
per tutti i nodi v
se v è adiacente a u
allora D(v) = c(u,v)
altrimenti D(v) = infinito
Ciclo
determina un w non in N' tale che D(w) sia minimo
aggiungi w a N'
aggiorna D(v) per ciascun nodo v adiacente a w e non in N'
D(v) = min(D(v), D(w) + c(w,v))
/* il nuovo costo verso v è il vecchio costo verso v oppure il costo del costo del
del percorso minimo noto verso w più il costo da w a v */
ripeti il ciclo fino a che non si verifica N' = N
Esecuzione dell'algoritmo sulla rete della figura sopra: diciamo di voler conoscere tutti percorsi che vanno dal router
Per tutti i nodi che sono adiacenti (vicini) a
Nella prima iterazione prendiamo in considerazione i nodi non ancora aggiunti all'insieme
Considereremo una tabella come quella che segue, in cui abbiamo il passo dell'algoritmo e le distanze note da tutti i nodi e in cui indichiamo anche il predecessore immediato al nodo specificato nella colonna corrente.
Passo | ||||||
---|---|---|---|---|---|---|
0 |
Una volta appurato che
Infatti da
Passo | ||||||
---|---|---|---|---|---|---|
0 | ||||||
1 |
A questo punto va scelto il percorso minimo, tra quelli attualmente noti.
Teniamo presente che
Due percorsi minimi hanno lo stesso valore e sono i percorsi verso
Possiamo sceglierne uno a caso tra i due, diciamo
Passo | ||||||
---|---|---|---|---|---|---|
0 | ||||||
1 | ||||||
2 |
L'algoritmo continua così fino a che non si ottiene che
L'algoritmo finito mostra la seguente tabella:
quando Dijkstra finisce, abbiamo per ciascun nodo il suo predecessore lungo il percorso a costo minimo dal nodo origine. Per ciascun predecessore abbiamo il rispettivo predecessore, e in questo modo riusciamo a costruire l'interno percorso dall'origine a tutte le destinazioni. La tabella di inoltro di un nodo, diciamo
La figura sopra mostra i percorsi a costo minimo risultati dal grafo fornito inizialmente.
La complessità di Dijkstra è
Un'implementazione dell'algoritmo che sfrutta la struttura dati heap riesce a determinare il minimo della riga 9 (determina un w non in N' tale che w sia minimo
) in tempo logaritmico anziché lineare riducendone la complessità totale.
Prima di concludere con Dijkstra, diamo un'occhiata ad una situazione che si può verificare.
Diciamo di avere la seguente topologia di rete:
in cui abbiamo i router
In questa fase inziale, le tabelle di inoltro sono impostate in modo da instradare il traffico come è illustrato in figura (a).
Nella successiva iterazione dell'algoritmo, il nodo
Quando l'algoritmo viene eseguito nuovamente
La volta successiva tutti i nodi
Che cosa si può fare per evitare tali oscillazioni (di cui soffrono tutti gli algoritmi che utilizzano una metrica dei collegamenti basata sulla congestione o sul ritardo)? Una soluzione consiste nello stabilire che i costi dei collegamenti non dipendono dalla quantità di traffico trasportato: ipotesi inaccettabile dato che uno scopo dell'instradamento è evitare collegamenti troppo intasati. Un'altra soluzione consiste nell'assicurarsi che non tutti i router lancino l'esecuzione dell'algoritmo nello stesso istante.