Lezione 5
Ricapitolando…. Sistemi P2P puri Sistemi UniformiSistemi Non uniformi Abbiamo detto abbastanza KoordeNeighbor of Neighbor routing (NON)
Koorde E un protocollo chord like E un protocollo chord like ring ring consistent hashing per mappare le chiavi nei nodi consistent hashing per mappare le chiavi nei nodi De Bruijn graph De Bruijn graph APL O(log n) con grado costante APL O(log n) con grado costante APL O(log n / log(log n)) con grado O(log n) 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 2 b ; un link al nodo 2m mod 2 b ; un link al nodo 2m+1 mod 2 b ; un link al nodo 2m+1 mod 2 b ; 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 Es.: supponiamo di voler conoscere i vicini del nodo 011 allora facciamo lo shift a sinistra di 011 e otteniamo 0110; facciamo lo shift a sinistra di 011 e otteniamo 0110; eliminiamo il bit più significativo e otteniamo 110; eliminiamo il bit più significativo e otteniamo 110; i due vicini sono quindi: i due vicini sono quindi: = = 111 Denotiamo con m 0 il primo vicino di m m 1 il secondo vicino di m b=3
de Bruijn graph Routing Supponiamo di voler passare dal nodo s=(s 0,s 1,…,s b-1 ) al nodo t=(t 0,t 1,…,t b-1 ) Supponiamo di voler passare dal nodo s=(s 0,s 1,…,s b-1 ) al nodo t=(t 0,t 1,…,t b-1 ) passo 1: s s 1 = s t 0 s 1 =(s 1,s 2,…,t 0 ) passo 2: s 1 s 2 = s 1 t 1 s 2 =(s 2,…, t 0,t 1 ) passo 3: s 2 s 3 = s 2 t 2 s 3 =(…, t 0,t 1,t 2 ) passo b: s b-1 s b = s b-1 t b-1 s b =(t 0,t 1,…, t b-1 )=t b=3 b passi diametro = b = log n
de Bruijn graph Routing Es.: b=3 vogliamo passare dal nodo 011 al nodo 100 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 b=
de Bruijn graph m.lookup(k,ks) if k=m return m else t=m topbit(ks) return t.lookup(k,ks<<1) b=3 m nodo sorgente k nodo destinazione La prima chiamata è m.lookup(k,k )
de Bruijn graph Routing ottimizzato Calcolo la dimensione j del più grande suffisso del nodo sorgente s che è anche prefisso del nodo destinazione t. Calcolo la dimensione j del più grande suffisso del nodo sorgente s che è anche prefisso del nodo destinazione t. Il routing inizia al passo j+1 Il routing inizia al passo j+1 Es.: b=3 vogliamo passare dal nodo s=011 al nodo t=100 Es.: b=3 vogliamo passare dal nodo s=011 al nodo t=100 Passo 2: da 011 a 110 Passo 3: da 110 a b=
de Bruijn graph m.lookup(k,ks) if k=m return m else t=m topbit(ks) return t.lookup(k,ks<<1) b=3 m nodo sorgente k nodo destinazione <<j La prima chiamata è m.lookup(k,k <<j)
de Bruijn graph b= b=3 E difficile da guardare figuriamoci da implementare secondo vicino primo vicino
de Bruijn graph b=3 La maggior parte delle applicazioni usa un numero di nodi effettivo molto più piccolo di 2 b. Evitare collisioni nellassegnare chiavi; In generale il sistema deve poter evolversi (n deve poter variare). E se manca un nodo? E se ne mancano tanti? b è di solito 160 (SHA) Gli indirizzi IP sono 2 32
de Bruijn graph: Koorde b=160 Aggiungiamo due ulteriori link per ogni nodo: Un link al successore nellanello Un link al predecessore di 2m mod 2 b Consideriamo ora un ring non completo Il nodo m ha due link ai nodi immaginari: 2m mod 2 b 2m+1 mod 2 b m Link a nodi effettivi
Koorde 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 s i Passa al nuovo nodo s i b=3
Koorde m.lookup(k,ks) if k=m return m else t=m topbit(ks) return t.lookup(k,ks<<1) m.lookup(k,ks,i) if k (m, m.successor] return successor else if i (m, m.successor] return d.lookup(k,ks<<1, i topbit(ks)) else else return m.successor.lookup(k,ks,i) Abbiamo raggiunto la destinazione ? Abbiamo raggiunto il predecessore del nodo immaginario? d è il link al predecessore di 2m mod 2 b
Koorde m.lookup(k,ks,i) 1if k (m, m.successor] return successor 2else if i (m, m.successor] 3 return d.lookup(k,ks<<1, i topbit(ks)) 4 else 5 return m.successor.lookup(k,ks,i) Cerchiamo il predecessore del nodo immaginario? Passiamo al nuovo nodo del grafo di de Bruijn 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 i topbit(ks), ci muoviamo dal nodo m=predecessor(i) al nodo m.d (predecessor di 2m mod 2 b ) e poi ci spostiamo usando i successor pointer fino a raggiungere il predecessor del nodo immaginario i topbit(ks), Le frecce gialle sono b Quante sono le frecce verdi? Ogni hop su un grafo di de Bruijn si traduce in una path in koorde. Quanto è lunga questa path in media?
Koorde I nodi attraversati fra due frecce gialle sono i nodi che si trovano fra 2m e 2i+1 Quanti nodi ci sono nellintervallo I =(2m,2i+1)? |I|=(2i-2m)/(2 b /n) Sapendo che il valore atteso di i-m 2 b /n I (2 2 b /n )/(2 b /n) =2 In totale dunque per ogni freccia gialla vi sono in media 2 frecce verdi In totale 3b passi m i 2m 2i 2i+1 2 b /n Distanza media fra due nodi 2 b /n
Koorde m.lookup(k,ks,i) 1if k (m, m.successor] return successor 2else if i (m, m.successor] 3 return d.lookup(k,ks<<1, i topbit(ks)) 4 else 5 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 lalgoritmo. La distanza fra m e il suo successore è con alta probabilità maggiore di 2 b /n 2
Koorde Claim La distanza fra m e il suo successore è con alta probabilità maggiore di 2 b /n 2 Prova (Sketch) Fissato un nodo la probabilità che un altro nodo qualsiasi sia più vicino di 2 b /n 2 è (2 b /n 2 )/2 b = 1/n 2. La probabilità che nessuno degli altri n-1nodi sia più vicino di 2 b /n 2 è (1-1/n 2 ) n-1 >1-1/n. Distanza media 2 b /n Distanza 2 b /n 2
Koorde Abbiamo dimostrato che la distanza fra m e il suo successore è con alta probabilità maggiore di 2 b /n 2 Questo significa che il nodo m è responsabile di nodi immaginari con tutte le possibili combinazioni degli ultimi log(2 b /n 2 )= 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) Koorde (base 2) Ha APL O(log n) con grado costante Ha APL O(log n) con grado costante Si può dimostrare che anche il diametro è con alta probabilità (WHP) O(log n). 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 Utilizziamo i grafi di de Bruijn base k Scegliamo k = log n Scegliamo k = log n
de Bruijn graph base k Per ogni k, in un grafo di de Bruijn base k, ogni nodo m è connesso a altri k nodi: km mod k b km mod k b km+1 mod k b km+1 mod k b … km+(k-1) mod k b km+(k-1) mod k bEsempio k=4, b=3, n=k b =64 e m=321 4 = 57 k=4, b=3, n=k b =64 e m=321 4 = 57 Il primo vicino è =36 Il secondo vicino è =37 Il terzo vicino è =38 Il quarto vicino è = b=3 k=2 Diametro O(log k n)
de Bruijn graph base k Esempio k=3, b=2, n=k b =9 k=3, b=2, n=k b =9 b= b=2 k=
Koorde base k k+1 nuovi link Il link al successore nellanello Il link al successore nellanello k link ai predecessori dei vicini k link ai predecessori dei vicini Epossibile fare routing con grado k e APL O(log k n) b= b=2 k=
Koorde base k Scegliendo k = O(log n): Grado = O(log n) Grado = O(log n) APL = O(log n / log (log n)) APL = O(log n / log (log n))Svantaggi Bisogna stimare n a priori; Bisogna stimare n a priori; Non è possibile cambiare il grado in un sistema attivo; Non è possibile cambiare il grado in un sistema attivo; E molto complicato stabilizzare la rete; E molto complicato stabilizzare la rete; b=2 k=
Ricapitolando…. Sistemi P2P puri Sistemi UniformiSistemi Non uniformi KoordeNeighbor of Neighbor routing (NON)