LINK STATE
Home ]

 

Introduzione
Database Link State e LSP
Il protocollo flooding
Bringing up adjacencies
Sicurezza degli aggiornamenti
L'algoritmo di Dijkstra
Link State vs. Distance Vector

 

 

INTRODUZIONE

I protocolli di tipo Link State sono basati sul concetto di "mappa distribuita": tutti i nodi posseggono una copia della mappa della rete, che viene regolarmente aggiornata. In seguito esamineremo come la mappa sia in effetti rappresentata da un database, come avvengono gli aggiornamenti ai nodi della rete, perche' questi aggiornamenti devono essere sicuri ed infine perche' alcuni protocolli della famiglia Link State vengono denominati "shortest path first" (SPF)

Torna all'inizio

 

DATABASE LINK STATE E LSP

Il principio alla base dell'instradamento di tipo Link State e' molto semplice : Invece di calcolare i percorsi migliori in modo distribuito, tutti i nodi mantengono una copia intera della mappa della rete ed eseguono un calcolo completo dei migliori percorsi da questa mappa locale. La mappa e' contenuta in un database, dove ciascun record rappresenta un link nella rete. Ad esempio la rete sotto riportata

 

 

sara' rappresentata dal seguente database:

Da  A Link Distanza
A B 1 1
A D 3 1
B A 1 1
B C 2 1
B E 4 1
C B 2 1
C E 5 1
D A 3 1
D E 6 1
E B 4 1
E C 5 1
E D 6 1

Ciascun record e' inserito da una stazione responsabile per questo e che contiene un identificatore di interfaccia,  il numero di link nel nostro caso, e le informazioni che descrivono lo stato del link: la destinazione e la distanza o metrica. Con queste informazioni ogni nodo puo' facilmente calcolare il percorso piu' breve da se' stesso a tutti gli altri nodi. Con la velocita' degli attuali computers, e' necessario solo un brevissimo tempo, tipicamente una frazione di secondo se la rete non e' molto estesa, per calcolare tali percorsi. 

Poiche' tutti i nodi contengono lo stesso database ed eseguono lo stesso algoritmo di route-generation, i percorsi sono coerenti e non si verificano loops. Ad esempio, se noi inviamo un pacchetto dal nodo A al nodo C nella rete riportata in precedenza, ci baseremo sui calcoli tra i nodi A e B. Il nodo A puo' rilevare, tramite il database, che il percorso piu' corto verso C passa attraverso il nodo B e quindi invia il pacchetto sul link numero 1 . Il nodo B, a sua volta, inviera' il pacchetto sul link numero 2. 

I pacchetti inviati da un router e che, ricevuti dai vari router della rete, permettono la costruzione della mappa della rete, sono detti Link State Packet (LSP). 

Il Link State Packet (LSP) contiene:

  Stato di ogni link connesso al router

  Identità di ogni vicino connesso all'altro estremo del link (sulle LAN possono esserci migliaia di vicini)

  Costo del link

  Numero di sequenza per il LSP (a seguito di frequenti variazioni di topologia un router può ricevere un LSP vecchio dopo uno nuovo, quindi deve essere in grado di valutare il più recente)

  Checksum

  Lifetime (la validità di ogni LSP è limitata nel tempo, diversamente un errore sul numero di sequenza potrebbe rendere un LSP valido per anni)

Un LSP viene generato periodicamente, oppure quando viene rilevata una variazione nella topologia locale (adiacenze), ossia :

  Viene riconosciuto un nuovo vicino

  Il costo verso un vicino e' cambiato

  Si e' persa la connettivita' verso un vicino precedentemente raggiungibile

Il LSP è trasmesso in flooding su tutti i link del router e tutti i router del dominio di routing ricevono il LSP.

All'atto del ricevimento di un LSP il router compie le seguenti azioni:

  Se non ha mai ricevuto LSP da quel router o se il LSP è più recente di quello precedentemente memorizzato (campo Sequence Number), memorizza il pacchetto e lo ritrasmette in flooding su tutte le linee eccetto quella da cui l'ha ricevuto

  Se il LSP ha lo stesso numero di sequenza di quello posseduto non fa nulla

  Se il LSP è più vecchio di quello posseduto trasmette al mittente il pacchetto più recente

Vediamo, infine, un ulteriore esempio di una rete e dei relativi database (replicati per ogni nodo):

 

 

 

Torna all'inizio

 

IL PROTOCOLLO "FLOODING"

Il fine di un protocollo di routing e' quello di adattare i routers alle modifiche della rete. Questo puo' essere fatto solo se il database viene aggiornato dopo ogni modifica dello stato del link. Ad esempio, ipotizziamo che, nella rete vista in precedenza, il link 1 diventi indisponibile. I nodi A e B rileveranno il cambio di stato su questo link e dovranno quindi aggiornare, di conseguenza, i corrispondenti records nel database e inviarli a tutti gli altri nodi. Il protocollo da utilizzare per questo scopo dovrebbe essere veloce ed affidabile, ossia avere le caratteristiche del protocollo "flooding".

Subito dopo aver rilevato la caduta del link 1, il nodo A invia al nodo D il seguente messaggio di aggiornamento sul link 3 :

Da A, a B, link 1, distanza = infinita

il nodo D ritrasmettera' immediatamente il messaggio al nodo E sul link numero 6, per essere infine inviato a B sul link 4 e a C sul link 5. In effetti il messaggio sara' lievemente piu' complesso di quanto esposto. Se non venissero prese sufficienti precauzioni, potrebbe verificarsi che un vecchio messaggio torni indietro e comprometta il database. Per questo, ogni messaggio contiene un avviso dell'ora o un numero del messaggio che abilita il nodo in ricezione a distinguere le vecchie e le nuove informazioni. L'algoritmo flooding puo' quindi essere espresso  molto semplicemente nel modo seguente:

  1. Riceve il messaggio. Verifica la presenza del record nel database.

  2. Se il record non e' presente  lo aggiunge nel database e diffonde il messaggio.

  3. Altrimenti, se il numero nel database e' minore del numero del messaggio, rimpiazza il record con il nuovo valore e diffonde il messaggio.

  4. Altrimenti, se il numero nel database e' maggiore trasmette il valore del database in un nuovo messaggio, attraverso l'interfaccia di arrivo.

  5. Altrimenti, se i numeri sono uguali, non fa nulla.

In questo algoritmo l'operazione di diffusione causera' la trasmissione del messaggio su tutte le interfacce ad eccezione di quelle di arrivo. Se assumiamo che il numero iniziale associato con il record del database era 1, il messaggio inviato da A sara':

Da A, a B, link 1, distanza = infinita, numero = 2

D aggiornera' il proprio database e diffondera' il messaggio ad E che, a sua volta, aggiornera' il proprio database e inviera' il messaggio a B e C, i quali aggiorneranno i loro records e tenteranno di inviare, a loro volta, i messaggi a C e B rispettivamente. Quando riceveranno il secondo messaggio C e B rileveranno che il numero e' uguale a quello nel database e quindi non ritrasmetteranno oltre. L'algoritmo flooding si ferma qui. 

Nello stesso tempo, B avra' trasmesso il nuovo stato del link 1 a C ed E :

Da B, ad A, link 1, distanza = infinita, numero = 2

Il protocollo provvedera' ad aggiornare D e, di seguito, A e, quindi, saranno calcolati i nuovi percorsi. Il database dopo il flooding si presentera' dunque cosi' :

Da  A Link Distanza Numero
A B 1 Inf. 2
A D 3 1 1
B A 1 Inf. 2
B C 2 1 1
B E 4 1 1
C B 2 1 1
C E 5 1 1
D A 3 1 1
D E 6 1 1
E B 4 1 1
E C 5 1 1
E D 6 1 1

Poiche' l'obbiettivo e' quello di mantenere la rete operativa per un un tempo molto lungo, puo' accadere che la sequenza dei numeri possa eccedere il numero di bit assegnati per la loro codifica nei pacchetti o nei record del database; normalmente i protocolli usano una numerazione circolare a 32 bit ma necessitano di una specifica convenzione al fine di definire con certezza quando un numero X e' piu grande di un numero Y.

Torna all'inizio

 

BRINGING UP ADJACENCIES 

Consideriamo il caso, cosi' come abbiamo fatto per i protocolli distance vector, di un secondo link failure, anche in questo caso sul link 6. Per riassumere la situazione, osservando la rete in esame, i links "caduti" sono rispettivamente l' 1 e il 6.

Questo ha un'interessante conseguenza nel caso del link state. La caduta del link 6 viene rilevata dai nodi D ed E, ma entrambi saranno in grado di distribuire la nuova informazione solo ai loro vicini connessi. Dopo l'esecuzione dell'algoritmo di flooding, si avranno cosi' 2 versioni del database: la rete verra' divisa in due parti non connesse, A e D da un lato mentre B, C ed E dall'altro vedranno valori differenti.

Questo e' il database visto da A e D:

Da  A Link Distanza Numero
A B 1 Inf. 2
A D 3 1 1
B A 1 Inf. 2
B C 2 1 1
B E 4 1 1
C B 2 1 1
C E 5 1 1
D A 3 1 1
D E 6 Inf. 2
E B 4 1 1
E C 5 1 1
E D 6 1 1

mentre questo e' il database visto da B, C ed E:

Da  A Link Distanza Numero
A B 1 Inf. 2
A D 3 1 1
B A 1 Inf. 2
B C 2 1 1
B E 4 1 1
C B 2 1 1
C E 5 1 1
D A 3 1 1
D E 6 1 1
E B 4 1 1
E C 5 1 1
E D 6 Inf. 2

Questo non e' molto importante, poiche' qualsiasi route da A e D verso B, C o E avverra' attraverso un link con una metrica infinita. A e D rileveranno che B, C ed E sono irraggiungibili e altrettanto faranno B, C ed E nei confronti di A e D. Infatti, essi saranno in grado di calcolare questo nuovo stato di routing immediatamente dopo aver ricevuto il nuovo link state senza alcun rischio di impegnarsi in procedure di conteggio all'infinito, tipiche degli algoritmi distance vector. Se le 2 parti rimangono isolate per un lungo periodo, le 2 versioni del database  possono evolvere indipendentemente (per esempio il link2 puo' diventare disconnesso). Il database visto da B, C ed E allora diventerebbe:

Da  A Link Distanza Numero
A B 1 Inf. 2
A D 3 1 1
B A 1 Inf. 2
B C 2 Inf. 2
B E 4 1 1
C B 2 Inf. 2
C E 5 1 1
D A 3 1 1
D E 6 1 1
E B 4 1 1
E C 5 1 1
E D 6 Inf. 2

mentre il database visto da A e D non cambierebbe. Anche questo non e' molto importante: B, C ed E calcoleranno i percorsi corretti per scambiarsi pacchetti tra loro, mentre A e D rimarranno sconnessi.

Ma vediamo cosa succede quando uno dei 2 links viene resettato, riconnettendo di fatto le 2 parti. Distribuire semplicemente l'informazione sul nuovo link potrebbe non essere sufficiente. Supponiamo che sia il link 1 a tornare operativo; i records che lo descrivono verranno corretti in entrambe le parti della rete, ma i records che descrivono i link 2 e 6 saranno ancora incoerenti. Stabilire la connettivita' tra 2 nodi richiede qualcosa in piu' che semplicemente inviare un record di database. E' necessario garantire che le 2 parti allineino i propri database. Questa procedura e' chiamata "bringing up adjacencies" in OSPF, uno dei principali protocolli di routing basato sulla tecnologia link state..

L'allineamento dei due database e' facilitato dall'esistenza degli identificatori di link e dai numeri di versione. Le 2 parti devono sincronizzare i loro database e mantenere solo le versioni piu' aggiornate di ciascun record, ad esempio, per ciascun link, il record con il numero piu' grande. 

Tuttavia, implementare un "merge" scambiando copie complete, appare piuttosto inefficiente; nel caso che piu' record siano simili nelle 2 copie, non esiste la necessita' di inviarli. OSPF risolve questo problema definendo pacchetti di descrizione del database, che contengono solamente gli identificatori dei link ed i corrispondenti numeri di versione. Nella prima fase della procedura di sincronizzazione, entrambi i routers invieranno una completa descrizione dei loro records in una sequenza di pacchetti di descrizione. Dopo la ricezione di questi pacchetti, confronteranno i numeri di sequenza con quelli presenti nel proprio database e prepareranno una lista di "record interessati", ad esempio quando il numero remoto e' maggiore del numero locale o quando l'identificatore di link non e' presente nel database locale . Nella seconda fase, ciascun router richiedera' al proprio vicino una copia di tali record tramite dei pacchetti cosidetti di "link state request".

Come conseguenza della sincronizzazione, molti record verranno aggiornati e verranno inviati ai nodi vicini, utilizzando la normale procedura flooding.
 

Torna all'inizio

 

SICUREZZA DEGLI AGGIORNAMENTI

L'intera idea dei protocolli di routing "link state" e' di mantenere una copia sincronizzata del database sullo stato dei link in tutti i nodi della rete. Abbiamo visto che e' essenziale che tutte le copie siano identiche, altrimenti la coerenza degli instradamenti non potrebbe essere garantita. In realta', ci sono degli intervalli di transizione, durante i quali, alcuni nodi potrebbero essere piu' aggiornati rispetto ad altri; quello che succede, tipicamente, dopo un failure ad un link. Tuttavia, la procedura di flooding propaghera' velocemente gli aggiornamenti a tutti i nodi della rete.

Nel 1983, Radia Perlman dimostro' l'esigenza di proteggere attivamente i database distribuiti contro possibili corruzioni quali anomalie nelle procedure di flooding o di sincronizzazione, il mantenimento di record ormai superati nel database, errori di memoria o tentativi di corruzione esterna volontaria. Sfruttando questo lavoro, OSPF implementa una serie di protezioni contro questi pericoli, di seguito elencate :

  La procedura di flooding include il riconoscimento hop-by-hop

  I pacchetti di descrizione del database sono inviati in modo sicuro

  Ciascun record "link state" e' protetto da un timer e viene rimosso dal database se il pacchetto di aggiornamento non arriva nel tempo prestabilito

  Tutti i records prevedono il checksum

  Il messaggio puo' essere autenticato, ad esempio tramite una password 

Torna all'inizio

 

L'ALGORITMO DI DIJKSTRA

Abbiamo visto, nella pagina dedicata ai protocolli distance vector che, al fine di calcolare il percorso piu' breve, questi si basano sull'algoritmo di Bellman-Ford che e' un algoritmo piuttosto semplice ma non molto efficiente.

La proposta di un algoritmo piu' veloce ed efficiente fu avanzata da E.W. Dijkstra con il suo "shortest path first". L'algoritmo SPF calcola il percorso piu' breve tra un nodo sorgente ed un altro nodo della rete, definendo:

  1 nodo radice (root), ossia il nodo che sta calcolando l’algoritmo

  1 insieme PATH di nodi (ID, cost, link) per i quali si è già trovato il percorso migliore

  1 insieme TEMP di nodi (ID, cost, link) per i quali si sta cercando un percorso

L'algoritmo e' il seguente :

1. Si inserisce il nodo root in PATH

2. Si inseriscono tutti i nodi vicini del precedente in TEMP

3. Si prende il nodo N con il percorso più piccolo in TEMP e lo si promuove in PATH

4. Per ogni vicino V del nodo N promosso:

  Se V non esiste ancora in TEMP lo si inserisce ora

  Se V già esiste se ne analizza il costo verso la root (D(root, N) + D(N, V)) e se questo è minore del precedente riportato in TEMP si aggiorna cost e link di quel nodo in TEMP

 

Principi di funzionamento dell’algoritmo

  Ad ogni nodo è associata una etichetta che rappresenta il costo del cammino migliore trovato per raggiungerlo

  L'algoritmo etichetta progressivamente i nodi partendo da se stesso

il prossimo nodo etichettato è quello raggiungibile a costo più basso a partire da un nodo già etichettato

  L’algoritmo termina quando a tutti i nodi è stata associata un’etichetta

 

Un esempio

 

 

Al fine di applicare correttamente l'algoritmo di Dijkstra, la rappresentazione piu' appropriata e' quella tabellare, che immediatamente "rende" visibile lo stato della rete.

Nell'esempio sotto illustrato si riporta una rete con la tabella relativa al database:

 

 

Si puo' facilmente dimostrare che il numero totale dei percorsi che saranno considerati e' uguale al numero dei link nella rete. SPF converge in 0(M logM) iterazioni, mentre l'algoritmo di Bellman-Ford converge in 0(N M) iterazioni, dove M e' il numero dei link ed N e' il numero dei nodi, generalmente dello stesso ordine di grandezza del numero dei link. Per reti di grandi dimensioni con molti links, la differenza e' quindi sostanziale.

Abbiamo cosi' visto le ragioni del nome "OSPF" (Open Short Path First) - perche' i nodi si aspettano di supportare l'algoritmo SPF ed inoltre perche' la specifica fu sviluppata in modo "aperto" dall'IETF.

Torna all'inizio