240 likes | 363 Views
Ricapitolando…. Sistemi P2P puri. Sistemi Uniformi. Sistemi Non uniformi. Koorde. Neighbor of Neighbor routing (NON). Abbiamo detto abbastanza. Koorde. E’ un protocollo chord like ring consistent hashing per mappare le chiavi nei nodi De Bruijn graph diametro log n con grado costante
E N D
Ricapitolando…. Sistemi P2P puri Sistemi Uniformi Sistemi Non uniformi Koorde Neighbor of Neighbor routing (NON) Abbiamo detto abbastanza
Koorde • E’ un protocollo chord like • ring • consistent hashing per mappare le chiavi nei nodi • De Bruijn graph • diametro log n con grado costante • APL O(log n / log(log n)) con grado O(log n)
de Bruijn graph • Un de Bruijn graph ha un nodo per ogni numero binario di b bits • Ogni nodo ha due archi uscenti, in particolare il nodo m ha • un link al nodo 2m mod 2b; • un link al nodo 2m+1 mod 2b; • In altre parole dato un nodo m per ottenere i suoi due vicini basta fare lo shift a sinistra della codifica binaria di m (eliminando il bit più significativo) e poi aggiungere 0 e 1;
de Bruijn graph 000 100 010 101 001 110 011 111 b=3 • Es.: supponiamo di voler conoscere i vicini del nodo 011 allora • facciamo lo shift a sinistra di 011 e otteniamo 0110; • eliminiamo il bit più significativo e otteniamo 110; • i due vicini sono quindi: • 110 + 0 = 110 • 110 + 1 = 111 • Denotiamo con m0 il primo vicino di m m1 il secondo vicino di m
de Bruijn graph 000 100 010 b passi diametro = b = log n 101 001 110 011 111 b=3 • Routing • Supponiamo di voler passare dal nodo s=(s0,s1,…,sb-1) al nodo t=(t0,t1,…,tb-1) • passo 1: s → s1 = st0 s1 =(s1,s2,…,t0) • passo 2: s1→ s2 = s1t1 s2 =(s2,…, t0,t1) • passo 3: s2→ s3 = s2t2 s3 =(…, t0,t1,t2) • passo b: sb-1→ sb = sb-1tb-1 sb =(t0,t1,…, tb-1)=t
de Bruijn graph 000 100 100 010 101 001 110 110 011 011 111 111 b=3 • Routing • Es.: b=3 vogliamo passare dal nodo 011 al nodo 100 • Passo 1: da 011 a 111 • Passo 2: da 111 a 110 • Passo 3: da 110 a 100
de Bruijn graph m nodo sorgente k nodo destinazione La prima chiamata è m.lookup(k,k) 000 100 010 101 001 110 011 111 b=3 m.lookup(k,ks) if k=m return m else t=m topbit(ks) return t.lookup(k,ks<<1)
de Bruijn graph E’ difficile da guardare figuriamoci da implementare 000 111 001 010 110 011 101 b=3 100 000 100 primo vicino 010 101 001 secondo vicino 110 011 111 b=3
de Bruijn graph 000 E se manca un nodo? E se ne mancano tanti? 111 001 b è di solito 160 (SHA) 2160 Gli indirizzi IP sono 232 010 110 011 101 b=3 100 • La maggior parte delle applicazioni usa un numero di nodi effettivo molto più piccolo di 2b. • Evitare collisioni nell’assegnare chiavi; • In generale il sistema deve poter evolversi (n deve poter variare).
de Bruijn graph: Koorde Consideriamo ora un ring non completo Il nodo m ha due link ai nodi immaginari: 2m mod 2b 2m+1 mod 2b m b=160 • Aggiungiamo due ulteriori link per ogni nodo: • Un link al successore nell’anello • Un link al predecessore di 2m mod 2b Link a nodi effettivi
Koorde 000 100 010 101 001 110 011 111 b=3 b=160 • La nuova procedura di routing, invece di attraversare i nodi del grafo di de Bruijn ne attraversa i predecessori; • 2 fasi • Cerca il predecessore di si • Passa al nuovo nodo si+1
Koorde Abbiamo raggiunto la destinazione? Abbiamo raggiunto il predecessore del nodo immaginario? m.lookup(k,ks,i) if k (m, m.successor] return successor else if i (m, m.successor] return d.lookup(k,ks<<1, itopbit(ks)) else return m.successor.lookup(k,ks,i) d è il link al predecessore di 2m mod 2b m.lookup(k,ks) if k=m return m else t=mtopbit(ks) return t.lookup(k,ks<<1)
Koorde m.lookup(k,ks,i) • if k (m, m.successor] return successor • else if i (m, m.successor] • return d.lookup(k,ks<<1, itopbit(ks)) • else • return m.successor.lookup(k,ks,i) Passiamo al nuovo nodo del grafo di de Bruijn Cerchiamo il predecessore del nodo immaginario? Il passo 3 viene eseguito al massimo b volte Quante volte eseguiamo il passo 5, vale a dire quanto impieghiamo per trovare il predecessore di un nodo immaginario?
Koorde Lemma Il numero medio di passi, durante una operazione di lookup in Koorde è 3b Prova Nel passare dal nodo immaginario i al nodo immaginario itopbit(ks), ci muoviamo dal nodo m=predecessor(i) al nodo m.d (predecessor di 2m mod 2b) e poi ci spostiamo usando i successor pointer fino a raggiungere il predecessor del nodo immaginario itopbit(ks), Ogni hop su un grafo di de Bruijn si traduce in una path in koorde. Quanto è lunga questa path in media? Le frecce gialle sono b Quante sono le frecce verdi?
Koorde 2i+1 2i 2m m i I nodi attraversati fra due frecce gialle sono i nodi che si trovano fra 2m e 2i+1 Quanti nodi ci sono nell’intervallo I =(2m,2i+1)? |I|=(2i-2m)/(2b/n) Sapendo che il valore atteso di i-m= 2b/n I(2*2b/n )/(2b/n) =2 In totale dunque per ogni freccia gialla vi sono in media 2 frecce verdi In totale 3b passi Distanza media fra due nodi 2b/n
Koorde m.lookup(k,ks,i) • if k (m, m.successor] return successor • else if i (m, m.successor] • return d.lookup(k,ks<<1, itopbit(ks)) • else • return m.successor.lookup(k,ks,i) Poiché m è responsabile di tutti i nodi immaginari che vanno da m e m.successor è possibile migliorare ulteriormente l’algoritmo. La distanza fra m e il suo successore è con alta probabilità maggiore di 2b/n2
Koorde Claim La distanza fra m e il suo successore è con alta probabilità maggiore di 2b/n2 Prova (Sketch) Fissato un nodo la probabilità che un altro nodo qualsiasi sia più vicino di 2b/n2 è (2b/n2)/2b= 1/n2. La probabilità che nessuno degli altri n-1nodi sia più vicino di 2b/n2 è (1-1/n2)n-1>1-1/n. Distanza media 2b/n Distanza 2b/n2
Koorde Abbiamo dimostrato che la distanza fra m e il suo successore è con alta probabilità maggiore di 2b/n2 Questo significa che il nodo m è responsabile di nodi immaginari con tutte le possibili combinazioni degli ultimi log(2b/n2)= b-2logn bit. Scegliendo come nodo immaginario iniziale il nodo che ha gli ultimi b-2logn bit uguali a i primi b-2logn del nodo destinazione, dobbiamo effettuare alla fine soltanto (b-(b-2logn))*3 passi = 6logn passi circa.
Koorde • Koorde (base 2) • Ha APL O(log n) con grado costante • Si può dimostrare che anche il diametro è con alta probabilità (WHP) O(log n). • Koorde (base k) • Utilizziamo i grafi di de Bruijn base k • Scegliamo k = log n
de Bruijn graph base k 000 100 010 101 001 110 011 b=3 k=2 111 Diametro O(logk n) • Per ogni k, in un grafo di de Bruijn base k, ogni nodo m è connesso a altri k nodi: • km mod kb • km+1 mod kb • … • km+(k-1) mod kb • Esempio • k=4, b=3, n=kb=64 e m=3214= 57 • Il primo vicino è 2104=36 • Il secondo vicino è 2114=37 • Il terzo vicino è 2124=38 • Il quarto vicino è 2134=39
10 b=2 k=3 11 01 12 00 20 02 21 b=160 22 de Bruijn graph base k • Esempio • k=3, b=2, n=kb=9
10 b=2 k=3 11 01 12 00 20 02 21 b=160 22 Koorde base k • k+1 nuovi link • Il link al successore nell’anello • k link ai predecessori dei vicini • E’possibile fare routing con grado k e APL O(logk n)
10 b=2 k=3 Koorde base k 11 01 12 00 20 02 21 22 • Scegliendo k = O(log n): • Grado = O(log n) • APL = O(log n / log (log n)) • Svantaggi • Bisogna stimare n a priori; • Non è possibile cambiare il grado in un sistema attivo; • E’ molto complicato stabilizzare la rete;
Ricapitolando…. Sistemi P2P puri Sistemi Uniformi Sistemi Non uniformi Koorde Neighbor of Neighbor routing (NON)