Reti di Trasporto Algoritmi e protocolli di Routing Ing. Alessio Botta e-mail: [email protected] Le slides relative a questi argomenti sono quasi integralmente tratte dal corso di Sistemi di Commutazione del prof. Marco Listanti e dalle relative esercitazioni preparate dall’ing. Luca Veltri. Ad entrambi va il mio ringraziamento. [http://net.infocom.uniroma1.it/sdc/sdc.htm] 1 Teoria dei Grafi • Un grafo G(V,E) è dato da » un insieme V di nodi » un insieme E di rami, ogni ramo connette una coppia di nodi • Due vertici i e j sono detti adiacenti se sono connessi da un ramo (i,j) • Il ramo (i,j) è detto incidente ai nodi i e j • La cardinalità |V| dell’insieme dei nodi è detta ordine del grafo G • La cardinalità |E| dell’insieme dei rami è detta dimensione del grafo G 2 Teoria dei Grafi • Un grafo può essere rappresentato dalla Matrice di Adiacenza A di dimensioni |V| x |V| 1 aij = 0 A = [ aij ] V3 V2 V1 V6 V5 V4 if (i, j) ∈ E otherwise V1 V2 V3 V4 V5 V6 V1 0 1 1 1 0 0 V2 1 0 1 1 0 0 V3 1 1 0 1 1 1 V4 1 1 1 0 1 0 V5 0 0 1 1 0 1 V6 0 0 1 0 1 0 3 Teoria dei Grafi • Un cammino tra due nodi i e j è una sequenza di nodi e rami a • • • • partire dal nodo i al nodo j tale che ogni ramo è incidente al nodo precedente e successivo Un cammino in cui ogni nodo e ogni ramo appare una sola volta è detto cammino semplice (simple path) Il minimo numero di rami che compone un cammino tra due nodi i e j è detta distanza tra i due nodi Un ciclo è un cammino semplice in cui il nodo di partenza coincide con il nodo di arrivo Un grafo G è detto connesso se esiste un cammino tra qualsiasi coppia di nodi 4 Teoria dei Grafi • Un grafo orientato è un grafo in cui i rami hanno un verso di percorrenza • Un grafo pesato è un grafo in cui a ciascun ramo (i,j) è associato un numero wij (peso del ramo) • La matrice di adiacenza di un grafo orientato pesato è data da • La lunghezza di un cammino in un grafo pesato è data dalla somma dei pesi associati ai rami del cammino w aij = ij 0 A = [ aij ] if (i, j) ∈ E otherwise 5 Teoria dei Grafi • Esempio V3 3 V2 8 Matrice di adiacenza 6 8 5 3 2 2 V6 5 3 2 4 1 2 3 1 1 V1 1 7 V4 1 V5 V1 V2 V3 V4 V5 V6 V1 0 2 5 1 0 0 V2 3 0 3 2 0 0 V3 8 6 0 3 1 5 V4 7 2 3 0 1 0 V5 0 0 1 1 0 2 V6 0 0 8 0 4 0 Grafo Pesato 6 Teoria dei Grafi • Una qualsiasi rete a pacchetto può essere modellata come un grafo orientato pesato » i nodi sono i commutatori e/o router » i rami sono le linee trasmissive o le sotto-reti • L’instradamento (routing) di un pacchetto equivale alla • ricerca di un cammino nel grafo associato della rete Ricerca del cammino a minima distanza » grafo non pesato • Ricerca del cammino a minima lunghezza » grafo pesato (costo, congestione, capacità, ecc.) 7 Alberi • Un grafo T è detto albero (tree) se » tra ogni coppia di nodi i e j, esiste un solo cammino semplice » detto N il numero di nodi, il numero di rami è N-1 ed il grafo è connesso senza cicli • Ogni nodo di un albero può essere denominato radice • Un albero può essere sempre raffigurato disponendo i nodi in livelli successivi a partire dalla radice • In una raffigurazione di un albero a livelli » ogni nodo, tranne la radice, ha un solo nodo padre » ogni nodo ha zero o più nodi figli » se un nodo non ha figli è detto foglia dell’albero 8 Spanning Tree • Un sottografo di un grafo G(V,E) è un grafo ottenuto dal grafo G » scegliendo un sotto insieme di rami e di nodi appartenenti a G » per ogni ramo scelto devono essere compresi, nel sottoinsieme dei nodi, i nodi in cui il ramo è incidente • Un sottografo T di un grafo G è chiamato Spanning Tree di G se » T è un albero » T include tutti i nodi di G • Uno spanning tree di un grafo G è un sottografo connesso in cui sono stati rimossi tutti i possibili cicli 9 Spanning Tree Spanning Tree 1 Grafo G V3 V2 V2 V6 V6 V1 V1 V3 V4 V5 V5 V4 V2 • Lo Spanning Tree di un grafo non è unico V1 V3 V6 V5 V4 Spanning Tree 2 10 Ricerca di uno Spanning Tree • Breadth-First Search (BFS) algorithm • Si basa sulla classificazione dei nodi in livelli a partire da un nodo radice • Algoritmo » si individua un nodo radice (nodo x) » si individuano tutti i nodi adiacenti a x (nodi di livello 1) » per ogni nodo appartenente al livello 1 si individuano i nodi adiacenti non precedentemente raggiunti (nodi di livello 2) » il processo si itera sino a che non sono stati raggiunti tutti i nodi del grafo 11 Breadth-First Search 1 v3 v2 1 v1 0 1 v4 v6 v5 1 v3 v2 1 v1 0 1 v2 v1 0 1 1 v4 T={1,2,3,4} v5 v2 v6 v5 1 v3 v2 v1 0 1 1 v4 T={1,2,3,4,5} v6 1 v1 0 1 T={1,2} T={1} 1 v3 v4 v6 1 v3 v5 v4 T={1,2,3} 2 v6 2 v 5 1 v3 v2 v1 0 2 v6 1 1 v4 2 v 5 T={1,2,3,4,5,6} 12 Breadth-First Search • L’algoritmo BFS individua i cammini a distanza minima tra il • • nodo radice e tutti gli altri nodi del grafo Un cammino a distanza minima (shorthest path length) δ(s,v) tra un nodo s ed un nodo v è dato dal cammino con il minimo numero di rami tra i due nodi La complessità computazionale dell’algoritmo BFS è proporzionale a |V| ed |E| [o(|V|.|E|)] 13 Dijkstra’s Algorithm • L’algoritmo di Dijkstra individua il cammino a lunghezza minima • tra un nodo s e tutti gli altri nodi di un grafo G procedendo in modo da aumentare progressivamente la distanza L’algoritmo procede a passi successivi » al passo k-mo sono individuati i k nodi raggiungibili dal nodo sorgente tramiti i cammini a costo più basso » tali k nodi formano l’insieme T » al passo k+1-mo è aggiunto un ulteriore nodo all’insieme T caratterizzato dal cammino dal costo più basso dal nodo s che transita esclusivamente nei nodi dell’insieme T » l’algoritmo termina quando si sono esplorati tutti i nodi 14 Dijkstra’s Algorithm Viene aggiunto all’insieme Tk-1 il nodo n caratterizzato dal cammino di lunghezza minima con il nodo sorgente s che transita esclusivamente in nodi dell’insieme Tk-1 Xk-2 x2 n xi x1 s Insieme Tk-1 Insieme Tk Situazione al passo k 15 Dijkstra’s Algorithm • Notazioni: » » » » N : insieme dei nodi del grafo s : nodo sorgente Tk : insieme dei nodi raggiunti dall’algoritmo al passo k w(i,j) : peso (costo) del ramo (i,j) » w(i,i) = 0 » w(i,j) ≥ 0 se i vertici i e j sono connessi direttamente » w(i,j) = ∞ se i vertici i e j non sono connessi direttamente » Lk(n) : costo del cammino a costo minimo, individuato dall’algoritmo al passo k, tra il nodo s ed il generico nodo n 16 Dijkstra’s Algorithm • Inizializzazione (k=1) » T1 = {s} » L1(n) = w(s,n) per n ≠ s • Aggiunta di un nodo (passo k) » trovare x ∉ T tale che Lk −1( x ) = min Lk −1( j) j∉T » aggiungere all’insieme Tk-1 il nodo x ed il ramo incidente a x • Aggiornamento dei cammini minimi » Lk(n) = min [Lk-1(n), Lk-1(x) + w(x,n)] per tutti i valori di n ∉ T 17 Dijkstra’s Algorithm • L’algoritmo termina quando tutti i nodi sono stati aggiunti • all’insieme T, ovvero T=N Al termine » l’insieme T è uno spanning tree del grafo di partenza contenente i cammini a costo minimo tra il nodo sorgente e tutti gli altri nodi del grafo » LN(n) indica il costo del cammino a costo minimo tra il nodo s ed il nodo n • Si noti che » al passo k-mo viene aggiunto all’insieme T il k-mo nodo ed è individuato il cammino a costo minimo tra il tale nodo ed il nodo sorgente » questo cammino transita esclusivamente attraverso i nodi sinora compresi nell’insieme T • La complessità dell’algoritmo è o(|V|2) 18 Esempio Dijkstra Algorithm - 1(2) 8 V3 3 V2 2 6 2 2 4 1 3 8 6 2 3 2 3 2 8 0 2 3 V1 1 1 1 7 1 0 1 V4 V5 V3 3 V2 2 4 6 2 2 3 2 V5 T2 = {1,4} 8 5 3 2 1 V4 V6 5 1 1 7 V1 T1 = {1} 8 4 1 1 1 V6 5 4 5 2 3 2 V3 3 V2 2 8 5 3 V6 5 5 4 1 2 3 1 T3 = {1,2,4} 1 0 1 1 7 V1 2 1 V4 V5 19 Esempio Dijkstra Algorithm - 2(2) 8 V3 3 V2 2 6 2 2 3 2 4 8 5 3 V6 5 3 4 1 8 6 2 3 2 8 0 2 3 2 V1 1 1 1 7 2 1 V4 V3 6 3 2 2 3 2 V4 1 2 1 V5 T5 = {1,2,3,4,5} 4 8 5 3 V6 5 1 7 V1 3 V2 2 1 0 V5 T4 = {1,2,4,5} 8 4 4 1 3 1 1 V6 5 3 5 2 3 V3 3 V2 2 4 1 2 3 1 0 V1 1 1 7 V4 1 2 1 T6 = {1,2,3,4,5,6} V5 20 Bellman-Ford Algorithm • L’algoritmo di Bellman-Ford individua il cammino a lunghezza • minima tra un nodo s e tutti gli altri nodi di un grafo G L’algoritmo procede a passi » al primo passo individua i cammini minimi tra il nodo sorgente e gli altri nodi con il vincolo che i cammini devono avere al massimo 1 ramo » al secondo passo si trovano i cammini minimi tra il nodo sorgente e gli altri nodi con il vincolo che i cammini devono avere al massimo 2 rami » si itera il procedimento sino al valore massimo di rami in un cammino 21 Bellman-Ford Algorithm • Notazioni » N : insieme dei nodi del grafo » s : nodo sorgente » h : massimo numero di rami in un cammino correntemente consentito dall’algoritmo » w(i,j) : peso (costo) del ramo (i,j) » w(i,i) = 0 » w(i,j) ≥ 0 se i vertici i e j sono connessi direttamente » w(i,j) = ∞ se i vertici i e j non sono connessi direttamente » Lh(n) : costo del cammino a costo minimo correntemente individuato dall’algoritmo, tra il nodo s ed il nodo n, con il vincolo di un numero di rami sia non superiore a h 22 Bellman-Ford Algorithm • Inizializzazione » L0(n) = ∞ » Lh(s) = 0 per tutti i valori di n ≠ s per tutti i valori di h • Aggiornamento » per tutti i valori successivi di h≥0, calcolare Lh+1(n) = min [Lh ( j) + w ( j, n)] j » connettere il nodo n con il nodo precedessore j che raggiunge il minimo ed eliminare le connessioni di n con altri nodi precedessori individuati in precedenti iterate • La complessità dell’algoritmo è o(|V|.|E|), ovvero nel caso peggiore, in cui |E|=|V|2, si ha o(|V|3) 23 Esempio Bellman-Ford Algorithm 8 V3 3 V2 2 6 2 2 4 1 3 6 2 3 2 8 0 h=1 2 3 2 V1 V2 2 8 1 V4 V3 3 6 3 2 2 3 2 V5 1 0 h=2 8 4 V1 4 1 8 V4 3 2 3 2 3 2 8 h=3 V1 1 1 7 V4 4 4 1 2 3 1 0 V5 V6 5 5 2 3 6 2 1 V3 3 V2 2 1 1 7 V6 5 5 3 1 1 1 7 10 4 1 3 1 1 V6 5 4 5 2 3 2 8 V3 3 V2 2 8 5 3 V6 5 5 1 1 2 1 V5 h=4 0 V1 1 1 7 V4 1 2 1 V5 24 Bellman-Ford Algorithm • La soluzione dell’algoritmo di Bellman-Ford può essere anche scritta » detto L(n) il cammino a lunghezza minima tra il nodo s ed il nodo n L(n) = min [L(j) + w(j,n) ] j • La precedente espressione implica che il camminino a lunghezza minima tra il noso s ed il nodo n è dato dalla composizione di » un cammino a lunghezza minima tra il nodo s ed un nodo j adiacente al nodo n » il ramo incidente ai nodi j e n 25 Confronto • I due algoritmi convergono alla stessa soluzione • L’algoritmo di Bellman-Ford, nel caso peggiore, è più complesso; in molti casi pratici i due algoritmi si equivalgono • L’algoritmo di Dijkstra richiede che un nodo conosca l’intera topologia della rete e il peso (stato) di tutti i rami » necessità di colloquio tra tutti i nodi • L’algoritmo di Bellman-Ford richiede la conoscenza dello stato dei rami uscenti da un nodo insieme alle informazioni provenienti dai nodi vicini » possibilità di colloquio solo tra nodi adiacenti (implementazione distribuita) 26 Esercizio 1 (1/3) • Si consideri il grafo mostrato in figura in cui i rami sono bidirezionali con peso uguale in entrambe le direzioni. Si determini, applicando l’algoritmo di Dijkstra, lo spanning tree a costo minimo avente come radice il nodo 1 e si completi la tabella sottostante. V2 V3 3 2 1 1 V4 1 V1 4 4 1 V5 V6 Passo 1 2 3 4 5 6 T 1 L(2) 1 Path 1-2 L(3) ∞ Path --- L(4) ∞ Path --- L(5) ∞ Path --- L(6) 4 Path 1-6 27 Esercizio 1 (2/3) V2 V3 3 43 1 1 1 2 56 1 V4 V1 0 4 4 1 2 V5 34 V6 Passo T L(2) 1 1 1 2 1,2 1 3 1,2,5 1 4 1,2,5,6 1 5 1,2,5,6,3 1 6 1,2,5,6,3,4 1 Path 1-2 1-2 1-2 1-2 1-2 1-2 L(3) ∞ 4 3 3 3 3 Path L(4) Path L(5) ----∞ ∞ 1-2-3 --2 ∞ 1-2-5-3 6 1-2-5-4 2 1-2-5-3 6 1-2-5-4 2 1-2-5-3 5 1-2-5-3-4 2 1-2-5-3 5 1-2-5-3-4 2 Path --1-2-5 1-2-5 1-2-5 1-2-5 1-2-5 L(6) 4 4 3 3 3 3 Path 1-6 1-6 1-2-5-6 1-2-5-6 1-2-5-6 1-2-5-6 28 Esercizio 1 (3/3) • Si consideri lo stesso grafo dell’esercizio precedente. Si determini, applicando, questa volta, l’algoritmo di Bellman-Ford, lo spanning tree a costo minimo avente come radice il nodo 1 e si completi la tabella sottostante. V2 V3 3 2 1 1 V4 1 V1 4 4 1 V5 V6 h 0 1 2 3 4 5 Lh(2) ∞ Path --- Lh(3) ∞ Path --- Lh(4) ∞ Path --- Lh(5) ∞ Path --- Lh(6) ∞ Path --- 29 Esercizio 2 (1/2) • Si consideri il grafo mostrato in figura in cui i rami sono bidirezionali con peso uguale in entrambe le direzioni. Si determini, applicando l’algoritmo di Djikstra, lo spanning tree a costo minimo avente come radice il nodo A e si completi la tabella sottostante. C B 1 2 5 1 A D 1 G 1 6 2 4 F Passo 1 2 3 4 5 6 7 T A L(B) 1 Path A-B L(C) ∞ Path --- L(D) ∞ 1 E Path --- L(E) ∞ Path --- L(F) ∞ Path --- L(G) 1 Path A-G 30 Esercizio 2 (2/2) • Si consideri lo stesso grafo dell’esercizio precedente. Si determini, applicando l’algoritmo di Bellman-Ford, lo spanning tree a costo minimo avente come radice il nodo A e si completi la tabella sottostante. B C 1 2 5 1 A D 1 G 1 6 2 F h 0 1 2 3 4 5 Lh(B) ∞ Path --- Lh(C) ∞ Path --- Lh(D) ∞ Path --- 1 E Lh(E) ∞ 4 Path --- Lh(F) ∞ Path --- Lh(G) ∞ Path --- 31