Anteprima
Vedrai una selezione di 3 pagine su 7
Algoritmi di instradamento Pag. 1 Algoritmi di instradamento Pag. 2
Anteprima di 3 pagg. su 7.
Scarica il documento per vederlo tutto.
Algoritmi di instradamento Pag. 6
1 su 7
Disdici quando vuoi 162x117
Disdici quando
vuoi
Acquista con carta
o PayPal
Scarica i documenti
tutte le volte che vuoi
Estratto del documento

informazioni con i nodi adiacenti, un nodo gradualmente calcola il percorso a costo

minimo verso una destinazione o un insieme di destinazioni. L’algoritmo

d’instradamento decentralizzato è chiamato algoritmo a vettore distanza, DV,

poiché ogni nodo elabora un vettore di stima dei costi (distanze) verso tutti gli altri

nodi nella rete.

Un secondo criterio per classificare gli algoritmi d’instradamento riguarda il fatto di essere

statici o dinamici. Negli algoritmi d’instradamento statici i cammini cambiano molto

raramente. Gli algoritmi d’instradamento dinamici invece determinano gli instradamenti

al variare del volume di traffico o della topologia della rete. Gli algoritmi dinamici

rispondono meglio ai cambiamenti della rete, ma sono anche più soggetti a problemi.

Un terzo modo per classificare gli algoritmi d’instradamento è il fatto di essere sensibili al

carico o meno.

In un algoritmo sensibile al carico, i costi dei collegamenti variano dinamicamente per

riflettere il livello corrente di congestione del collegamento sottostante. Se si associa un

alto costo a un collegamento attualmente trafficato, un algoritmo d’instradamento tenderà

ad evitare di percorrerlo. Gli attuali algoritmi d’instradamento Internet (quali RIP, OSPF e

BGP) sono insensibili al carico, dato che il costo di un collegamento non riflette

esplicitamente il suo attuale (o recente) livello di congestione.

Algoritmo d’instradamento a stato del collegamento (LS)

La topologia di rete e tutti i costi dei collegamenti sono noti, ossia disponibili in input

all’algoritmo LS. Ciò si ottiene facendo inviare a ciascun nodo pacchetti di stato del

collegamento a tutti gli altri nodi della rete. Questi pacchetti contengono identità e costi

dei collegamenti connessi al nodo che li invia. L’algoritmo d’instradamento a stato del

collegamento che presentiamo ora è noto come algoritmo di Dijkstra, dal nome del suo

ideatore. Esso calcola il cammino a costo minimo da un nodo (l’origine, che chiameremo

u) a tutti gli altri nodi nella rete, è iterativo e ha le seguenti proprietà: dopo la k-esima

iterazione, i cammini a costo minimo sono noti a k nodi di destinazione, e tra i percorsi a

costo minimo verso tutti i nodi di destinazione, questi k cammini hanno i k costi più bassi.

Definiamo la seguente notazione.

D(v): costo minimo del cammino dal nodo origine alla destinazione v per quanto

 concerne l’iterazione corrente dell’algoritmo.

p(v): immediato predecessore di v lungo il cammino a costo minimo dall’origine a

 v.

N’: sottoinsieme di nodi che contiene tutti (e solo) i nodi v per cui il cammino a

 costo minimo dall’origine a v è definitivamente noto.

L’algoritmo globale d’instradamento consiste in un passo d’inizializzazione seguito da un

ciclo che viene eseguito una volta per ogni nodo del grafo. Quando termina, l’algoritmo

avrà calcolato il cammino minimo dal nodo origine u a tutti gli altri nodi.

Algoritmo LS dal nodo origine u

1 Inizializzazione:

2 N'={u} 2

3 per tutti i nodi v

4 se v è adiacente ad u

5 allora D(v)=c(u,v)

6 altrimenti D(v)=∞

7

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 oppure il costo del cammino

14 minimo noto verso w più il costo da w a v */

15 finché N'=N.

Ad esempio consideriamo la rete nella figura e calcoliamo i percorsi a costo minimo da u a

tutte le destinazioni.

1. Nel passo d’inizializzazione, i valori dei cammini a costo minimo noti da u ai suoi

nodi adiacenti, v, w e x, sono posti rispettivamente a 2, 5 e 1. In particolare il costo

verso w vale 5 dato che questo è il costo del collegamento diretto (un hop) da u a

w. I costi verso y e z sono posti a infinito dato che tali nodi non sono adiacenti a u.

2. Nella prima iterazione, prendiamo in considerazione i nodi non ancora aggiunti

all’insieme N’ e determiniamo il nodo a costo minimo come alla fine della

precedente iterazione. Tale nodo è x, di costo 1, e pertanto x viene aggiunto

all’insieme N’. Viene poi eseguita la riga 12 dell’algoritmo LS per aggiornare D(v)

per tutti i nodi, ottenendo i risultati mostrati nella seconda riga (passo 1) della

tabella. Il costo del cammino verso v non è cambiato. Il costo del cammino verso w

(che era 5 al termine dell’inizializzazione) passando per il nodo x è diventato 4.

Viene quindi selezionato questo cammino a costo inferiore e il predecessore di w

lungo il cammino minimo da u diventa x. In modo simile, il costo verso y

(attraverso x) viene calcolato essere 2, e la tabella viene aggiornata di conseguenza.

3. Nella seconda iterazione, si trova che i nodi v e y hanno cammini a costo minimo

(2), ne scegliamo arbitrariamente uno e aggiungiamo y all’insieme N’ che ora

conterrà u, x e y. I costi verso i nodi rimanenti non ancora in N’, ossia v, w e z sono

aggiornati dalla riga 12 dell’algoritmo LS, ottenendo i risultati mostrati nella terza

riga della tabella.

4. E così via….

Tabella di esecuzione dell’algoritmo LS sulla rete della figura

passo N’ D(v), p(v) D(w), p(w) D(x), p(x) D(y), p(y) D(z), p(z)

0 u 2, u 5, u 1, u ∞ ∞

1 ux 2, u 4, x 2, x ∞

2 uxy 2, u 3, y 4, y

3 uxyv 3, y 4, y

4 uxyvw 4, y 3

5 uxyvwz

Quando l’algoritmo LS termina, abbiamo per ciascun nodo il suo predecessore lungo il

cammino a costo minimo dal nodo origine. Per ciascun predecessore, abbiamo il rispettivo

predecessore, e in questo modo riusciamo a costruire l’intero percorso dall’origine a tutte

le destinazioni. La tabella d’inoltro in un nodo, diciamo u, può pertanto essere costruita da

queste informazioni memorizzando, per ciascuna destinazione, il nodo del successivo hop

sul cammino a costo minimo da u alla destinazione. Complessivamente il numero totale di

nodi da cercare in tutte le iterazioni è n(n+1)/2.

Algoritmo d’instradamento con vettore distanza (DV)

Mentre LS usa informazioni globali, l’algoritmo con vettore distanza, DV, è iterativo,

asincrono e distribuito. E’ distribuito nel senso che ciascun nodo riceve parte

dell’informazione da uno o più dei suoi vicini direttamente connessi cui, dopo aver

effettuato il calcolo restituisce i risultati. E’ 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. L’algoritmo è asincrono nel senso che non richiede che tutti i

nodi operino al passo con gli altri. Discutiamo ora la relazione esistente tra costi e percorsi

a costo minimo. Sia d(y) il costo del percorso a costo minimo dal nodo x al nodo y. Allora i

costi minimi sono correlati dalla nota formula di Bellman-Ford:

d(y)=min{c(x,v)+d(y)}

dove min riguarda tutti i vicini di x. Tale relazione è piuttosto intuitiva. Infatti se, dopo

aver viaggiato da x a v, consideriamo il percorso a costo minimo da v a y, il costo del

cammino sarà c(x,v)+d(y). Dato che dobbiamo iniziare viaggiando verso qualche vicino v,

il costo minimo da x a y è il minimo di c(x,v)+d(y) calcolato su tutti i nodi adiacenti v.

L’idea di base è la seguente. Ciascun nodo x inizia con D(y), una stima del costo del

percorso a costo minimo da se stesso al nodo y, per tutti i nodi in N. Sia D=[D(y):y in N] il

vettore distanza del nodo x, che è il vettore delle stime dei costi da x a tutti gli altri nodi, y,

in N. Con l’algoritmo DV, ciascun nodo x mantiene i seguenti dati d’instradamento.

 Per ciascun vicino v, il costo c(x,v) da x a v

 Il vettore distanza del nodo x, che è D=[D(y):y in N], contenente la stima presso x

del costo verso tutte le destinazioni, y, in N.

 I vettori distanza di ciascuno dei suoi vicini, ossia D=[D(y):y in N], per ciascun

vicino y di x.

In questo algoritmo distribuito e asincrono, di quando in quando un nodo invia una copia

del proprio vettore distanza a ciascuno dei suoi vicini. Quando un nodo x riceve un nuovo

vettore distanza da qualcuno dei suoi vicini v, lo salva e quindi usa la formula di Bellman-

Ford per aggiornare il proprio vettore distanza come segue: 4

D(y)=min{c(x,v)+D(y)} per ciascun nodo y in N

Se il vettore distanza del nodo x è cambiato per via di tale passo di aggiornamento, il nodo

x manderà il proprio vettore distanza aggiornato a ciascuno dei suoi vicini, i quali a loro

volta aggiornano il proprio vettore distanza.

Algoritmo con vettore distanza

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

8 invia il vettore distanza 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é richiedi un vettore distanza

12 da qualche vicino w)

13 per ogni y in N:

14 D(y)=minv { c(x,v)+Dv(y)}

15

16 se D(y) è cambiato per qualche destinazione y

17 invia il vettore distanza D=[D(y):y in N] a tutti i vicini

18

19 continua

L’algoritmo DV mostra come un nodo x aggiorni la propria stima del vettore distanza

quando vede il cambiamento di costo in uno dei collegamenti direttamente connessi o

quando riceve da qualche vicino un vettore distanza aggiornato. Ma per aggiornare la

propria tabella d’inoltro per una data destinazione y, ciò che il nodo x ha davvero bisogno

di sapere non è la distanza sul percorso minimo verso y bensì il nodo vicino v*(y) che

rappresenta il router dell’hop successivo lungo il percorso più breve verso y. Come ci si

potrebbe aspettare, il router del successivo hop v*(y) è il vicino v che ottiene il minimo

nella riga 14 dell’algoritmo DV. Se esistono più vicini v che ottengono il minimo, allora

v*(y) può essere uno qualunque tra questi. Pertanto, nelle righe 13 e 14, per ciascuna

destinazione y il nodo x determina anche v*(y) e aggiorna la propria tabella d’inoltro per

la destinazione y.

Ricordiamo che l’algoritmo LS è globale nel senso che richiede a ciascun nodo di ottenere

innanzitutto una mappa completa della rete prima di mandare in esecuzione l’algoritmo

di Dijkstra. L’algoritmo DV è invece decentralizzato e non usa tale informazione globale.

Infatti le sole informazioni ottenute dal nodo sono il costo dei collegamenti verso i vicini

direttamente connessi e quelle ricevute da questi vicini. Ogni nodo attende aggiornamenti

5

dai suoi vicini (righe 10 e 11), quando riceve un aggiornamento calcola il proprio nuovo

vettore distanza (riga 14) e lo distribuisce ai suoi vicini (righe 16 e 17).

Esempio

figura

La illustra il funzionamento dell’algoritmo DV in una rete a tre nodi. Il

funzionamento dell’algoritmo viene mostrato in modo sincrono, in quanto tutti i nodi

ricevono simultaneamente i vettori distanza dai propri vicini, calcolano i rispettivi nuovi

vettori distanza 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 e generazione e ricezione di aggiornamenti in qualsiasi

istante.

La colonna di sinistra della figura mostra tre tabelle d’instradamento iniziali per ciascuno

dei tre nodi (ad esempio, in alto a sinistra è indicata quella del nodo x). All’interno di una

specifica tabella d’instradamento, le righe rappresentano i vettori distanza: più

precisamente, la tabella d’instradamento di ciascun nodo include il proprio vettore

distanza e quello dei suoi vicini. Pertanto, la prima riga nella tabella d’instradamento

iniziale del nodo x è D=[D(x),D(y),D(z)]=[0,2,7]. La seconda e la terza riga di questa tabella

rappresentano i vettori distanza ricevuti più di recente rispettivamente dai nodi y e z.

Poiché al momento dell’inizializzazione il nodo x non ha ricevuto nulla dai nodi y e z, i

valori della seconda e della terza riga sono posti a infinito.

Dopo l’inizializzazione, ciascun nodo invia il proprio vettore distanza ai suoi vicini come

Dettagli
Publisher
7 pagine
833 download