Piano di controllo e algoritmi di instradamento

Il piano di controllo del livello di rete

Lo studio del livello di rete viene completato analizzando il piano di controllo, responsabile del modo in cui le tabelle di inoltro e le tabelle dei flussi vengono calcolate, mantenute e installate nei router. Per realizzare queste funzioni sono possibili due approcci principali: il controllo per router e il controllo logicamente centralizzato.

Controllo per router

l’algoritmo di instradamento viene eseguito separatamente su ogni router. All’interno di ciascun dispositivo vengono quindi svolte sia le funzioni di inoltro, appartenenti al piano dei dati, sia quelle di instradamento, appartenenti al piano di controllo.

Controllo logicamente centralizzato

un controller logicamente centralizzato calcola le tabelle di inoltro e le distribuisce ai router che devono utilizzarle. Il controller interagisce con l’agente di controllo, indicato con CA — Control Agent, presente in ogni router. L’interazione avviene tramite un protocollo che consente di configurare e gestire la tabella dei flussi del router. Tipicamente il CA dispone di funzionalità minime: comunica con il controller ed esegue le operazioni che quest’ultimo gli ordina.

A differenza degli algoritmi di instradamento eseguiti direttamente nei router, gli agenti di controllo non interagiscono direttamente tra loro e non partecipano attivamente all’elaborazione delle tabelle di inoltro.

Con l’espressione controllo logicamente centralizzato si indica un servizio di controllo dell’instradamento al quale si accede come se fosse un singolo punto centrale. Il servizio può tuttavia essere implementato mediante più server, in modo da garantire una maggiore resistenza ai guasti e una migliore scalabilità delle prestazioni.

Scopo degli algoritmi di instradamento

Gli algoritmi di instradamento hanno lo scopo di determinare i percorsi, o cammini, che collegano le sorgenti alle destinazioni attraverso una rete di router. Tipicamente si ricerca il percorso avente il costo minimo, anche se nella pratica assumono importanza anche problemi concreti, come l’applicazione delle policy di instradamento.

Indipendentemente dal fatto che il piano di controllo utilizzi un approccio per router oppure un approccio logicamente centralizzato, deve sempre essere definita una sequenza precisa di router che il pacchetto attraversa durante il viaggio dall’host sorgente all’host destinatario.

Rappresentazione della rete mediante un grafo

I problemi di instradamento possono essere formulati utilizzando un grafo.

Grafo: un grafo è costituito da un insieme di nodi e da un insieme di archi, ciascuno dei quali collega una coppia di nodi appartenenti a .

Nel contesto dell’instradamento a livello di rete, i nodi rappresentano i router, che prendono decisioni sull’inoltro dei pacchetti, mentre gli archi rappresentano i collegamenti fisici tra i router.

A ogni arco è associato un costo, indicato con . Per gli scopi dell’analisi, i costi degli archi vengono considerati come dati, senza esaminare il modo in cui sono stati determinati. Il termine metrica viene spesso utilizzato per indicare il valore associato a un collegamento.

Se la coppia non appartiene all’insieme degli archi , si pone .

Vengono considerati grafi non orientati, cioè dotati di archi bidirezionali. Di conseguenza, l’arco coincide con l’arco e vale .

Un nodo è detto adiacente, o vicino, a un nodo se è un arco appartenente a .

Percorso: un percorso in un grafo è una sequenza di nodi tale che ciascuna coppia consecutiva

Il costo del percorso è uguale alla somma dei costi di tutti gli archi che lo compongono:

Tra due nodi qualsiasi e possono esistere più percorsi, ciascuno caratterizzato da un proprio costo. Uno o più di questi percorsi possono costituire un percorso a costo minimo, cioè un percorso che collega l’origine alla destinazione sostenendo il costo complessivo più basso.

Se tutti gli archi del grafo hanno lo stesso costo, il percorso a costo minimo coincide anche con il percorso più breve, ossia con quello che attraversa il minor numero di collegamenti tra la sorgente e la destinazione.

Classificazione degli algoritmi di instradamento

Gli algoritmi di instradamento possono essere classificati secondo diversi criteri.

  1. Una prima distinzione riguarda la disponibilità delle informazioni sulla rete e separa gli algoritmi centralizzati da quelli decentralizzati.
    • Algoritmo di instradamento centralizzato: calcola il percorso a costo minimo tra una sorgente e una destinazione utilizzando una conoscenza globale e completa della rete. L’algoritmo riceve in ingresso tutti i collegamenti esistenti tra i nodi e i relativi costi. Prima di eseguire il calcolo deve quindi ottenere tutte queste informazioni. Gli algoritmi che utilizzano informazioni globali sullo stato della rete sono spesso chiamati LS - Link-State, o algoritmi con stato del collegamento, poiché devono conoscere il costo di ogni collegamento della rete.
    • Algoritmo di instradamento decentralizzato: calcola il percorso a costo minimo in maniera distribuita e iterativa. Nessun nodo possiede informazioni complete sul costo di tutti i collegamenti della rete. Inizialmente ciascun nodo conosce soltanto i costi dei collegamenti direttamente incidenti su di esso. Attraverso un processo iterativo e lo scambio di informazioni con i nodi adiacenti, ogni nodo calcola gradualmente il percorso a costo minimo verso una destinazione o verso un insieme di destinazioni. L’algoritmo decentralizzato considerato è chiamato DV - Distance-Vector, o algoritmo con vettore delle distanze, perché ogni nodo elabora un vettore contenente le stime dei costi, o distanze, verso tutti gli altri nodi della rete.
  2. Una seconda classificazione distingue gli algoritmi statici da quelli dinamici.
    • Statici: negli algoritmi di instradamento statici, i percorsi cambiano molto raramente e le modifiche sono spesso il risultato di un intervento umano, come la modifica manuale della tabella di inoltro di un router.
    • Dinamici: Gli algoritmi dinamici modificano invece gli instradamenti in risposta alle variazioni del volume di traffico o della topologia della rete. Possono essere eseguiti periodicamente oppure come conseguenza diretta di una modifica della topologia o del costo di un collegamento. Gli algoritmi dinamici rispondono meglio ai cambiamenti della rete.
  3. Una terza classificazione si basa sulla sensibilità dell’algoritmo al carico della rete.
    • Algoritmo sensibile al carico: utilizza costi dei collegamenti che variano dinamicamente per riflettere il livello corrente di congestione. Se a un collegamento congestionato viene associato un costo elevato, l’algoritmo tende a evitare di utilizzarlo.
    • Algoritmo insensibile al carico: gli algoritmi di instradamento impiegati attualmente in Internet, tra cui RIP, OSPF e BGP, sono invece insensibili al carico, poiché il costo di un collegamento non riflette esplicitamente il suo livello attuale o recente di congestione.

Nell’instradamento LS - Link-State, la topologia della rete e tutti i costi dei collegamenti sono noti e disponibili in ingresso all’algoritmo. Questa conoscenza viene ottenuta facendo inviare a ogni nodo dei pacchetti relativi allo stato dei propri collegamenti. Tali pacchetti vengono distribuiti a tutti gli altri nodi della rete e contengono l’identità e il costo dei collegamenti connessi al nodo mittente. Nella pratica, come nel caso del protocollo OSPF, la distribuzione viene spesso realizzata mediante un algoritmo di link-state broadcast. In questo modo tutti i nodi dispongono di una vista identica e completa della rete, e ciascun nodo che esegue l’algoritmo LS ottiene gli stessi risultati. L’algoritmo utilizzato per calcolare i percorsi nell’instradamento link-state è l’algoritmo di Dijkstra.

Algoritmo di Dijkstra

L’algoritmo di Dijkstra calcola i percorsi a costo minimo da un nodo origine a tutti gli altri nodi del grafo. Utilizza:

  • , stima corrente del costo da a ;
  • , predecessore di nel percorso conosciuto;
  • , insieme dei nodi per i quali il percorso minimo è definitivo.

Pseudocodice

Algoritmo Dijkstra dal nodo origine u
 
1   Inizializzazione:
2       N’ = {u}
3       per tutti i nodi v
4           se v è adiacente a u
5               allora D(v) = c(u,v)
6           altrimenti D(v) = ∞
 
8   Ciclo
9       determina un w non in N’ tale che D(w) sia minimo
10      aggiungi w a N’
11      aggiorna D(v) per ciascun nodo v adiacente a w e non in N’:
12          D(v) = min {D(v), D(w) + c(w,v)}
13          /* il nuovo costo verso v è il vecchio costo verso v
14             oppure il costo del percorso minimo noto verso w più il
               costo da w a v */
15      ripeti in ciclo finché non si verifica che N’ = N

Inizialmente contiene soltanto . Per ogni nodo adiacente a si pone e ; per gli altri nodi si pone e il predecessore rimane non definito.

A ogni iterazione viene scelto il nodo con distanza minima. Il suo percorso viene considerato definitivo e viene aggiunto a . Successivamente si esaminano i vicini di non ancora risolti: se , il percorso attraverso è migliore, quindi si aggiornano e . In forma compatta, l’aggiornamento è .

Il ciclo termina quando . A quel punto, contiene il costo minimo da a ogni nodo , mentre i predecessori permettono di ricostruire i relativi percorsi.

Esempio applicazione dell'algoritmo di Dijkstra

Considerando la rete rappresentata nella Figura 5.3, si possono calcolare i percorsi a costo minimo dal nodo verso tutte le destinazioni.

Durante l’inizializzazione, i costi dei percorsi conosciuti da ai nodi adiacenti , e vengono posti rispettivamente a , e . Il costo verso è inizialmente uguale a perché questo è il costo del collegamento diretto da a , anche se successivamente verrà individuato un percorso di costo inferiore. I costi verso e sono posti a , poiché questi nodi non sono adiacenti a .

Nella prima iterazione vengono esaminati i nodi che non appartengono ancora a . Il nodo avente il costo minimo è , con costo , e viene quindi aggiunto all’insieme. Successivamente vengono aggiornati i costi dei nodi adiacenti a .

Il costo del percorso verso non cambia. Il costo verso , che al termine dell’inizializzazione era uguale a , diventa passando attraverso . Viene pertanto selezionato il percorso di costo inferiore e il predecessore di lungo il percorso minimo da diventa . Analogamente, il costo verso attraverso viene calcolato come e la tabella viene aggiornata di conseguenza.

Nella seconda iterazione, i nodi e hanno entrambi un percorso di costo minimo pari a . Se ne sceglie arbitrariamente uno, per esempio , e lo si aggiunge a , che contiene ora , e . I costi verso i nodi rimanenti, cioè , e , vengono aggiornati applicando la regola dell’algoritmo. I risultati corrispondono alla terza riga della Tabella 5.1.

Il procedimento prosegue nello stesso modo fino a quando tutti i nodi appartengono a . Al termine dell’algoritmo, per ogni nodo è noto il predecessore lungo il percorso a costo minimo a partire dall’origine.

La tabella di inoltro di un nodo, per esempio , può essere costruita utilizzando queste informazioni. Per ciascuna destinazione viene memorizzato il nodo corrispondente al successivo hop lungo il percorso a costo minimo da alla destinazione.

Complessità dell’algoritmo di Dijkstra

Un’implementazione dell’algoritmo di Dijkstra che ricerca il valore minimo esaminando ogni volta tutti i nodi ha, nel caso peggiore, una complessità quadratica, pari a . Un’implementazione più sofisticata può utilizzare un heap, la complessità si riduce a

Oscillazioni nell’instradamento sensibile alla congestione

Un comportamento patologico può verificarsi quando il costo di un collegamento dipende dalla quantità di traffico che lo attraversa. In questo esempio, il costo di ciascuna direzione di un collegamento coincide con il carico trasportato in quella direzione.

I costi non sono quindi necessariamente simmetrici: può accadere che , perché le due direzioni dello stesso collegamento possono trasportare quantità di traffico differenti.

I nodi generano il seguente traffico, tutto diretto verso :

  • genera una quantità di traffico pari a ;
  • genera una quantità di traffico pari a ;
  • genera una quantità di traffico pari a .

Per evitare ambiguità, l’ordine dei nodi in senso orario è:

Di conseguenza, da

  • il percorso in senso orario verso è
  • mentre quello in senso antiorario è Configurazione iniziale Nella Figura 5.5(a), il traffico segue questi percorsi:
  • raggiunge direttamente attraverso ;
  • raggiunge direttamente attraverso ;
  • raggiunge attraverso .

Il collegamento trasporta soltanto il traffico generato da , quindi ha costo . Il collegamento trasporta il traffico generato da , quindi ha costo . Il collegamento trasporta sia il traffico generato da sia quello proveniente da . Il suo costo è pertanto:

Le direzioni opposte dei collegamenti non trasportano traffico e hanno quindi costo . Primo ricalcolo dei percorsi I router eseguono ora nuovamente l’algoritmo utilizzando i costi della configurazione iniziale.

  1. Per il nodo :
    • il percorso diretto verso ha costo:
    • Il percorso in senso orario ha invece costo: Poiché , il nodo decide di spostare il proprio traffico sul percorso in senso orario.
  2. Anche il nodo confronta i due percorsi.
    • Il percorso in senso orario ha costo:
    • Il percorso in senso antiorario , leggendo i costi riportati nella figura, ha invece costo: Poiché , anche sceglie il percorso in senso orario.
  3. Il nodo continua invece a utilizzare il collegamento diretto . Dopo queste decisioni, il traffico segue quindi i percorsi:
  • ;
  • ;
  • . Si ottiene così la configurazione mostrata nella Figura 5.5(b).

Nella nuova configurazione, tutto il traffico procede in senso orario.

  • Il collegamento trasporta il traffico di , quindi ha costo:
  • Il collegamento trasporta il traffico di e quello di quindi ha costo
  • Il collegamento trasporta il traffico generato da tutti e tre i nodi, quindi ha costo:

Le direzioni opposte non trasportano traffico e hanno costo . Il problema nasce dal fatto che tutti i router hanno cambiato percorso contemporaneamente. La direzione che prima sembrava conveniente è ora diventata congestionata, mentre la direzione opposta appare completamente libera.

Secondo ricalcolo dei percorsi Quando l’algoritmo viene eseguito di nuovo utilizzando i costi della Figura 5.5(b), ogni nodo osserva che i collegamenti in senso antiorario hanno costo nullo o comunque inferiore. Hanno tutti costo 0 quindi tutti e tre i nodi decidono quindi di spostare simultaneamente il proprio traffico in senso antiorario. Si ottiene la configurazione della Figura 5.5(c), nella quale:

  • utilizza direttamente
  • utilizza
  • utilizza .

Dopo lo spostamento del traffico si ottiene che i percorsi in senso orario hanno un costo minore, quindi al prossimo ricalcolo i router cambieranno di nuovo direzione. Questa oscillazione nasce dalla combinazione di due fattori:

  1. i costi dei collegamenti dipendono dal traffico corrente;
  2. tutti i router ricalcolano e cambiano percorso nello stesso momento.

Una possibile soluzione sarebbe rendere i costi indipendenti dal traffico, ma ciò impedirebbe all’algoritmo di evitare i collegamenti congestionati. Una soluzione più ragionevole consiste nel fare in modo che i router non eseguano l’algoritmo esattamente nello stesso istante, evitando che tutti spostino contemporaneamente il traffico nella stessa direzione.

Un algoritmo di instradamento centralizzato calcola il percorso migliore utilizzando una conoscenza globale della rete. È quindi necessario che ogni router conosca:

  • la topologia della rete;
  • i collegamenti disponibili;
  • il costo associato a ogni collegamento. Il protocollo Open Shortest Path First (OSPF) ottiene queste informazioni attraverso il link-state broadcast. Ogni router genera dei messaggi chiamati Link-State Advertisement (LSA), contenenti informazioni sui propri collegamenti e sui relativi costi, e li distribuisce agli altri router tramite il flooding. Il flooding è una tecnica di diffusione nella quale un dispositivo inoltra un messaggio su tutte le linee disponibili, eccetto quella dalla quale il messaggio è stato ricevuto. In questo modo il messaggio può raggiungere tutti i nodi della rete anche quando il mittente non conosce un percorso preciso verso ciascuno di essi. Nel caso di OSPF, il flooding non viene utilizzato per trasportare i normali dati degli utenti, ma per distribuire informazioni di controllo relative alla topologia e ai costi dei collegamenti.

Nelle reti con molti collegamenti e cicli, un messaggio può raggiungere più volte lo stesso dispositivo attraverso percorsi differenti. Senza opportuni controlli, ciò può causare:

  • pacchetti duplicati;
  • consumo inutile di banda;
  • aumento del carico sui dispositivi;
  • possibili loop;
  • saturazione della rete. Per questo motivo vengono utilizzati diversi meccanismi di controllo.
  1. Identificativo e numero di sequenza: ogni messaggio viene associato a un identificativo, generalmente formato dall’ID del dispositivo che lo ha generato e da un numero di sequenza progressivo. Quando un router riceve il messaggio, verifica se lo ha già elaborato:
    • se il messaggio è nuovo, lo registra e lo inoltra;
    • se ha già visto lo stesso identificativo e numero di sequenza, lo scarta.
  2. Limite di hop Un messaggio può contenere un valore che limita il numero massimo di dispositivi che può attraversare. Nel protocollo IP questo ruolo è svolto dal TTL.
  3. Eliminazione logica dei cicli: Guardando alla rete come ad un grafo, per evitare la circolazione indefinita dei messaggi, è possibile costruire una topologia logica priva di cicli, mantenendo eventualmente i collegamenti ridondanti inattivi o utilizzandoli soltanto come percorsi alternativi.
  4. Utilizzo di uno Spanning Tree: Uno Spanning Tree, o albero di copertura, è un sottoinsieme dei collegamenti della rete che:
    • collega tutti i dispositivi;
    • non contiene cicli;
    • mantiene fisicamente disponibili eventuali collegamenti ridondanti. I messaggi vengono inoltrati soltanto lungo i rami attivi dell’albero, evitando che possano circolare in modo indefinito. Questa tecnica è utilizzata principalmente nelle reti Ethernet attraverso lo Spanning Tree Protocol (STP).

Instradamento Distance-Vector

Introduzione

A differenza dell’instradamento LS, che utilizza informazioni globali, l’instradamento DV - Distance-Vector è distribuito, iterativo e asincrono.

  • È distribuito perché ogni nodo riceve una parte delle informazioni da uno o più vicini direttamente connessi e, dopo aver eseguito i propri calcoli, comunica loro i risultati.
  • È iterativo perché il processo viene ripetuto fino a quando non avvengono ulteriori scambi informativi tra i vicini. L’algoritmo è anche auto-terminante: non esiste un segnale esplicito che ordini di interrompere il calcolo; il sistema entra semplicemente in uno stato nel quale non sono necessari nuovi aggiornamenti.
  • È asincrono perché non richiede che tutti i nodi eseguano contemporaneamente le stesse operazioni o procedano allo stesso ritmo. Per implementare questo algoritmo viene usato la formula di bellam-ford
Formula di Bellman-Ford

Sia il costo del percorso a costo minimo dal nodo al nodo . I costi minimi sono legati dalla formula di Bellman-Ford: Il minimo viene calcolato su tutti i nodi vicini di . La relazione è intuitiva. Se il percorso da a inizia attraversando il collegamento da a un vicino , e da prosegue lungo il percorso a costo minimo verso , il suo costo complessivo è . Attraverso questa formula nasce l’algoritmo di bellman ford usato ampiamente nell’implementazione del distance vector

Vettori delle distanze e informazioni mantenute dai nodi

Ogni nodo deve stimare il costo necessario per raggiungere ciascuna destinazione . Questa stima viene indicata con:

Il pedice indica il nodo che sta effettuando il calcolo, mentre l’argomento indica la destinazione considerata. Di conseguenza, rappresenta la stima, mantenuta dal nodo , del costo del percorso a costo minimo da a .

È importante distinguere tra e :

  • è una stima che può cambiare durante l’esecuzione dell’algoritmo;
  • è il costo effettivo del percorso a costo minimo da a . Quando l’algoritmo converge, la stima diventa uguale al valore reale:

Il nodo raccoglie tutte le proprie stime all’interno di un unico vettore. Vettore delle distanze: il vettore delle distanze del nodo è:

Ogni nodo mantiene localmente tre tipi di informazioni.

  • Per ciascun vicino , conserva il costo del collegamento diretto .
  • Conserva il proprio vettore delle distanze , contenente le stime dei costi da verso tutte le destinazioni .
  • Conserva l’ultima copia ricevuta del vettore delle distanze di ciascun vicino . Il vettore ricevuto dal vicino è indicato con:Il valore rappresenta quindi la stima che il vicino possiede per raggiungere la destinazione . Il nodo non conosce l’intera topologia della rete: conosce soltanto i costi dei propri collegamenti diretti e le stime comunicate dai suoi vicini.

Periodicamente, oppure quando il proprio vettore cambia, ogni nodo invia una copia del proprio vettore delle distanze a tutti i vicini direttamente collegati. Quando il nodo riceve un nuovo vettore da un vicino , lo memorizza e ricalcola le proprie stime applicando la formula di Bellman-Ford: questa formula non viene quindi applicata una sola volta all’intero vettore. Il nodo la applica a ogni possibile destinazione Dopo il ricalcolo possono verificarsi due casi.

  • Se nessun valore del vettore è cambiato, il nodo non deve inviare alcun aggiornamento, perché i vicini possiedono già le sue stime più recenti.
  • Se almeno un valore è cambiato, il nodo invia il proprio vettore aggiornato a tutti i vicini

I vicini memorizzano il nuovo vettore ricevuto e utilizzano a loro volta queste informazioni per ricalcolare le proprie stime. Un cambiamento può quindi propagarsi progressivamente da un nodo ai suoi vicini e successivamente ai vicini dei vicini.

Lo scambio avviene in modo asincrono: non è necessario che tutti i nodi effettuino il calcolo o inviino i vettori nello stesso momento. Ciascun nodo reagisce quando riceve un aggiornamento oppure quando rileva una variazione nel costo di uno dei propri collegamenti diretti. l processo continua finché gli aggiornamenti non producono più cambiamenti. Quando tutti i vettori rimangono invariati, l’algoritmo entra in uno stato quiescente e le stime convergono ai costi effettivi dei percorsi minimi:

Pseudocodice Distance-Vector

Nel grafo , è l’insieme dei router e è l’insieme dei vicini diretti di .

Algoritmo Bellman-Ford per Distance Vector

A ciascun nodo x:

1   Inizializzazione:
2       per tutte le destinazioni y in N:
3           Dₓ(y) = c(x,y)  /* se y non è adiacente, allora c(x,y) = ∞ */
4       per ciascun vicino w
5           Dᵥ(y) = ? per tutte le destinazioni y in N
6       per ciascun vicino w
7           invia il vettore delle distanze Dₓ = [Dₓ(y): y in N] a w

9   ciclo
10      attendi (finché vedi cambiare il costo di un collegamento verso
11              qualche vicino w o finché ricevi un vettore delle distanze
12              da qualche vicino w)
13      per ogni y in N:
14          Dₓ(y) = minᵥ {c(x,v) + Dᵥ(y)}

16      se Dₓ(y) è cambiato per qualche destinazione y
17          invia il vettore delle distanze Dₓ = [Dₓ(y): y in N]
            a tutti i vicini

19  ripeti il ciclo indefinitamente

Per ogni destinazione , il nodo deve conoscere sia il costo stimato sia il vicino da utilizzare come successivo hop. Il vicino scelto viene indicato con ed è quello che produce il valore minimo nella formula di Bellman-Ford, se più vicini producono lo stesso valore minimo, può essere scelto arbitrariamente tra essi. La tabella di inoltro associa quindi alla destinazione il vicino , che rappresenta il router successivo lungo il percorso a costo minimo.

A differenza del Link-State, che richiede una mappa completa della rete prima di eseguire l’algoritmo di Dijkstra, il Distance-Vector è decentralizzato: ogni nodo conosce soltanto i costi dei collegamenti diretti e i vettori delle distanze ricevuti dai propri vicini. Questo meccanismo è utilizzato da protocolli come RIP e BGP.

Esempi di come DV calcola i vettori delle distance

La figura mostra l’esecuzione in modo sincrono: i nodi ricevono contemporaneamente i vettori, ricalcolano le stime e comunicano gli eventuali cambiamenti. In ogni tabella, la prima riga contiene il vettore locale e le altre gli ultimi vettori ricevuti dai vicini.

Per , il vettore iniziale è:

Prima di ricevere messaggi, le righe relative a e contengono . Dopo lo scambio iniziale, calcola:

La stima verso passa da a , usando come successivo hop quindi resta e invece .

La seconda colonna mostra i vettori aggiornati e quelli ricevuti. Solo e inviano un nuovo messaggio, perché il vettore di non cambia. Dopo un ulteriore ricalcolo, nessuna stima varia: l’algoritmo entra in stato quiescente e attende un nuovo vettore o una variazione del costo di un collegamento.

Diminuzione del costo di un arco

Quando un nodo che esegue l’algoritmo Distance-Vector rileva una variazione nel costo di un collegamento diretto, aggiorna il proprio vettore delle distanze applicando nuovamente la formula di Bellman-Ford. Se almeno una delle sue stime cambia, il nodo invia il vettore aggiornato ai propri vicini.

Un aumento o una diminuzione del costo di un collegamento non viene quindi comunicato direttamente a tutti i router della rete. L’informazione si propaga progressivamente: il nodo che rileva il cambiamento aggiorna le proprie stime e le comunica ai vicini; questi possono modificare i propri vettori e inviare a loro volta nuovi aggiornamenti.

Nella Figura 5.7(a), il costo del collegamento tra e diminuisce da a . L’analisi si concentra sui nodi e e sulle loro stime relative alla destinazione .

La propagazione dell’informazione avviene nel modo seguente.

  1. All’istante , il nodo rileva che il costo del collegamento diretto verso è diminuito da a . Aggiorna quindi la propria stima ponendo e invia il nuovo vettore delle distanze ai propri vicini.
  2. All’istante , il nodo riceve il vettore aggiornato di . Poiché il collegamento tra e ha costo , calcola il nuovo costo verso passando attraverso : La precedente stima di verso era pari a . Poiché il nuovo percorso ha costo , aggiorna il proprio vettore e comunica il cambiamento ai vicini.
  3. All’istante , il nodo riceve il nuovo vettore di . Tuttavia, il percorso diretto da a continua ad avere costo ed è quindi migliore del percorso che passa attraverso . Le stime di non cambiano e il nodo non invia ulteriori messaggi.

Dopo questi aggiornamenti, l’algoritmo entra nuovamente in uno stato quiescente. La diminuzione del costo si propaga rapidamente perché ogni nodo che riceve l’informazione individua immediatamente un percorso migliore.

Aumento del costo di un arco

La situazione diventa più problematica quando il costo di un collegamento aumenta. In questo caso, un nodo può continuare temporaneamente a utilizzare informazioni non aggiornate ricevute dai vicini, provocando la formazione di un ciclo di instradamento. Si supponga che il costo del collegamento tra e aumenti da a . Prima della modifica valgono:

  • e
  • e (deriva dal percorso , il cui costo è .)
  1. All’istante , il nodo rileva che il costo diretto verso è passato da a . Per aggiornare la propria stima confronta il percorso diretto, di costo , con quello che passa attraverso , il cui costo apparente è . Osservando globalmente la rete, questo risultato è errato: il nodo ritiene di poter raggiungere con costo proprio perché il suo percorso passa attraverso .
  2. Poiché la stima di è cambiata, all’istante il nodo comunica a il nuovo valore . Quando riceve l’aggiornamento, confronta il collegamento diretto verso , di costo , con il percorso attraverso : l nodo aggiorna la propria stima da a e comunica il nuovo valore a . Dopo aver ricevuto l’aggiornamento, calcola e invia il valore a , che a sua volta calcola .

Si forma così il ciclo . Un pacchetto destinato a che raggiunge uno dei due nodi viene inoltrato ripetutamente tra e , finché le informazioni di instradamento non vengono corrette oppure il pacchetto non viene eliminato.

Il procedimento continua nello stesso modo: , , , e così via. Le stime aumentano progressivamente, mentre i due nodi continuano a indicarsi reciprocamente come parte del percorso verso . Il processo termina soltanto quando calcola che il percorso attraverso ha un costo superiore a , cioè al costo del proprio collegamento diretto verso . A quel punto sceglie il collegamento diretto e comunica la nuova informazione a , che può finalmente raggiungere passando correttamente attraverso con costo .

Nell’esempio sono necessarie iterazioni prima che venga individuato il percorso corretto. Se passasse da a e fosse pari a , il numero di aggiornamenti richiesti sarebbe ancora maggiore.

Problema del conteggio all’infinito: fenomeno per cui, in seguito all’aumento del costo o al guasto di un collegamento, i nodi incrementano gradualmente le proprie stime prima di riconoscere che un percorso non è più conveniente o non è più disponibile. Le diminuzioni di costo si propagano rapidamente, mentre gli aumenti possono diffondersi molto lentamente

Inversione avvelenata

Lo specifico ciclo che può formarsi tra due nodi adiacenti può essere evitato mediante una tecnica chiamata inversione avvelenata.

Inversione avvelenata: se un nodo utilizza un vicino come successivo hop per raggiungere una determinata destinazione, comunica a quel vicino che la propria distanza verso tale destinazione è infinita.

Si supponga che il nodo raggiunga la destinazione passando attraverso , seguendo quindi il percorso . In questa situazione, non comunica a il proprio valore reale , ma dichiara invece . Il nodo continua a fornire questa informazione finché utilizza come successivo hop verso .

La motivazione è che il valore comunicato da non deve essere utilizzato da per costruire un nuovo percorso verso . Il percorso di , infatti, passa già attraverso ; se scegliesse a sua volta come successivo hop, i due nodi si indicherebbero reciprocamente e si formerebbe il ciclo .

Applicando l’inversione avvelenata allo scenario precedente, prima dell’aumento del costo il nodo raggiunge attraverso e comunica quindi a quest’ultimo che .

  • All’istante , il costo del collegamento diretto tra e aumenta da a . Il nodo confronta il percorso diretto, di costo , con quello attraverso , che in base all’informazione avvelenata ha costo infinito: Di conseguenza, non sceglie erroneamente e continua temporaneamente a utilizzare il collegamento diretto verso . Comunica quindi a il nuovo valore .
  • All’istante , il nodo riceve l’aggiornamento e confronta il collegamento diretto verso , di costo , con il percorso attraverso , di costo : Il nodo sceglie quindi il collegamento diretto verso . Poiché non utilizza più come successivo hop, non deve più avvelenare il percorso e può comunicare a il valore reale .
  • All’istante , il nodo riceve il nuovo valore e aggiorna la propria distanza: Il nuovo percorso minimo di verso diventa quindi . A questo punto è a utilizzare come successivo hop; di conseguenza, applicando l’inversione avvelenata, comunica a che , anche se la sua distanza reale verso è pari a .

L’inversione avvelenata impedisce quindi la formazione di un ciclo tra due nodi che si indicano reciprocamente come successivo hop. Non risolve però completamente il problema del conteggio all’infinito: i cicli che coinvolgono tre o più nodi possono non essere rilevati, poiché ciascun nodo avvelena il percorso soltanto nei confronti del vicino utilizzato come successivo hop.

Confronto tra instradamento LS e DV

Gli algoritmi LS e DV adottano approcci diversi per calcolare i percorsi.

  • Complessità dei messaggi
    • LS richiede che ogni nodo conosca i costi di tutti i collegamenti, generando messaggi. Ogni variazione di costo deve essere comunicata a tutti i nodi.
    • DV scambia informazioni solo tra nodi adiacenti. Gli aggiornamenti vengono propagati quando modificano uno o più percorsi a costo minimo.
  • Velocità di convergenza: LS ha complessità e richiede messaggi. DV può convergere lentamente, creare cicli ed essere soggetto al conteggio all’infinito.
  • Robustezza: in presenza di router guasti o malevoli:
    • Con LS, un router può dichiarare costi errati solo per i propri collegamenti o alterare i pacchetti ricevuti. Tuttavia, ogni nodo calcola autonomamente la propria tabella, limitando la propagazione degli errori.
    • Con DV, un nodo può comunicare percorsi errati verso tutte le destinazioni. Poiché le informazioni vengono propagate tra vicini, un errore può diffondersi nell’intera rete. Nessuno dei due approcci è sempre migliore: sia LS sia DV sono utilizzati in Internet.

Routing in internet

Per facilitare il routing in Internet, quest’ultimo è organizzato in sistemi autonomi (AS). Ogni sistema autonomo è trattato come una singola entità amministrativa.

  • All’interno di sistema autonomo, tutti i router eseguono lo stesso algoritmo di routing, chiamato protocollo di instradamento intra-AS.
  • Per l’instradamento tra AS distinti si usano invece protocolli di instradamento inter-AS.

Questa organizzazione in sistemi autonomi, garantisce una maggiore autonomia amministrativa e migliore scalabilità. Ogni sistema autonomo è identificato da un numero di sistema autonomo (ASN).

RIP - Routing Information Protocol (intra-AS)

È un protocollo di routing basato sull’algoritmo Distance Vector per il routing interno ai sistemi autonomi. La sua metrica è il numero di hop, ovvero il numero di router da attraversare per raggiungere una determinata destinazione.

  • Supporta al più 15 hop. Una destinazione con hop è irraggiungibile.
  • I router scambiano informazioni relative alle tabelle di routing ogni 30 secondi.
  • Un percorso non aggiornato per 180 secondi è marcato come irraggiungibile.
  • Dopo altri 120 secondi viene rimosso dalla tabella (garbage collection).

Sfrutta inoltre due tipi di messaggi:

  • REQUEST per richiedere informazioni di routing ai router vicini.
  • RESPONSE per fornire aggiornamenti sulla propria tabella di routing.

Visto che è basato su distance vector soffre del problema del count to infinity

Tabelle di routing RIP

Contengono:

  • Indirizzo di destinazione.
  • Distanza minima (in hop) verso .
  • Prossimo hop per arrivare a .
  • Un timeout.
  • Un timer per la garbage collection.
Versioni di RIP
  • RIP v1 supporta solo indirizzamento classful senza subnet. Il campo next hop non è esplicito, e non supporta autenticazione.
  • RIP v2 supporta CIDR, Poison Reverse, autenticazione e next hop esplicito nel messaggio.
  • RIPng (next generation) per IPv6, basata su RIP v2. Non supporta l’autenticazione.
OSPF - Open Shortest Path First (intra-AS)

È un protocollo di routing intra-AS di tipo Link State usato soprattutto nei contesti di rete medio-grandi e nei backbone degli ISP. È molto scalabile e robusto. Ogni router OSPF:

  • Costruisce una mappa topologica completa del sistema autonomo usando il flooding. Costruisce un grafo della rete.
  • Esegue localmente l’algoritmo di Dijkstra e determina l’albero dei cammini minimi da se stesso.
  • Mantiene un Link-State Database con informazioni sui collegamenti noti.
  • Manda aggiornamenti periodici tramite dei Link-State Advertisements, rendendo il protocollo molto robusto.

TIP

Il backbone di un ISP è la sua rete dorsale principale, cioè l’infrastruttura ad alta capacità che trasporta grandi quantità di traffico Internet tra città, regioni, data center e altre reti. In pratica:

  • tu ti colleghi alla rete di accesso dell’ISP tramite fibra, rame o rete mobile;
  • il traffico viene raccolto e inoltrato verso il backbone;
  • dal backbone passa poi verso altri ISP, servizi online o punti di interscambio Internet.

I messaggi sono del tipo:

  • HELLO, trasmissione periodica per Neighbor Discovery.
  • Database Description, per condividere le informazioni link-state tra i vari router
  • LS Request, per richiedere parti specifiche del link-state database di un vicino.
  • LS Update, per effettuare il flooding.
  • LS ACK, dei segnali di ACK relativi al Link-State update.

E ogni nodo effettua questi passaggi:

  1. Scoperta dei vicini, in cui i router scoprono i nodi adiacenti inviando messaggi HELLO.
  2. Sincronizzazione dei database, EXCHANGE, con scambio e confronto delle informazioni Link-State.
  3. Aggiornamento dei database, FLOODING, con messaggi tramite cui i cambiamenti dei cammini minimi sono propagati.
BGP - Border Gateway Protocol

È un protocollo di routing inter-AS, e quindi tra sistemi autonomi. È fondamentale per il funzionamento di Internet, tanto quanto IP, in quanto è il collante tra tutti i vari AS.

  • Comunicare la raggiungibilità delle sotto reti: Permettendo a ciascun sistema di rendersi visibile rispetto i prefissi di rete che gestisce. È tramite BGP che tutti i router conoscono le sottoreti vicine.
  • Determinare i percorsi ottimali verso le sottoreti: Un router può apprendere più percorsi verso un determinato prefisso (ovvero una sottorete). La selezione del percorso migliore avviene in base alle politiche del sistema autonomo e alle informazioni di raggiungibilità fornite da BGP.
Funzionamento di BGP

Un router che esegue il protocollo BGP è detto BGP speaker. Due BGP speaker configurati per scambiarsi informazioni di routing sono detti BGP peer o BGP neighbors e comunicano attraverso una sessione TCP, normalmente sulla porta 179. Le sessioni possono essere di due tipi:

  • eBGP - External BGP, tra router appartenenti a sistemi autonomi differenti. Serve a scambiare informazioni sulla raggiungibilità dei prefissi tra AS diversi.
  • iBGP - Internal BGP, tra router appartenenti allo stesso sistema autonomo. Serve a distribuire all’interno dell’AS le rotte esterne apprese tramite eBGP.

iBGP non sostituisce un protocollo intra-AS come OSPF o RIP: iBGP comunica quale prefisso esterno è raggiungibile e quale next hop utilizzare, mentre OSPF o RIP determinano il percorso interno necessario per raggiungere quel next hop.

Supponiamo che un AS voglia dichiarare la raggiungibilità del prefisso (x). Un router BGP invia l’annuncio ai propri peer, che possono accettarlo, modificarne alcuni attributi e propagarlo ulteriormente secondo le politiche del proprio AS. L’insieme formato dal prefisso e dai relativi attributi è detto route BGP, cioè rotta BGP. Tra le informazioni principali di una rotta troviamo:

  • il prefisso (x), cioè la rete resa raggiungibile;
  • AS-PATH, la sequenza degli AS attraversati dall’annuncio;
  • NEXT-HOP, l’indirizzo IP del router verso cui inoltrare i pacchetti per utilizzare quella rotta.

Quando un annuncio viene propagato tramite eBGP, ogni AS aggiunge normalmente il proprio ASN all’AS-PATH. Questo attributo descrive quindi il percorso tra sistemi autonomi e permette anche di evitare i loop: se un AS riceve un annuncio nel cui AS-PATH compare già il proprio ASN, scarta la rotta. Nelle comunicazioni iBGP, invece, l’AS-PATH normalmente non viene modificato, perché l’annuncio resta all’interno dello stesso AS.

Il NEXT-HOP non rappresenta necessariamente l’intero percorso, ma il prossimo router da raggiungere per utilizzare la rotta. Affinché la rotta sia valida, il NEXT-HOP deve essere raggiungibile tramite il protocollo di routing interno dell’AS.

Un router può apprendere più rotte verso lo stesso prefisso. BGP non sceglie il percorso migliore mediante una sola metrica, ma attraverso un processo decisionale basato sulle politiche dell’AS e su diversi attributi, tra cui:

  • LOCAL_PREF, che esprime la preferenza interna per una rotta;
  • lunghezza dell’AS-PATH;
  • MED, che può suggerire il punto di ingresso preferito in un AS;
  • preferenza di una rotta eBGP rispetto a una iBGP;
  • costo del percorso interno necessario per raggiungere il NEXT-HOP.