Numero Nodi - TLC group - Università degli Studi di Ferrara

UNIVERSITÀ DEGLI STUDI DI FERRARA
FACOLTÀ DI INGEGNERIA
Corso di Laurea Specialistica in Ingegneria Informatica e
dell’Automazione
ALGORITMI PER IL PEER TO PEER REALTIME
Tesi di Laurea di:
Relatore:
Danilo Merlanti
Prof. Ing. Gianluca Mazzini
ANNO ACCADEMICO 2007
200 – 2008
1
Indice
1
ITRODUZIOE ____________________________________________________________________ 5
1.1
MODELLI DI COMUNICAZIONE [1] ___________________________________________________ 5
1.1.1
IL MODELLO CLIET/SERVER __________________________________________________ 5
1.1.2
ASPETTI PRICIPALI DEL MODELLO CLIET – SERVER ____________________________ 6
1.1.3
ALTRE CARATTERISTICHE DEL MODELLO CLIET – SERVER: “MODALITA’ DI
FUZIOAMETO PUSH E PULL” __________________________________________________________ 6
1.1.4
MODELLO CLIET SERVER: “ITERAZIOE TRA I DUE PROCESSI” _________________ 7
1.1.5
ALTRI MODELLI DI ITERAZIOE OLTRE AL CLIET/SERVER ______________________ 7
1.1.6
IL MODELLI PEER TO PEER ____________________________________________________ 7
1.1.7
ALTRI MODELLI O CLIET/SERVER __________________________________________ 12
1.2
DAL MODELLO CLIENT – SERVER AL MODELLO PEER TO PEER [6] _____________________ 13
1.2.1
PROBLEMATICHE DEL MODELLO CLIET – SERVER _____________________________ 13
1.2.2
UTILIZZO DEI PEER PER LA DIFFUSIOE DI FILE DI GRADI DIMESIOI _________ 14
1.2.3
COFROTO TRA I DUE MODELLI _____________________________________________ 14
1.2.4
ITRODUZIOE ALLE TIPOLOGIE DI RETI PEER TO PEER ________________________ 15
1.2.5
APSTER ___________________________________________________________________ 15
1.2.6
GUTELLA __________________________________________________________________ 17
1.2.7
KaZaA ______________________________________________________________________ 21
1.2.8
BitTorrent ___________________________________________________________________ 24
1.3
UTILIZZO DEL PEER TO PEER NELLA DIFFUSIONE DI CONTENUTI MULTIMEDIALI _____ 28
1.3.1
UICAST, BROADCAST E MULTICAST [7]_________________________________________ 28
1.3.2
MULTICAST E PROTOCOLLO IGMP [7] __________________________________________ 29
1.3.3
FUZIOAMETO DEL MULTICAST A LIVELLO LOCALE [7] ________________________ 30
1.3.4
FUZIOAMETO DEL MULTICAST A LIVELLO GEOGRAFICO [7] ___________________ 32
1.3.5
PROBLEMATICHE DEL MULTICAST [7][8]_________________________________________ 32
1.4
PEER TO PEER SU CANALE ASIMMETRICO __________________________________________ 34
PEER TO PEER DISTRIBUTIO O ASYMMETRIC CHAELS [9] ______________________ 35
2
2.1
TOPOLOGIA DELLE RETI__________________________________________________________ 35
2.2
DESCRIZIONE DELL’ALGORITMO [9] _______________________________________________ 36
3
UOVI ALGORITMI ________________________________________________________________ 39
3.1
TOPOLOGIA DELLE RETI GENERATE: SEQUENZA DI NODI CHE ACCEDONO ALLA RETE_ 39
3.2
PRIMO ALGORITMO DI PEER TO PEER: ALGORITMO MAZZINI / ROVATTI ADATTATO ALLE
NUOVE CONDIZIONE DI RETE ______________________________________________________________ 45
3.3
SECONDO ALGORITMO DI PEER TO PEER CON RISTRUTTURAZIONE LOCALE DELLA RETE
CON BLOCCO ALL’INGRESSO _______________________________________________________________ 47
2
3.4
TERZO ALGORITMO SENZA RISTRUTTURAZIONE LOCALE ___________________________ 55
3.4.1
DESCRIZIOE DETTAGLIATA DELL’ALGORITMO 3 _______________________________ 56
3.4.2
SVATAGGI DELL’ALGORITMO3 E ITRODUZIOE ALL’ALGORITMO4 _____________ 60
3.4.3
OTA IMPORTATE __________________________________________________________ 61
3.5
QUARTO ALGORITMO CON RISTRUTTURAZIONE LOCALE CON BLOCCO ALL’INGRESSO 62
3.6
QUINTO ALGORITMO SENZA BLOCCO ALL’INGRESSO _______________________________ 63
3.7
SESTO ALGORITMO CON RISTRUTTURAZIONE SENZA BLOCCO ALL’INGRESSO________ 63
4
ESEMPI E COFROTI _____________________________________________________________ 65
4.1
ALGORITMI 1,2,3 E 4 ______________________________________________________________ 65
4.1.1
UTILIZZO DEL SOFTWARE IMPLEMETATO _____________________________________ 66
4.1.2
UMERO DI ODI ISERIBILI ELLA RETE I FUZIOE DELLA OUTPUT BAD
FORITA DAL ODO SORGETE ___________________________________________________________ 67
4.1.3
BADA TOTALE RESIDUA DELLA RETE I FUZIOE DELLA OUTPUT BAD FORITA
DAL ODO SORGETE ___________________________________________________________________ 78
4.1.4
STIMA DEL COSTO DELLE RISTRUTTURAZIOI I FUZIOE DELLA OUTPUT BAD
FORITA DAL ODO SORGETE ___________________________________________________________ 86
4.2
ALGORITMI 5 E 6 _________________________________________________________________ 93
4.2.1
UTILIZZO DEL SOFTWARE IMPLEMETATO _____________________________________ 95
4.2.2
UMERO DI ODI ISERIBILI I FUZIOE DELLA PERCETUALE DI ODI CHE
HAO OUTPUT BAD < 1 ELLA SEQUEZA DI IGRESSO __________________________________ 96
4.2.3
STIMA DEL COSTO DELLE RISTRUTTURAZIOI LOCALI I FUZIOE DELLA
PERCETUALE DI ODI CHE HAO OUTPUT BAD < 1 ELLA SEQUEZA DI IGRESSO _______ 102
4.2.4
BADA DISPOIBILE O RESIDUA I FUZIOE DELLA PERCETUALE DI ODI CHE
HAO OUTPUT BAD < 1 ELLA SEQUEZA DI IGRESSO _________________________________ 107
4.2.5
UMERO ODI I ATTESA I FUZIOE DELLA PERCETUALE DI ODI CHE HAO
OUTPUT BAD < 1 ELLA SEQUEZA DI IGRESSO _________________________________________ 112
5
COCLUSIOI____________________________________________________________________ 119
6
BIBLIOGRAFIA ___________________________________________________________________ 125
7
RIGRAZIAMETI _______________________________________________________________ 127
3
4
1 INTRODUZIONE
L’obiettivo di questa tesi è la creazione e la realizzazione di nuovi algoritmi per la costruzione
di reti peer to peer adottate per la diffusione di contenuti su linee asimmetriche; questi algoritmi
sono stati ideati basandosi su un algoritmo di peer to peer, per la diffusione di contenuti su canale
asimmetrico, sviluppato dal prof. Ing. Gianluca Mazzini e Riccardo Rovatti [9].
Nei capitoli successivi vengono trattati i seguenti argomenti:
nel primo capitolo viene fornita una descrizione dei vari modelli di comunicazione ed
in particolare del modello peer to peer. Inoltre in questo capitolo: vengono descritte le
problematiche del modello client/server, nella diffusione di file e contenuti, che portano
a considerare il modello peer to peer; viene fornita una descrizione delle varie tipologia
di reti peer to peer, quali ad esempio Napster, Gnutella, KaZaA e BitTorrent; viene
effettuata una descrizione delle problematiche che portano a scegliere le reti peer to
peer, per effettuare la diffusione di contenuti multimediali; vengono descritte le
problematiche del peer to peer su canali asimmetrici e viene introdotto il conseguente
algoritmo per la creazione di reti peer to peer che si adatta a tale problematica;
nel secondo capitolo viene effettuata la descrizione dell’algoritmo di Mazzini/Rovatti
[9]
, utilizzato per la creazione e gestione delle reti peer to peer adottate per la diffusione
di contenuti su linee asimmetriche, con particolari condizioni per quanto riguarda i peer
che vogliono accedere alla rete;
nel terzo capitolo si fornisce una descrizione degli algoritmi realizzati in questa tesi, che
sono stati ottenuti basandosi sull’algoritmo descritto nel secondo capitolo ;
infine nel quarto e nel quinto capitolo si presentano alcuni esempi su parametri
significativi (quali il numero massimo di nodi inseribili nella rete, la banda totale
residua della rete quando non è più in grado di accettare nodi, ecc…), al fine di poter
confrontare i vari algoritmi realizzati e poter fornire le conclusioni dello studio che si è
condotto in questa tesi.
1.1 MODELLI DI COMUNICAZIONE [1]
1.1.1 IL MODELLO CLIENT/SERVER
Il modello client/server prevede la presenza di due entità:
1.
l’entità client: consente di accedere ad una macchina server (remota) che eroga un
certo servizio. Per fare questo il client effettua una richiesta di un servizio
all’applicazione server residente sulla macchina server;
5
2.
l’entità server: è un applicazione che permane nell’attesa che arrivino delle richieste di
servizio provenienti da applicazioni client. Nel momento in cui il server riceve una
richiesta di servizio la soddisfa erogando il servizio richiesto al client richiedente.
Un esempio di comunicazione client – server è rappresentata dalla richiesta di una pagina web
che può effettuare un client web al desiderato server web.
1.1.2 ASPETTI PRINCIPALI DEL MODELLO CLIENT – SERVER
Il modello client – server prevede una comunicazione:
1.
asimmetrica, poiché
il client designa esplicitamente il server destinatario attraverso l’indirizzo IP del
server e la sua porta, ossia il client, per richiedere un servizio al server, deve
conoscere l’indirizzo del server;
invece il server non deve nominare o identificare il client ossia tale macchina
server, per definizione, rimane in attesa di ricevere le richieste di servizio e
quando le riceve risponde erogando un particolare servizio; quindi il server non
deve avere l’indirizzo del client poiché è in attesa che un client effettui una
richiesta di servizio;
2.
molti a 1 poiché: molti client possono richiedere lo stesso servizio ad un solo servitore
(o server).
1.1.3 ALTRE CARATTERISTICHE DEL
MODELLO CLIENT – SERVER:
“MODALITA’ DI FUNZIONAMENTO PUSH E PULL”
Il modello client – server può funzionare in modalità push o in modalità pull cioè:
1.
modello pull (tirare): in tal caso il client recupera il servizio dal sistema server ossia il
client invia una richiesta di servizio al sistema server con la quale preleva direttamente
dal server il servizio richiesto;
2.
modello push (spingere): in tal caso il server si preoccupa di spedire al client il
pacchetto di risposta al servizio richiesto decidendo autonomamente quando mandare
al client le informazioni da lui richieste al server stesso. Quindi in tal caso il server,
quando ritiene opportuno, trasmette le informazioni richieste verso il client
(richiedente) collegato o connesso al server stesso. In tal modo quando il client
interrompe la connessione con il server accade che il server non è più in grado di
spedire i dati precedentemente richiesti dal client stesso.
6
1.1.4 MODELLO CLIENT SERVER: “INTERAZIONE TRA I DUE PROCESSI”
Il modello client – server stabilisce quando si ha l’interazione tra il processo client ed il
processo server. La comunicazione tra processo client e processo server, in generale, è soggetta al
problema del rendez-vous, ossia il problema di stabilire quando sincronizzare i processi
comunicanti (ossia quando avviene l’incontro tra il processo client e quello server ).
Il modello client – server risolve il problema del rendez-vous definendo il server come un
processo che rimane sempre in attesa di richieste di servizio da parte di processi client.
Quindi nel caso del modello client – server la sincronizzazione tra il processo client e quello
server avviene secondo le seguenti modalità: quando il client effettua una richiesta di servizio al
server (attraverso un pacchetto di richiesta servizio) accade che il server, che era in attesa della
richiesta di un servizio, esegue la richiesta ed invia i risultati, di tale esecuzione, al client
richiedente.
La risoluzione del problema del rendez-vous (dell’incontro tra client e server) si ottiene
con un processo mandato in esecuzione al boot della macchina server, il quale rimane in attesa che
arrivi la richiesta di servizio da un client.
1.1.5 ALTRI MODELLI DI INTERAZIONE OLTRE AL CLIENT/SERVER
Il modello client – server non è l’unico modello di comunicazione disponibile. Altri modelli
esistenti sono i seguenti:
1. peer to peer: dove si ha una interazione tra processi pari (peer) ed in tal modo ogni
entità può essere sia client che server;
2. modelli ad eventi e Publish/Subscribe: dove il server prende l’iniziativa e segnala
il verificarsi di un evento. Sono modelli Push.
1.1.6 IL MODELLI PEER TO PEER
Nel modello client/server, il server può rappresentare un colo di bottiglia. Il modello peer to
peer supera il punto di centralizzazione del server poiché prevede che le comunicazioni avvengano
da pari a pari e quindi tutti i nodi o processi sono allo stesso livello dal punto di vista delle
responsabilità e dei protocolli; di conseguenza ogni processo può giocare contemporaneamente sia
il ruolo di client che quello di server.
7
In questo modo scompare il ruolo di centralizzazione del server e quindi tutti i pari si possono
scambiare i file tra loro. Gli obiettivi applicativi di tale sistema sono: alta disponibilità ed alto
grado di replicazione.
1.1.6.1 FUZIOAMETO
Tipicamente , un sistema peer to peer, per reperire un file, richiede due passi:
1. localizzazione: viene effettuata la localizzazione del file di interesse ossia si cerca tale
file in tutti i possibili utenti pari disponibili in quel momento (tale argomento è di grande
complessità e sono possibili diverse soluzioni architetturali);
2. trasferimento del file: trovato l’utente pari che possiede il file desiderato (attraverso
l’operazione di localizzazione), e quindi conoscendo il suo indirizzo IP, il trasferimento
del file avviene direttamente tra i due pari ossia con una comunicazione diretta tra loro.
1.1.6.2 IL MODELLO PEER TO PEER: LOCALIZZAZIOE COTEUTI
I metodi di localizzazione della macchina dalla quale prelevare il file (o il contenuto)
desiderato seguono modelli architetturali diversi che hanno un diverso grado di distribuzione cioè:
1. nel caso di apster si ha una directory centralizzata, contenuta su un server diretto
centralizzato, che contiene per ogni utente conosciuto gli identificativi dei file che esso
possiede;
2. nel caso di KaZaA si ha una directory decentralizzata;
3. nel caso di Gnutella si ha un processo detto di Query Flooding.
Questi sistemi offrono diversi vantaggi/svantaggi da vari punti di vista:
tolleranza ai guasti;
prestazioni;
“Responsabilità Legali”.
1.1.6.3 MODELLO PEER TO PEER CO DIRECTORY CETRALIZZATA
(apster)
Il modello peer to peer con directory centralizzata (come Napster) ha un sistema di
localizzazione del file desiderato con una directory centralizzata che contiene le informazioni sui
file disponibili con il relativo nodo di residenza. A tale directory centralizzata tutti gli utenti si
collegano per localizzare, e richiedere, il file desiderato.
8
Quindi la richiesta del file viene effettuata al server che contiene la directory centralizzata dei
file e se il server trova nel suo data base un utente che ha tale file allora viene fornito al richiedente
l’indirizzo IP dell’utente che ha il file di modo che il richiedente stesso, possa prelevare
direttamente il file desiderato dall’utente che lo possiede.
1.1.6.4 MODELLO
PEER
TO
PEER
CO
DIRECTORY
DECETRALIZZATA(KaZaA)
Nel caso di modello peer to peer con directory decentralizzata le funzioni di Directory vengono
distribuite direttamente ad alcuni nodi peer chiamati leader di gruppo ai quali si possono collegare
gli utenti.
Quindi i peer leader di un gruppo contengono la directory con le informazioni sui file
disponibili sui vari nodi del gruppo stesso.
Quindi quando un utente richiede un file, lo chiede al nodo leader del suo gruppo il quale:
1. se conosce un nodo del suo gruppo che possiede tale file allora fornisce all’utente
richiedente l’indirizzo del nodo che possiede tale file. In tal modo l’utente richiedente
può effettuare il prelievo del file dal nodo specificato del suo stesso gruppo;
2. se invece il leader del gruppo non trova un nodo del suo gruppo che contiene il file
desiderato allora il leader richiederà tale file ad un altro leader di gruppo. Quando il
leader del gruppo considerato otterrà da un altro qualsiasi leader di gruppo l’indirizzo
del nodo che contiene il file desiderato allora il leader invierà tale indirizzo al nodo
richiedente il quale preleverà direttamente il file considerato dal nodo appartenente ad un
altro gruppo specificato.
Quando un utente si accede a tale sistema distribuito si collega ad un qualunque leader di
gruppo che possiede l’elenco (o directory) dei file contenuti nei nodi di tale gruppo.
Quindi in questo modello di peer to peer esistono dei nodi di bootstrap allo scopo di:
1. indicare i peer leader ai nodi che si vogliono connettere alla rete;
2. e selezionare i peer leader cioè ad esempio: se in un gruppo il peer leader “muore”
allora il nodo di bootsdrap designerà come nuovo peer leader uno di quelli del gruppo
considerato.
9
1.1.6.5 MODELLO PEER TO PEER CO QUERY FLOODIG (Gnutella)
È il modello di peer to peer adottato da Gnutella. In questo caso non si ha un sistema di
decentralizzazione ossia non si ha una directory decentralizzata che consenta di reperire l’indirizzo
degli utenti o nodi che posseggono tale file, in quanto in tale modello si ha che:
quando un nodo o utente effettua la richiesta di ricerca di un file tale richiesta viene
mandata (inoltrata) a tutti i suoi nodi vicini, i quali a loro volta inviano tale messaggio di
richiesta file ai loro nodi successivi (della catena) o nodi vicini;
in tal modo la localizzazione del file richiede un broadcast del messaggio di richiesta del
file o un flooding di messaggi e quindi la richiesta di un file si propagherà in tutti i nodi
del sistema;
quando, con tale tecnica, si trova un nodo che possiede il file desiderato accade che viene
mandato un messaggio di ritorno al nodo richiedente con il quale si specifica l’indirizzo
del nodo che possiede il file, di modo che il nodo richiedente possa prelevare tale file
direttamente dal nodo che lo possiede con un collegamento diretto tra loro;
affinché il messaggio di “ricerca file” non percorra tutti i nodi della rete, determinando un
tempo di ricerca troppo elevato e determinando l’intasamento della rete, viene fissato
arbitrariamente un numero massimo di salti o HOP superato il quale il messaggio di
“richiesta file” viene soppresso;
in questo modello si ha sempre un nodo di bootsdrap che comunica, al nodo che si vuole
collegare alla rete, solamente il nome dei nodi pari più vicini a cui collegarsi;
se il nodo al quale è collegato il nodo considerato si spegne allora vi sono particolari
protocolli che consentono di collegare il nodo considerato ad un altro nodo vicino attivo
(cioè non spento).
1.1.6.6 TOLLERAZA AI GUASTI EI TRE MODELLI
1. modello peer to peer con directory centralizzata: tale sistema è poco tollerante ai
guasti, avendo un unico server che contiene le informazioni sui file disponibili con il
relativo nodo, in quanto se il server (contenente la directory centralizzata) va in crash
allora non funzione più nulla, poiché gli utenti non possono più localizzare il nodo
contenete il file desiderato;
2. modello peer to peer con directory decentralizzata: la tolleranza ai guasti è buona in
quanto se il nodo leader di un gruppo “muore” accade che il nodo di bootsdrap
10
riorganizza la rete definendo un nodo di tale gruppo come nodo leader e collegando tutti
gli altri nodi al nuovo leader designato;
3. modello peer to peer con query flooding: tolleranza ai guasti è buona in quanto se il
nodo al quale è collegato il nodo considerato si spegne allora vi sono particolari
protocolli che consentono di collegare il nodo considerato ad un altro nodo vicino attivo
(cioè non spento).
1.1.6.7 PRESTAZIOI EI TRE MODELLI
Nel peer to peer le prestazioni sono diverse e dipendono solamente dalla fase di ricerca dati o
localizzazione del file desiderato, in quanto in tutti i modelli peer to peer la fase di trasferimento
dati avviene direttamente tra il pari richiedente ed il pari che possiede il file. Quindi nel caso del
modello peer to peer con directory centralizzata la fase di localizzazione sarà in genere più veloce
rispetto agli altri due modelli.
1.1.6.8 SISTEMI PEER TO PEER
I maggiori sistemi peer to peer attuali sono: Napster, Gnutella, KaZaA, Winmx e consentono la
condivisione di file con un’architettura caratterizzata da gradi di distribuzione crescente.
Il peer to peer è la causa di maggiore traffico nella rete internet. Esistono molti altri sistemi
peer to peer quali:
JXTA: ambiente SUN per lo sviluppo di applicazioni peer to peer in java;
Freenet: filesystem con elevato grado di replicazione e a diffusione derivante dalle
richieste. Strategie di propagazione ispirate al routing globale. Sistema di nomi basato su
indici (integrità via hash);
Freeheaven: informazioni più suddivise per robustezza e con un alto grado di sicurezza;
Publius: condivisione di informazioni con diversi gradi di sicurezza e privatezza;
SETI@home: peer to peer che elabora ed analizza segnali trasmessi e provenienti dallo
spazio, controllando i pattern di tali segnali per verificare se provengono da una
intelligenza extraterrestre. Tale ricerca ed analisi viene effettuata su nodi distribuiti cioè:
quando un utente si collega a tale rete peer to peer riceve una porzione di dati dalla
stazione centrale e li elabora. I dati elaborati (durante i cicli di idle della cpu) dall’utente
connesso vengono, infine, inviati alla stazione centrale e quindi si ha la ripartizione del
lavoro tra i calcolatori appartenenti a tale rete peer to peer;
Jabber supporto alla conversazione e cooperazione tra utenti.
11
1.1.7 ALTRI MODELLI NON CLIENT/SERVER
Oltre ai modelli client/server ed ai modelli peer to peer vi sono altri modelli quali: il modello
ad eventi ed il modello publish/subscribe.
1.1.7.1 IL MODELLO A EVETI
Tale modello si contrappone al modello di richiesta e di attesa della risposta che si ha nel
modello client – server.
Si gestisce la possibilità di inviare messaggi su necessità disaccoppiando gli interessati cioè:
il client segnala al server il proprio interesse verso un determinato servizio, e poi passa a
fare altro;
il server invia l’informazione o un evento se e quando è disponibile;
un servizio di notifica eventi segnala l’occorrenza degli eventi significativi agli
interessati.
Fissando un’altra terminologia si può dire che:
Client = è “il consumatore”;
Server = è “il produttore di un determinato servizio”.
Funzionamento: un consumatore decide di essere interessato ad un determinato evento e quindi
specifica al produttore tale interesse registrandosi con la specifica dell’evento che gli interessa.
Quando il produttore produce (o riceve) l’evento tale evento viene spedito al Servizio di Notifica
Eventi, il quale segnala l’occorrenza degli eventi significativi agli interessati, ossia forza il push
dell’evento alle entità (o consumatori) che si sono registrate per tale evento; quindi il servizio di
notifica eventi inoltra l’evento (servizio) prodotto dal produttore (o server) a tutti i consumatori (o
client) che si erano registrati per tale evento.
1.1.7.2 IL MODELLO PUBLISH/SUBSCRIBE
Quando un utente si interessa ad un particolare evento lo indica ad un server, che tiene traccia
degli utenti che si sono registrati per un particolare evento. Quando il gestore o server ha l’evento lo
inoltra, con una notifica, a tutti gli utenti che sono interessati all’evento considerato.
Riassumendo: da una parte si ha una serie di utenti (chiamati consumatori) che specificano il
proprio interesse verso alcuni eventi (chiamati subscribe); dall’altra parte si ha un gestore (chiamato
produttore) che registra le loro richieste di evento e notifica gli eventi ai consumatori interessati a
tali eventi (esempio mailing list).
12
1.2 DAL MODELLO CLIENT – SERVER AL MODELLO PEER TO PEER [6]
1.2.1 PROBLEMATICHE DEL MODELLO CLIENT – SERVER
Supponiamo che un server debba inviare un file di grandi dimensioni a N client differenti. Si
effettuano le seguenti ipotesi:
il file ha una dimensione pari a F bit;
si ha un unico server con velocità di upload pari a us;
per i = 1…N, la velocità di download dell’i-esimo ricevitore è pari a di.
Quindi il server trasmette il file agli N ricevitori e quindi deve trasmette un numero
complessivo di bit pari a N·F e ciò richiede un tempo di trasmissione di almeno N·F/us.
Dal lato dei ricevitori, bisogna però considerare che:
il ricevitore più lento riceve il file ad una velocità pari a: dmin = mini{di};
e quindi il tempo necessario per riceve l’intero file è almeno pari a F/ dmin;
Quindi il tempo che serve agli N ricevitori per riceve l’intero file di dimensione F è pari al
massimo tra il tempo che necessita il server per trasmettere il file di dimensione F agli N ricevitori
(N·F/us) ed il tempo che impiega il ricevitore più lento ad ottenere il file di dimensione F (F/ dmin).
Quindi in questa situazione per accelerare la velocità di distribuzione del file è sufficiente
aumentare la banda in upload del server:
aumentando l’ampiezza di banda del link (collegato) di un server;
uso di server multipli che erogano lo stesso file, ed ognuno di questi ha un proprio link
attraverso il quale distribuisce il file considerato;
tutto ciò richiede l’impiego di una maggiore infrastruttura di rete.
Una soluzione alternativa, nella quale non viene aumentata la banda di upload del nodo
sorgente, è quella di utilizzare i ricevitori per distribuire il file ad altri ricevitori, utilizzando la loro
upload band:
i ricevitori ottengono una copia dei dati relativi al file considerato;
e successivamente ridistribuiscono i dati agli altri ricevitori che richiedono lo stesso file,
sfruttando la banda in upload che hanno a disposizione;
in questo modo si riduce il carico sul server ossia si riducono le richieste che il server
riceve e che deve soddisfare.
13
1.2.2 UTILIZZO DEI PEER PER LA DIFFUSIONE DI FILE DI GRANDI
DIMENSIONI
Si inizia con una singola copia di un file di grandi dimensioni:
si suppone di avere un file di grandi dimensioni costituito da F bits e si suppone che il
server abbia una banda in upload pari a us;
si suppone che ogni peer i-esimo abbia una banda in download pari a di ed una banda in
upload pari a ui;
Si hanno due componenti relativamente al tempo necessario per distribuire il file (a livello del
server):
il server deve inviare ogni bit del file di dimensione F e l’intera trasmissione del file
viene effettuata in un tempo minimo pari a: F/us;
il peer più lento che riceve ogni bit del file impiega, per riceve l’intero file, un tempo
minimo pari a: F/ dmin;
Con le precedenti considerazioni si determina il tempo di upload totale che si ha utilizzando
tutte le risorse di upload che sono date dalla banda di upload del server + le bande di upload di tutti
i peer della rete:
il numero totale di bit che devono essere recapitati agli N ricevitori è pari a: N·F;
la banda di upload totale è pari alla upload band del nodo sorgente + le bande di upload
di tutti i peer della rete cioè: [totalUpBand ] = u s + ∑i u i
quindi il tempo complessivo necessario per trasferire il file agli N peer della rete è:
 F F
⋅ F 
max  ,
,

 u s d min u s + ∑i ui 
1.2.3 CONFRONTO TRA I DUE MODELLI
Nel caso del modello client server il tempo necessario per effettuare il download del file su N
 ⋅F F 
,
client è pari a : max
.
 us d min 
Invece nel caso del modello peer to peer il tempo necessario per effettuare il trasferimento del
 F F
⋅ F 
file su N pari è: max  ,
,
.
 u s d min u s + ∑i ui 
Il modello peer to peer è scalabile cioè:
consente di avere molto meno richieste sulla banda offerta dal server;
14
il tempo necessario per distribuire il file cresce solo lentamente con N;
Ma il modello peer to peer presenta alcun difficoltà:
i peer possono facilmente entrare nella rete ed uscirne poiché:
o i peer sono collegati alla rete peer to peer in maniera intermittente;
o possono entrare ed uscire dalla rete in un qualunque istante di tempo;
o o possono ritornare nella rete con un differente indirizzo IP (se l’assegnamento
dell’indirizzo IP al peer avviene in maniera dinamica);
i peer necessitano di trovarsi l’un l’altro per permettere lo scambio di file; quindi il
problema fondamentale è quello di localizzare i peer pertinenti ossia è necessario:
o determinare i peer che sono attualmente on line al fine di chiedergli se
posseggono il file desiderato;
o e determinare i peer che hanno il file o contenuto desiderato;
i peer necessitano di essere aiutati l’un l’altro. Bisogna cercare un modo per motivare i
peer a rimanere nel sistema ossia:
o occorre trovare una motivazione che induca il peer a non lasciare il sistema non
appena che terminano i suoi download;
o occorre trovare una motivazione che induca il peer a non preoccuparsi
nell’uploading dei contenuti che esso possiede a qualunque altro peer.
1.2.4 INTRODUZIONE ALLE TIPOLOGIE DI RETI PEER TO PEER
Le reti peer to peer si suddividono nelle seguenti tipologie:
Centralized Directory Model (CDM), ad esempio: Napster e BitTorrent;
Flooded Requests Model (FRM), ad esempio: Gnutella;
Selective Queries Model (SQM) o anche detto Overlay Gerarchico, ad esempio:
KaAZaA.
Nei seguenti capitoli viene presentata una descrizione più dettagliata delle reti peer to peer
appena indicate.
1.2.5 NAPSTER
STORIA [2]
Napster era un servizio di condivisione di file musicali creato da Shawn Fanning mentre stava
frequentando la Northeastern University sita a Boston. Il sistema fu operativo dal giugno 1999 a
luglio 2001. Nel gennaio 1999 fu rilasciata la versione 1.0 di Napster. Nel maggio dello stesso anno
15
fu fondata l’omonima compagnia e nel settembre dello stesso anno ebbe inizio la prima causa legale
contro Napster. Nel 2000 Napster contava 80 milioni di utenti. La sua tecnologia consentiva alle
persone di condividere facilmente tra loro i file musicali in formato MP3 con dei server centrali che
contenevano informazioni riguardanti i file condivisivi e gli utenti che condividevano tali file; per
tali motivazioni l’industria della musica accusò Napster per violazione del copyright. Sebbene il
servizio originario era stato chiuso dal tribunale nel luglio del 2001, tale evento aprì la strada, nello
stesso anno, ai programmi di peer to peer decentralizzati utilizzati per la condivisione di file, il cui
controllo risultò essere più difficoltoso. La marca ed il logo di Napster furono venduti nel 2003,
dopo che la compagnia chiuse i battenti, e Napster fu ricostituito come un servizio a pagamento.
1.2.5.1 APSTER TECHOLOGY: SERVIZIO DI DIRECTORY [6]
La tecnologia sulla quale si basa Napster è un Servizio di Directory ossia: l’utente installa il
software, scaricando il programma client e registrandosi al sistema indicando la username, la
password e la directory locale nella quale vengono mantenuti i file condivisi ed i file scaricati da
altri utenti di Napster. Il client contatta Napster (ossia uno dei server centralizzati di Napster),
attraverso il protocollo di trasporto TCP, e gli fornisce la lista di file musicali che condivide. In
questo modo il server centrale di Napster aggiorna (con la lista dei file ricevuti) la directory.
Attraverso il servizio di directory il client ricerca il file desiderato specificando il titolo della
canzone o l’artista al server centrale: il server centrale di Napster individua i client on line che
posseggono tale file e fornisce i loro indirizzi IP al client richiedente; in questo modo avendo gli
indirizzi IP degli host che posseggono il file desiderato, il client scarica direttamente il file da tali
host usando, quindi, una comunicazione peer to peer. Quindi il client richiede il file desiderato al
fornitore scelto: in questo modo il fornitore trasmette il file desiderato al client e sia il client che il
fornitore riportano lo stato della transazione a Napster.
1.2.5.2 APSTER TECHOLOGY: SERVIZIO DI PROPRIETA’ [6]
La directory del server è continuamente aggiornata con le informazione relative ai file
condivisi provenienti dai client. In questo modo si consoce sempre quale contenuto musicale è
correntemente disponibile. Il fatto di avere un server centralizzato che contiene le informazioni
relative ai file condivisi e ai peer che condividono tali file rappresenta una vulnerabilità per quanto
riguarda le azioni legali da parte di case discografiche.
Il trasferimento del file desiderato dal client che possiede il file al client richiedente viene
effettuato con un trasferimento peer to peer ed in questo modo non vi è alcun carico sul server
16
centrale e vi è la negabilità plausibile per quanto riguarda le azioni legali, ma questo non è
abbastanza poiché le trasmissione di file tra due client possono essere tracciate osservando le
comunicazioni che riceve il server centrale dai client.
Napster utilizza un protocollo proprietario per quanto riguarda le operazioni di: login, ricerca
file, upload di file, download di file e le operazioni di stato. Con tale protocollo vi è un basso livello
di sicurezza poiché le password vengono trasmesse in chiaro e non in maniera crittografata e poiché
vi sono altre vulnerabilità nel sistema.
Nel sistema utilizzato da Napster vi sono problemi riguardanti l’ampiezza di banda poiché i
client che forniscono file condivisi vengono classificati in base alla loro ampiezza di banda ed in
base al loro tempo di risposta apparente o stimato.
1.2.5.3 LIMITAZIOI DEL SISTEMA A DIRECTORY CETRALIZZATA
DI APSTER [6]
Le limitazioni del sistema utilizzato da Napster sono rappresentate dal fatto che:
si ha un singolo punto di guasto rappresentato dal server centrale e quindi il sistema ha
una bassa tolleranza ai guasti;
si ha un colo di bottiglia nelle prestazioni rappresentato dal server centrale poiché il
trasferimento del file desiderato tra due peer è completamente decentralizzato, ma la
localizzazione del contenuto è fortemente centralizzata poiché è il servizio di directory
centralizzato che localizza il contenuto;
vi è un servizio di directory centralizzato che localizza il contenuto desiderato e quindi le
violazioni di copyright sono facilmente individuabili analizzando i file conosciuti dal
servizio di directory stesso.
Quindi per tali limitazioni i sistemi di peer to peer più recenti sono maggiormente distribuiti
fino ad arrivare ad alcuni sistemi di peer to peer, come ad esempio Gnutella, che sono
completamente distribuiti.
1.2.6 GNUTELLA
STORIA [3]
Gnutella è una rete utilizzata per la condivisione di file. Gnutella è la più popolare rete per il
file sharing su internet con un mercato di condivisione di più del 40%. Nel giugno del 2005 la
popolazione di Gnutella era di 1.81 milioni di computer.
17
Il primo client fu sviluppato da Justin Frankel e Tom Pepper (della compagnia Nullsoft) nel
2000, e la compagnia in questione fu successivamente acquisita da AOL. Il 14 marzo del 2000 il
software fu reso disponibile per il download sui servers della Nullsoft. Il giorno dell’evento fu
prematuramente annunciato e in quel giorno si ebbe un numero molto elevato di download del
client di file sharing. Per tale motivo il giorno successivo, AOL fermò la disponibilità del
programma per possibili cause legali analoghe a quella del caso Napster, ed inoltre limitò NullSoft
dal fornire qualunque ulteriore sviluppo o lavoro relativo al progetto. Questo comportamento della
compagnia AOL non fermò lo sviluppo di Gnutella; infatti dopo pochi giorni, venne effettuato il
reverse enginiring del protocollo e conseguentemente, iniziarono ad apparire dei cloni free e open
source compatibili con la rete di Gnutella. Quindi molto presto vennero sviluppati molti altri client
(come ad esempio Morpheus, Limewire, Bearshare) basati sul protocollo di Gnutella. Lo sviluppo
in parallelo di differenti client da parte di differenti gruppi rimane tutt’oggi la modalità di sviluppo
di Gnutella.
La rete di Gnutella è completamente distribuita ed è quindi alternativa a quei sistemi semicentralizzati come KazAa e quei sistemi centralizzati come Napster o BitTorrent. Inizialmente la
popolarità della rete era fortemente accresciuta dalla chiusura di Napster per cause legali nel 2001.
Questa enorme crescita di popolarità di Gnutella svelarono le limitazioni di scalabilità del
protocollo iniziale. Nel 2001 le modifiche apportate al protocollo consentirono il miglioramento del
sistema in termini di scalabilità. Ad esempio uno dei miglioramenti consiste nella seguente
considerazione: invece di trattare ogni utente come client e server, certi utenti vengono trattati come
“ultrapeer” ai quali vengono inoltrate le richieste di ricerca da parte degli utenti collegati a tali
ultrapeer e questi inoltrano agli utenti che sono a loro collegati le risposte relative alle richieste che
loro avevano effettuato. Questo consentì alla rete di aumentare di dimensione.
Oggigiorno la parola “Gnutella” non fa riferimento ad un particolare progetto o ad una
porzione di software ma fa riferimento al protocollo aperto utilizzato dai vari client.
1.2.6.1 PROTOCOLLO DI QUERY FLOODIG [6]
Il protocollo di query flooding utilizzato da Gnutella consente di effettuare le seguenti
operazioni:
Join: operazione con la quale, il peer che vuole accedere alla rete, contatta alcuni nodi di
modo che questi diventino dei suoi vicini; per fare questo si ha un nodo di bootsdrap che
ha lo scopo di indicare al nodo considerato i suoi vicini;
18
Publish: in questo caso la pubblicazioni dei file che possiede l’utente considerato non è
necessaria poiché non si ha una directory centralizzata nel quale pubblicare i file che
possiede;
Search: un utente per cercare un file lo richiede ai suoi vicini i quali a loro volta
chiederanno il file desiderato ai loro vicini. Ogni volta che in questa ricerca si trova un
nodo che possiede il file desiderato si verifica che l’indirizzo IP di tale nodo viene
comunicato all’utente che ha generato la ricerca;
Fetch: il nodo considerato ottiene il file desiderato direttamente da un altro nodo della
rete peer to peer che possiede tale file.
Quindi Gnutella prevede un sistema:
completamente distribuito ossia non vi è alcun server centrale, come invece accade nel
caso di Napster;
con un protocollo di pubblico dominio ossia noto a tutti;
molti client di Gnutella che implementano tale protocollo.
Nella rete peer to peer di Gnutella si ha una rete di overlay che consiste in un grafo nel quale
ogni suo nodo corrisponde ad un peer partecipante della rete peer to peer stessa:
vi è un collegamento TCP tra due nodi della rete, se questi due nodi si conoscono tra
loro;
se un peer partecipante conosce la locazione di un altro peer nella rete peer to peer, allora
vi è un arco diretto tra il primo nodo ed il secondo nodo nella rete di overlay; quindi vi è
un arco tra il peer X ed il peer Y se vi è una connessione TCP tra i due;
tutti i peer attivi ed gli archi che li collegano formano la rete di overlay;
dato un peer questo sarà collegato, tipicamente, con un numero di vicini della rete di
overlay inferiore a 10.
19
1.2.6.2 PROTOCOLLO DI QUERY FLOODIG [6]
Quando uno nodo X della rete richiede un file si verifica che:
un messaggio di richiesta (o “Query Message”) è inviato a tutti i vicini del nodo
considerato attraverso le connessioni TCP già esistenti tra il nodo X ed i suoi vicini, con
il quale si richiede se i nodi che lo ricevono hanno il file desiderato;
ogni nodo che riceve la richiesta effettua due operazioni:
o inoltra il messaggio di richiesta ai propri vicini (o “Query Message”) sfruttando le
connessioni TCP già esistenti con loro;
o se ha il file considerato allora invia, nel percorso inverso che lo collega al nodo
richiedente, un messaggio di “Query Hit” che contiene ad esempio l’indirizzo IP
del nodo a cui è appena giunta la richiesta, di modo che il nodo X possa scaricare
direttamente il file dai peer che lo posseggono già.
La scalabilità di questo protocollo è limitata all’ambito di questo flooding ossia di quanto
inondare la rete con questi messaggi di richiesta.
1.2.6.3 GUTELLA: JOIIG DEL PEER ALLA RETE [6]
Un peer X per potersi unire alla rete peer to peer di Gnutella, deve trovare degli altri nodi peer
che ne fanno parte. Per fare ciò il nodo X esegue i seguenti passi:
inizia con una lista di peer candidati;
il nodo X prova sequenzialmente a creare una connessione TCP con ogni peer della lista
considerata fino a che non riesce a mettere in piedi una connessione con un nodo Y (della
lista).
A questo punto il nodo X invia un messaggio di Ping al nodo Y:
il nodo Y inoltra il messaggio di Ping a tutti gli altri suoi vicini;
tutti i peer che ricevono il messaggio di Ping rispondono con un messaggio di Pong che
viene inoltrato al peer X.
In questo modo il nodo X riceve molti messaggi di Pong (un messaggio di Pong per ogni nodo
che Y conosce) e quindi X può mettere in piedi ulteriori connessioni TCP verso i nodi che gli
hanno inviato il messaggio di Pong.
20
1.2.6.4 VATAGGI E SVATAGGI DI GUTELLA [6]
I vantaggi di Gnutella sono i seguenti:
si ha un sistema completante decentralizzato;
il costo della ricerca di un file è distribuito tra tutti i nodi della rete che vengono
interpellati con il protocollo di flooding;
l’elaborazione distribuita tra i vari nodi permette potenti ricerche semantiche.
Gli svantaggi di Gnutella sono i seguenti:
l’area di ricerca del file desiderato è abbastanza vasta;
il tempo necessario alla ricerca dei nodi che posseggono il contenuto desiderato può
essere molto lungo, siccome la richiesta deve essere propagata in tutta la rete di Overlay
della rete peer to peer;
si ha un alto contenuto di overhead nei messaggi e i nodi entrano ed escono dalla rete
molto spesso.
1.2.7 KaZaA
STORIA [4]
La rete peer o peer KaZaA fu creata nel marzo del 2001 dalla Dutch company, vicino alla fine
della prima generazione di reti peer to peer di prima generazione, che ha fine con la chiusura di
Napster nel luglio 2002. In questo sistema si ha una singola rete chiamata FastTrack utilizzata anche
da altri client.
Inizialmente molti utenti di KaZaA utilizzavano un client alternativo, che utilizzava lo stesso
protocollo e accedeva alla stessa rete di KaZaA. Ma una volta che il client ufficiale di KaZaA
divenne molto più diffuso di tutti gli altri, gli sviluppatori di KaZaA utilizzarono la loro abilità per
far sì che il client si aggiornasse automaticamente. In questo modo, attraverso la funzionalità di
aggiornamento automatico, venne cambiato il protocollo su cui si basava la rete di KaZaA in modo
da rendere inutilizzabili i Morpheus client, quando i suoi sviluppatori mancarono il pagamento della
licenza. Successivamente Morpheus divenne un client della rete peer to peer Gnutella.
Quindi, eventualmente, il protocollo può essere cambiato o modificato cosicché altri client
(non prodotti dagli sviluppatori di KaZaA) non possono più comunicare attraverso tale protocollo, e
ciò è possibile senza intaccare le funzionalità dei client di KaZaA poiché questi ultimi si aggiornano
automaticamente acquisendo in questo modo la conoscenza del comportamento del nuovo
protocollo.
Come tutti i produttori di prodotti simili, i proprietari di KaZaA sono stati citati in tribunale
dalle case discografiche per restringere il suo uso nella condivisione di materiale soggetto a
21
copyright. Nel novembre 2001, il tribunale ordinò ai proprietari di KaZaA di prendere
provvedimenti in modo tale da prevenire la presenza nella rete di KaZaA di utenti che violino il
copyright o in alternativa subire una pesante multa. I proprietari di KaZaA risposero a tale
ordinanza vendendo l’applicazione di KaZaA ad una complicata rete di compagnie offshore. Alla
fine di marzo del 2002 la corte d’appello della Dutch company rovesciò il primo giudizio, e stabilì
che KaZaA non era responsabile per le azioni dei suoi utenti, ed il conseguente appello delle case
discografiche fu perso nel dicembre 2003. In ogni modo i problemi legali di KaZaA erano
solamente all’inizio. I nuovi proprietari di KaZaA furono citati nel tribunale di Los Angeles da varie
compagnie discografiche e compagnie cinematografiche. La causa fu persa dai proprietari di
KaZaA dopo un controverso processo. Dopo questa decisione, a favore delle compagnie
discografiche e quelle cinematografiche, i proprietari di KaZaA si accordano con le case
discografiche e cinematografiche con il pagamento di una penale di 100 milioni di dollari per i
danni subiti delle quattro maggiori compagnie discografiche (Universal Music, Sony BMG, EMI e
Warner Music) e un ammontare non conosciuto per le case cinematografiche. Successivamente i
proprietari di KaZaA ebbero altri problemi giudiziari che non verranno qui descritti.
1.2.7.1 SMART QUERY FLOODIG [6]
Il protocollo utilizzato da KaZaA è detto “Smart Query Flooding” e prevede le seguenti
operazioni:
Join: all’avvio il client contatta un super – node e successivamente potrebbe lui stesso
diventare un super – node;
Publish: il client invia la lista dei file che possiede al proprio super – node ed in questo
modo pubblica la lista dei suoi file;
Search: il nodo richiedente invia al super – node il messaggio di query, e i super – node si
propagano tra loro la query;
Fetch: il nodo richiedente ottiene il file direttamente dal peer o dai peer che posseggono il
file desiderato; in questo modo il nodo richiedente recuperare il file da più peer alla volta.
1.2.7.2 KaZaA: SFRUTTARE L’ETEROGEEITA’ [6]
Nella rete Peer To Peer di KaZaA viene sfruttata l’eterogeneità esistente tra i nodi della rete, in
quanto vi possono essere due tipologie di nodi differenti i super – node ed i nodi ordinari, che
assolvono compiti leggermente diversi: ogni nodo della rete è un leader di un gruppo di nodi oppure
22
è assegnato ad un gruppo leader ed in questo caso è un peer ordinario. Quindi in questa situazione si
verifica che:
viene creata una connessione TCP tra ogni peer ordinario ed il suo nodo leader del
gruppo a cui appartiene;
vi sono delle connessioni TCP tra alcune coppie di nodi leader di gruppo.
Quindi ogni group leader è un nodo che tiene traccia dei contenuti presenti nei suoi nodi figli
ossia nei nodi che gli sono associati.
ordinary peer
group-leader peer
neighoring relationships
in overlay network
Figura 1
1.2.7.3 COSOLIDAMETO DELLE QUERY [6]
Il consolidamento delle query di richiesta file viene effettuato considerando che: molti nodi
collegati ad un super nodo potrebbero avere solamente un numero molto piccolo di file e quindi la
propagazione della query ad un sub-node (ad un nodo ordinario) potrebbe richiedere più tempo
rispetto alla risposta che si ottiene direttamente al super – node.
Quindi avendo nella rete dei nodi particolari detti super – node si ha un miglioramento del
protocollo di query flooding poiché è sufficiente propagare il messaggio di richiesta ai soli super
node e non a tutti i nodi della rete peer to peer.
23
1.2.7.4 STABILITA’ [6]
I super node favoriscono i nodi aventi un tempo di up elevato ossia un tempo in cui sono attivi
più elevato, poiché la durata di tempo in cui il nodo è attivo è una buona predizione di quanto tempo
sarà attivo in futuro.
1.2.8 BitTorrent
STORIA [5]
Il client BitTorrent è un programma che gestisce il download e l’upload di torrent
(letteralmente “torrenti”) utilizzando il protocollo BitTorrent.
Il primo client, conosciuto come BitTorrent, fu creato da Bram Cohen nell’estate del 2002.
Molti client successivi sono stati, almeno parzialmente, basati sul primo client di BitTorrent.
All’inizio non tutti i client erano stati implementati per il protocollo BitTorrent e a questi client è
stato aggiunto il supporto per tale protocollo solo successivamente.
1.2.8.1 OBIETTIVI DI BITTORET [6]
L’obiettivo di BitTorrent è quello di consentire un recupero, ossia un download, efficiente del
contenuto desiderato. Quindi non si ha come scopo quello di migliorare il ricerca dei contenuti. In
questo modo si vuole ottimizzare la distribuzione dei file a molti peer, considerando che si ha un
singolo editore (del file) e molti downloader. Un altro obiettivo di BitTorrent è quello di prevenire il
problema di Free – Riding.
1.2.8.2 DOWLOAD SIMULTAEI I BITTORRET [6]
Per consentire ai peer di scaricare il file desiderato in maniera simultanea da altri peer, sono
effettuate le due seguenti operazioni:
viene diviso il file in molte porzioni:
o le varie porzioni vengono replicate su differenti peer;
o un peer avente una porzione completa del file può contrattare con altri peer per
ottenere altre porzioni;
o in questo modo si spera che ogni peer possa riassemblare l’intero file;
viene consentito il download simultaneo di porzioni diverse ossia:
o ogni peer può recuperare le differenti parti del file desiderato da peers differenti
allo stesso tempo;
24
o ogni peer può fornire le parti del file che possiede agli altri peer richiedenti;
o questa gestione delle porzioni dei file è molto importante per file di grandi
dimensioni.
1.2.8.3 BITTORRET: TRACKER [6]
Il traker è un’infrastruttura di nodi che tiene traccia dei peer che stanno partecipando al torrent
considerato. I peer si registrano al tracker ossia: quando un peer entra a far parte del torrent
considerato si registra sul tracker. Inoltre ogni peer, periodicamente, informa il tracker che è ancora
attivo o presente nel torrent. Quando un nuovo peer entra a far parte del torrent il tracker seleziona
l’insieme dei nodi dai quali il nuovo peer potrà scaricare il file del torrent considerato. Quindi il
tracker fornisce al nuovo peer un insieme casuale di peer da cui scaricare il torrent includendo gli
indirizzi IP dei peer selezionati. In questo modo il nuovo peer conosce chi contattare per scaricare i
dati.
1.2.8.4 BITTORET: CHUK [6]
In BitTorrent i file di grandi dimensioni sono divisi in pezzi più piccoli detti chunk. I chunck
sono porzioni del file considerato di dimensione fissa, tipicamente ogni chunk ha una dimensione di
256 Kbyte.
L’utilizzo dei chunk consente il trasferimento simultaneo delle varie porzioni del file cioè: ogni
nodo può scaricare i vari chunk dai suoi vicini e i chunk che possiede li può fornire ad altri suoi
vicini.
Ogni nodo deve essere in grado di imparare quali chunk posseggono i suoi vicini ossia:
periodicamente richiede ai propri vicini la lista dei blocchi che posseggono, relativamente al file
considerato. Il download del file è completato quando sono stati acquisiti tutti i chunk relativi.
1.2.8.5 BITTORET: ARCHITETTURA GEERALE [6]
Si consideri un peer X che voglia scaricare un dato torrent; per fare questo il peer accede al
web server che contiene la pagina web avente il link al file .torrent desiderato, e scarica tale file
.torrent. Nel file .torrent vie è la lista dei tracker che gestiscono i peer che posseggono il file
desiderato. Quindi il peer X effettua la richiesta verso i tracker (indicati nel file .torrent) con la
quale si registra in questi ed ottiene come risposta la lista dei peer che posseggono il file
considerato. A questo punto il peer X effettua la richiesta delle porzioni o chunk ai nodi della lista
25
che ha ricevuto e si mette d’accordo con essi per ottenere chunk diversi dai vari nodi contattati. I
peer che ricevono la richiesta di download dal peer X rispondono inviandogli le porzioni del file
concordate. Inoltre il peer X, nel momento in cui acquisisce almeno un chunk, fornisce (in upload) i
chunk che ha acquisito agli altri peer che non posseggono l’intero file; tali peer sono detti leecher
mentre i peer che posseggono l’intero file sono detti seeder. Periodicamente il peer X invia degli
annunci al tracker per dirgli che è ancora attivo e disponibile ed attraverso tali annunci ottiene la
lista aggiornata dei peer che posseggono il torrent considerato.
1.2.8.6 BITTORRET:
SCELTA
DELL’ORDIE
DEI
CHUK
DA
RICHIEDERE [6]
Il problema che si presenta è quello di stabilire quale ordine si deve fissare per i chunk
richiesti: una possibile soluzione può essere quella di scaricare le varie porzioni del file nell’ordine
con il quale compaiono nell’intero file. Però, adottando tale soluzioni, si incorre al seguente
problema: scaricando i vari chunk del file nell’ordine in cui appaiono nel file stesso si verifica che
molti peer hanno solamente i primi chunk del file stesso. In questo modo, i peer avendo tutti i primi
chunk hanno poche porzioni da condividere con gli altri peer. Inoltre tale soluzione limita la
scalabilità del sistema. Un ulteriore problema è rappresentato dal fatto che, con tale soluzione,
nessuno avrà i chunck più rari, cioè ad esempio si può verificare che i chunk, richiesti dalla maggior
parte dei nodi, siano quelli relativi alla parte finale del file ed in questo modo viene limitata la
capacità del download dell’intero file.
Quindi la soluzione migliore è quella di selezionare i chunk in maniera casuale e fornire prima
i chunk che risultano essere più rari di modo che aumenti la probabilità di completamento del file
considerato.
1.2.8.7 BITTORET: SCELTA DEI CHUK PIU’ RARI [6]
Quale chunk richiedere per primo? Si richiede il chunk che ha il minor numero di copie
disponibili, cioè ad esempio si richiedono prima i chunk più rari.
Con questa soluzione si hanno dei benefici a livello di ogni peer, poiché si evita la starvation
ossia l’attesa di chunk non più disponibili a causa del fatto che i peers che li possedevano se ne sono
andati dal torrent, poiché ogni peer della rete richiede per primi i chunck aventi meno copie
disponibili.
26
Inoltre con tale soluzione si hanno dei benefici a livello di sistema poiché: si evita la starvation
di tutti i peer che stanno aspettando un file e viene bilanciato il carico rendendo uguali il numero di
copie per ogni chunk.
1.2.8.8 IL PROBLEMA DEI FREE–RIDIG ELLE RETI PEER TO PEER [6]
L’enorme maggioranza degli utenti sono free – rider, ossia la maggior parte degli utenti non
condividono file e non effettuano query di richiesta. Altri peer sono considerati free – rider poiché
hanno un numero di connessioni limitate o una velocità di upload limitata.
Essenzialmente vi sono solamente pochi peer che si comportano da server e quindi vi sono
pochi contributi individuali al bene pubblico. A tale scopo BitTorrent previene il fenomeno del free
– riding consentendo ai peer veloci di scaricare dai peer che si comportano da server, ed ogni tanto
si permette anche ai free – riding di effettuare il download del contenuto desiderato.
1.2.8.9 BITTORET: PREVEZIOE DEL FREE – RIDIG [6]
Bisogna considerare che i peer che hanno una banda di upload limitata la devono condividere
tra peer multipli. Quindi le tecniche per prevenire il fenomeno del free – riding sono le seguenti:
dare una maggiore priorità alla banda di upload, ossia favorire i vicini che stanno
uploadando ad una velocità maggiore;
ricompensare i migliori 4 vicini ossia:
o viene misurata la velocità di download che si ha verso ogni vicino;
o i nodi si scambiano tra loro inviandosi i migliori quattro peer;
o il calcolo dei migliori quattro vicini e la riallocazione del download viene
effettuata ogni 10 secondi.
Optimistic unchoking:
o casualmente si prova un nuovo vicino ogni 30 secondi;
o in questo modo un nuovo vicino ha la possibilità di diventare un migliore
partner nella comunicazione.
1.2.8.10
BITTORET: PROBLEMI ATTUALI [6]
Il maggiore problema è quello dei download incompleti: di solito i peer lasciano il sistema
quando terminano il loro download. In questo modo certi peer non saranno mai in grado di
27
completare il download del desiderato; soprattutto, tale problema si verifica per i contenuti meno
popolari.
Un altro problema riguarda il fatto che una percentuale significativa (stimata nel 30%) del
traffico su internet è assorbita dallo scambio file attraverso peer to peer.
Infine vi sono ancora molte questioni legali in sospeso per quanto riguarda lo scambio di file
protetti da copyright.
1.3 UTILIZZO DEL PEER TO PEER NELLA DIFFUSIONE DI CONTENUTI
MULTIMEDIALI
Una modalità attraverso la quale un nodo sorgente può diffondere un contenuto multimediale
(in streaming) ad un dato gruppo di nodi è rappresentato dal protocollo multicast a livello IP. In
questo capitolo verrà fornita una breve descrizione del multicast e verranno esposte le ragioni e le
problematiche che determinano il passaggio dalla distribuzione di contenuti multimediali attraverso
multicast alla distribuzione di contenuti multimediali attraverso opportune reti peer to peer.
1.3.1 UNICAST, BROADCAST E MULTICAST [7]
La versione classica del protocollo IP contempla solamente l’unicast ed il broadcast, mentre il
supporto al multicast è stato aggiunto solamente in tempi successivi. Ogni router presente in
internet è configurato in modo tale che blocchi il traffico di tipo broadcast poiché se si farebbe
passare tutto il traffico broadcast si rischierebbe di irrorare tutta la rete di pacchetti, portandola ad
una possibile congestione. Quindi il broadcast è utilizzato a livello IP ma è mantenuto solamente a
livello locale. Le tre modalità di instradamento pacchetti unicast, broadcast e multicast si
differenziano tra loro in base a coloro i quali è destinato il pacchetto prodotto dal nodo sorgente,
ossia: nel caso dell’unicast il nodo sorgente invia il pacchetto ad uno ed un solo nodo di
destinazione; mentre nel caso broadcast il pacchetto emesso dal nodo sorgente è destinato a tutti i
nodi presenti nella rete locale; ed infine il multicast prevede la definizione di un insieme di
destinatari multicast ai quali viene inviato opportunamente il pacchetto emesso dal nodo sorgente.
Da queste considerazioni le tre modalità di instradamento dei pacchetti presentano anche piani di
indirizzamento differenti cioè: nel caso dell’unicast ogni macchina ha un è proprio indirizzo IP; nel
caso del broadcast il relativo indirizzo (broadcast) non individua una sola macchina ma tutte le
macchine che appartengono ad una rete; invece nel caso del multicast si deve identificare il gruppo
di macchina a cui inoltrare il pacchetto emesso dal nodo sorgente e quindi occorre identificare
28
l’affiliazione delle macchine al gruppo multicast considerato. Quindi per il multicast si ha uno
spazio di indirizzamento che è rappresentato dalla classe di indirizzi D: 224.0.0.0 ÷
239.255.255.255. Questa classe di indirizzi è riservata al multicast e di conseguenza per ogni
gruppo si ha un solo indirizzo IP multicast che lo individua. Inoltre occorre considerare che ogni
indirizzo IP di tipo multicast è solamente un indirizzo destinatario che individua un gruppo di
macchine destinatarie appartenenti al gruppo multicast considerato.
1.3.2 MULTICAST E PROTOCOLLO IGMP [7]
Per permettere alle macchine di entrare a far parte di un gruppo o lasciare un gruppo occorre un
protocollo particolare detto IGMP (“Internet Group Management Protocol”). Attraverso tale
protocollo ogni macchina dichiara al router che afferisce alla sua rete, con una particolare procedura
di segnalazione, l’interesse di appartenere al gruppo desiderato o l’interesse a non appartenere più a
tale gruppo. Il nodo sorgente o trasmettitore non è a conoscenza degli indirizzi unicast dei singoli
ricevitori che appartengono al gruppo ma conosce solamente l’indirizzo multicast del gruppo dei
ricevitori. Quindi è responsabilità dei ricevitori effettuare la richiesta di associazione al gruppo
multicast desiderato sfruttando il protocollo IGMP, il cui scopo è quello di informare il router della
presenza di almeno una macchina, nella rete locale considerata, interessata al dato gruppo. Si
osserva che in un generico gruppo vi possono essere più trasmettitori e di conseguenza quando una
macchina di un gruppo si comporta da trasmettitore tutte le altre macchine del medesimo gruppo si
comportano da ricevitori. Per il protocollo IGMP l’associazione di una macchina ad un dato gruppo
può avvenire in due modi diversi:
1.
prima modalità: la macchina A richiede al router di confine R l’affiliazione al gruppo
desiderato mentre il router R non consoce tale gruppo;
2.
seconda modalità: il router R, determina periodicamente i gruppi conosciuti e li indica
alle macchina della propria rete locale ed in questo modo le macchine della rete locale
fanno richieste al router stesso per potersi affiliare ad uno dei gruppi che gli sono stati
indicati dal router stesso.
Inoltre il protocollo IGMP prevede che un router possa chiedere alle macchine connesse di
indicare tutti i gruppi ai quali sono affiliati o se sono affiliati ad un gruppo specifico; a tale richiesta
le macchine della rete gestita dal router rispondono con un pacchetto uguale a quello utilizzato per
segnalare la volontà di associarsi ad un gruppo per la prima volta.
Infine l’IGMP prevede un pacchetto per indicare al router di confine la volontà di una
macchina di lasciare un particolare gruppo. Questa segnalazione non è strettamente necessaria in
quanto le macchine rinnovano periodicamente la loro affiliazione ad un gruppo ossia il router di
29
confine aspetta una risposta periodica di rinnovo dell’appartenenza al gruppo corrispondente dalle
sue macchine e se tale rinnovo non giunge al router in tempo utile allora il router assume
automaticamente che la macchina abbia abbandonato il gruppo a cui apparteneva.
A livello locale la gestione del multicast attraverso il protocollo IGMP avviene nel seguente
modo:
1.
la macchina A che vuole entrare a far parte di un dato gruppo, effettua la prima
richiesta di appartenenza al gruppo multicast desiderato verso il proprio router di
confine R;
2.
a questo punto il router R vede se esistono pacchetti, in internet, relativi a tale gruppo
e se sì li inoltra verso le macchine richiedenti della propria rete locale;
3.
successivamente il router R richiede periodicamente, a livello locale, chi vuole il
traffico del gruppo multicast considerato ed i client che vogliono effettivamente tale
traffico lo accettano rispondendo alle richieste del router. In questo modo quando il
router riceve i pacchetti multicast del gruppo considerato, li inoltra opportunamente
alla propria rete locale;
4.
se invece le macchine locali non rispondono più alle richieste periodiche del ruoter R
allora il router non farà passare più nulla alla propria rete locale, per quanto riguarda
tale traffico multicast.
Nel caso del multicast si verifica che: la gestione dell’instradamento dei pacchetti a livello
locale è diversa da quella che si adotta a livello geografico.
1.3.3 FUNZIONAMENTO DEL MULTICAST A LIVELLO LOCALE [7]
Per ogni pacchetto multicast che il router di confine R invia alla propria rete locale è necessario
capire come funziona il multicast a livello 2, all’interno delle reti locali. Dovendo inviare un
pacchetto multicast nella rete locale il router R lo può effettuare nei seguenti modi:
1.
caso unicast di livello 2. Siccome il router R conosce l’indirizzo MAC delle macchine
che appartengono al gruppo multicast considerato, allora per ogni macchina locale
appartenente al gruppo il router invia il pacchetto al MAC address della macchina
locale di destinazione considerata; in questo modo la scheda di rete del destinatario
vede un pacchetto con il suo MAC address e quindi lo passa a livello applicativo
scatenando un interrupt verso il sistema operativo. In questo modo il pacchetto viene
passato al sistema operativo senza appesantire quest’ultimo poiché non deve
controllare tutti i pacchetti che circolano sulla rete, in quanto tale operazione è
effettuata dalla scheda di rete per conto del sistema operativo stesso. Occorre notare
30
che, in questa soluzione, il router R invia il pacchetto multicast alla rete locale
inviandolo ad ogni macchina locale, appartenente al gruppo multicast considerato,
come un pacchetto unicast di livello 2 e di conseguenza ciò provoca uno spreco di
risorse e di banda delle rete locale;
2.
caso broadcast di livello 2. Un’altra soluzione può essere la seguente: quando il router
R riceve dall’esterno un pacchetto multicast e lo deve inoltrare alla propria rete locale,
il router trasforma tale pacchetto in un corrispondente pacchetto broadcast di livello 2
(all’interno del quale vi è l’indirizzo IP del gruppo multicast associato) e lo invia alla
propria rete locale. In questo modo ogni macchina della rete locale si comporta nel
seguente modo:
la scheda di rete, di ogni macchina della rete locale, ricevendo un pacchetto di
tipo broadcast di livello 2, interrompe il sistema operativo il quale a seguito di
tale evento determina se il pacchetto ricevuto è rivolto alla sua macchina
controllando se l’indirizzo IP multicast, contenuto nel payload del pacchetto
stesso, è quello del gruppo multicast a cui appartiene la macchina considerata;
in questo modo il sistema operativo di ogni macchina della rete locale viene
interrotto, ogni volta che il router inoltra nella rete locale un pacchetto multicast
sottoforma di un pacchetto broadcast di livello 2, anche se tale pacchetto non è
rivolto alla macchina locale considerata.
In questo modo tutte le macchine della rete locale diventano lente poiché il sistema
operativo di ognuna di esse si dovrà occupare solamente di determinare se i pacchetti
broadcast di livello 2 che riceve sono effettivamente rivolti a lui o meno. Quindi
questa soluzione ha come vantaggio quello di essere semplice da realizzare e come
svantaggio quello che determina un notevole rallentamento delle macchine della rete
locale;
3.
caso multicast di livello 2. Un possibile rimedio alle problematiche introdotte dalle
due precedenti soluzioni è quello di utilizzare un multicast di livello 2. In questo caso
occorre che ogni singola scheda di rete possa programmare al suo interno n indirizzi
multicast di livello 2 ed in questo modo quando la scheda di rete riconosce un
pacchetto multicast di livello 2, avente indirizzo multicast (di livello 2) appartenete
alla lista degli indirizzi gestiti dalla scheda di rete, allora si verifica che tale scheda di
rete inoltra un’interruzione verso il sistema operativo di modo che questo possa gestire
il pacchetto ricevuto. In questa tecnica l’indirizzo IP del gruppo multicast considerato
31
viene mappato opportunamente in un corrispondente indirizzo multicast di livello 2
(per questioni di brevità non verrà descritto in dettaglio tale mapping).
Quindi considerando il multicast a livello locale il router di confine della rete locale deve avere
funzionalità aggiuntive rispetto al semplice instradamento, in particolare deve essere in grado di
gestire l’affiliazione e la rimozione di un nodo della rete locale ad un gruppo e l’inoltro dei
pacchetti relativi ad un gruppo multicast alla propria rete locale.
1.3.4 FUNZIONAMENTO DEL MULTICAST A LIVELLO GEOGRAFICO [7]
Per poter instradare i pacchetti emessi dal nodo sorgente del gruppo multicast ai router di
confine, che gestiscono le reti locali nelle quali vi è almeno un nodo che è affiliato al gruppo
multicast considerato, occorre costruire e mantenere aggiornato l’albero multicast. Tale albero ha
come radice il nodo sorgente (o il router di confine del nodo sorgente), ha come nodi foglie i router
di confine delle reti locali che contengono almeno un nodo interessato al gruppo considerato, ed ha
come nodi intermedi i router che collegano il nodo sorgente ai router foglia. A livello geografico,
quando il pacchetto multicast giunge ad un router intermedio (dell’albero) viene replicato su tutte le
sue interfacce sulle quali si hanno dei router (o nodi) figli interessati al gruppo relativo al pacchetto
considerato. Per fare questo i router devono avere anche le funzionalità necessarie per la gestione
dei pacchetti multicast sia a livello locale (nel caso dei router di confine) che a livello geografico
(nel caso dei router presenti nell’albero di instradamento multicast), oltre alle funzionalità di
instradamento di base. La creazione e la gestione dell’albero multicast può essere effettuata con
protocolli differenti (che in questa sede verranno solamente citati e non descritti) quali ad esempio:
Reverse Path Forwarding, Distance Vector Multicast Routing Protocol e Protocol Indipendent
Multicast.
1.3.5 PROBLEMATICHE DEL MULTICAST [7][8]
Le maggiori problematiche che si riscontrano utilizzando il multicast, per la diffusione di
contenuti multimediali, sono le seguenti:
1. il multicast a livello IP richiede che tutti i router mantengano lo stato per ogni gruppo
multicast che conoscono e tale fatto introduce nei router un’elevata complessità ed
impone dei forti vincoli di scalabilità dei router stessi. I router delle dorsali sono stati,
originariamente progettati per avere un’architettura senza stato e sono dedicati
solamente al forwarding dei pacchetti. Quindi per supportare il multicast a livello IP
ogni router deve essere in grado di riconoscere i gruppi multicast sui quali ognuna delle
32
sue interfacce di rete ha almeno un partecipante e deve essere in grado di gestire le
richieste delle macchine che vogliono entrare a far parte o che vogliono lasciare un dato
gruppo multicast. Queste nuove funzionalità complicano la progettazione dei router;
2. il multicast a livello IP non ha un meccanismo di allocazione degli indirizzi. Gli
indirizzi multicast possono essere assegnati o da un’autorità centralizzata o dalla
particolare applicazione. Se si ha un’autorità centrale che assegna e ricicla (quando non
sono più in uso) gli indirizzi multicast, allora tale autorità deve essere in grado di
gestire tali indirizzi IP multicast in maniera scalabile, consistente e distribuita. Questo è
molto difficile da ottenere specialmente quando un elevato numero di gruppi multicast
sono frequentemente costituiti e rilasciati su tutta la rete internet. Se invece ogni
applicazione individuale è responsabile dell’assegnamento del relativo indirizzo IP
multicast allora potenzialmente vi potrebbe essere la contesa dello stesso indirizzo IP
multicast da parte di differenti applicazioni, e senza la gestione opportuna di questa
situazione si otterrebbe come risultato che il traffico generato da differenti gruppi, che
utilizzano lo stesso indirizzo IP multicast, verrebbe erroneamente mescolato;
3. il multicast a livello IP ha delle vulnerabilità per quanto riguarda la sicurezza, che
possono essere ricondotti al problema del Denial of Service e attacchi flooding
provenienti da utenti malevoli. Il multicast a livello IP differisce dalle comunicazioni IP
unicast nelle sue implicazioni di sicurezza cioè: il corrente modello dell’IP multicast
consente ad una sorgente arbitraria (che è entrata a far parte del relativo gruppo) di
inviare dati ad un gruppo arbitrario e tale fatto determina la vulnerabilità della rete ad
attacchi flooding generati da sorgenti malintenzionate. Per risolvere tale problema è
necessario implementare delle politiche di sicurezza molto complicate prima che il
multicast a livello IP venga ampiamente impiegato;
4. il multicast a livello IP è un servizio di tipo “Best Effort” ossia si consegnano i
pacchetti nel miglior modo possibile utilizzando il protocollo a livello di trasporto
UDP. Quindi attualmente non vi è un protocollo a livello di trasporto efficace e
scalabile che opera per il multicast a livello IP al fine di garantire la consegna affidabile
dei pacchetti e garantire un’implementazione del meccanismo del controllo di flusso e
di congestione. Per tali motivi l’utilizzo del multicast IP è ristretto solamente ad alcune
particolari applicazioni (ad esempio diffusione e distribuzione di contenuti
multimediali, che per le loro caratteristiche non possono avere un meccanismo
affidabile di consegna dei pacchetti e un meccanismo di controllo di flusso e di
congestione);
33
5. l’IP multicast richiede molti cambiamenti a livello di infrastruttura di rete. Per tali
motivi la maggior parte degli Internet Service Provider non sono disposti a fornire il
supporto al multicast a livello IP a causa del fatto che dovrebbero effettuare
significativi investimenti. Ma d’altro canto, la forte necessità delle funzionalità offerte
dal multicast ed il consumo inefficiente di banda che si verifica nelle tradizionali
applicazioni client – server, richiedono un modo alternativo per fornire le funzionalità
offerte dal multicast.
Una possibile soluzione alternativa al multicast a livello IP, per la diffusione di contenuti
multimediali generati a partire da un nodo sorgente, è quello di utilizzare reti peer to peer nelle quali
vi è un unico nodo sorgente che fornisce il contenuto multimediale ed ogni nodo altro nodo che
entra nella rete acquisisce il contenuto da un altro peer o dal nodo sorgente e sfrutta la sua output
band per fornire il servizio ad altri peer che successivamente entreranno nella rete stessa; in questo
modo non è necessario avere una infrastruttura di rete che supporti una data tecnologia o uno
specifico meccanismo di comunicazione come accade per il multicast a livello IP.
1.4 PEER TO PEER SU CANALE ASIMMETRICO
Utilizzi più innovativi del peer to peer prevedono l'impiego delle reti peer to peer per la
diffusione di elevati flussi di dati generati in tempo reale, come per esempio programmi televisivi,
film o comunque contenuti multimediali in genere. Questi sistemi si basano sull'utilizzo delle banda
di trasmissione che i singoli utenti dispongono e la banda viene utilizza per trasmettere agli altri
fruitori il flusso dati. Questa tipologia di sistemi, in linea di principio, non richiedono server dotati
di elevate prestazioni dato che il server fornisce a un numero molto limitato di utenti i flussi video,
e poi i singoli utenti ridistribuiscono agli altri utenti i flussi video.
Questo metodo di diffusione permette in teoria la trasmissione in tempo reale di contenuti
video ma richiedono che i singoli utenti siano dotati di connessioni che oltre ad avere elevata banda
in ricezione siano anche dotati di elevata banda in trasmissione, altrimenti il primo nodo della rete
(il server) dovrebbe fornire la larghezza di banda mancante portando rapidamente a una saturazione
della banda fornita dal server. Questo limita la diffusione di questa tecnologia in Italia dove sono
molto diffusione le linee asimmetrica (quali ad esempio le adsl) che forniscono elevata banda di
ricezione ma scarsa banda in trasmissione. Per tali motivi è utile studiare, ed eventualmente
realizzare, algoritmi per la costruzione incrementale di reti peer to peer adottate per la diffusione di
contenuti multimediali erogati da un unico nodo sorgente e supponendo che i nodi che accedono a
34
questa rete siano caratterizzati da collegamenti asimmetrici (o linee asimmetriche)
[9]
. Quindi lo
scopo di questi algoritmi è quello di gestire l’inserimento nella rete peer to peer di ogni nodo che
vuole accedere al contenuto.
Nel capitolo successivo viene descritto l’algoritmo per la creazione di reti peer to peer adottate
per la diffusione di contenuti (ideato da Gianluca Mazzini e Riccardo Rovatti) nel quale si ha come
ipotesi principale che: tutti i nodi che vogliono accedere alla rete hanno la medesima banda in
upload, hanno una banda in download sufficiente ad acquisire il contenuto multimediale (ossia la
input band di ogni nodo è almeno pari alla banda richiesta dal contenuto) e si suppone che tutte le
bande disponibili di ogni nodo della rete peer to peer siano non variabili nel tempo [9].
2 PEER
TO
PEER
DISTRIBUTION
ON
ASYMMETRIC
CHANNELS [9]
I metodi di peer to peer sono comunemente impiegati per la distribuzione di un contenuto ad
un gran numero di utenti interessati, nel miglior modo possibile dati certi vincoli di ampiezza di
banda che dipendono dalla banda richiesta dal contenuto da diffondere. In questo capitolo verrà
descritto un semplice metodo per creare una rete peer to peer per applicazioni di streaming nelle
quali vi è una sorgente che fornisce continuamente un contenuto che deve essere utilizzato da un
elevato e sconosciuto numero di utenti entro un dato ritardo di tempo massimo.
2.1 TOPOLOGIA DELLE RETI
Nella nostra rete, il nodo sorgente emette il contenuto mentre i nodi utente, o anche detti peer,
sono in grado di accettare stream parziali (o contenuti parziali) provenienti da più di un nodo
attraverso il loro collegamento d'ingresso e di ridistribuire tale contenuto ad uno o più ulteriori peer
attraverso il loro link di uscita. Questo crea una rete di distribuzione del contenuto modellata
attraverso un grafo diretto orientato dalla sorgente. Tale grafo deve essere creato ed aggiornato
dinamicamente quando un nuovo peer entra nella rete e tale aggiornamento deve essere effettuato
senza cambiare i collegamenti dei peer che si stanno servendo attualmente.
Il meccanismo di gestione dinamica della rete peer to peer, che verrà introdotto e descritto nella
sezione successiva, ha i seguenti obiettivi:
il primo obiettivo è rappresentato dalla minimizzazione della banda totale disponibile
che il nodo sorgente fornisce alla rete;
35
il secondo obiettivo considera la banda sorgente come un vincolo e minimizza il ritardo
massimo in termini di link intermedi.
Quindi nell’algoritmo, che viene descritto nella sezione successiva, non si considera come
obiettivo la massimizzazione del numero di nodi inseribili nella rete ma tale obiettivo verrà
considerato negli algoritmi che verranno analizzati e decritti nel capitolo 3.
Le ipotesi sulle quali si basa l’algoritmo per la creazione della peer to peer in analisi sono le
seguenti:
tutti i peer sono caratterizzati da una stessa ampiezza di banda in output, Ω, e sono
sempre disponibili durante lo streaming; inoltre si ipotizza che Ω sia inferiore a 1;
l'ampiezza di banda in ingresso di tutti i peer è sufficiente ad accettare il contenuto e
tutte le ampiezze di banda sono normalizzate rispetto alla banda Bc richiesta dal
contenuto che deve essere distribuito. Quindi la banda richiesta dal contenuto
multimediale è normalizzata a 1;
con il rispetto di tale ampiezza di banda, l'ampiezza di banda massima di ogni peer è
minore o uguale a 1;
il nodo sorgente ha un'ampiezza di banda massima pari a B;
la banda disponibile di ogni nodo della rete peer to peer è tempo invariante.
I nuovi algoritmi che vengono proposti, analizzati e descritti nel capitolo 3 di questa tesi, non
contemplano l’ipotesi per la quale tutti i nodi che accedono alla rete sono caratterizzati da uno
stesso valore di output band e quindi si suppone che tali nodi possano avere valori di output band
differenti.
2.2 DESCRIZIONE DELL’ALGORITMO [9]
Come già specificato nel capitolo precedente si suppone che le bande di upload e di download
di tutti i nodi siano normalizzate rispetto alla banda Bc del contenuto. In questo modo l’output band
di ogni nodo rappresenta il numero di nodi che tale peer è in grado di alimentare al fine di erogare il
contenuto multimediale considerato. Naturalmente, se l’output band che ha a disposizione il nodo
considerato è inferiore all’unità allora tale nodo non sarà in grado di alimentare un ulteriore nodo e
di conseguenza quest’ultimo dovrà acquisire il contenuto multimediale dal nodo considerato e da
ulteriori nodi.
Secondo questo algoritmo di inserimento nodi nella rete si considera che: la rete peer to peer di
distribuzione del contenuto è organizzata in "tier" o file numerate a partire da 1. I peer contenuti
nel primo tier sono alimentati dal nodo sorgente. Mentre i peer del j-esimo tier ricevono il contenuto
solamente dai peer presenti nel (j-1)-esimo tier. Il numero di tier presenti nella rete di distribuzione
36
del contenuto è indicato dal parametro T, che rappresenta anche il massimo ritardo della rete in
termini di link (o collegamenti) intermedi.
Si indica con Pj il numero di peer presenti nel j-esimo tier. Considerando che la banda del
contenuto è normalizzata all'unità allora la banda complessiva richiesta per distribuire il contenuto
al j-esimo tier è Pj. Mentre considerando che ogni nodo fornisce una output band pari a Ω allora
l'intera ampiezza di banda messa a disposizione dal j-esimo tier è pari a Ω·Pj. L'ampiezza di banda
fornita in output dal nodo sorgente è data dal parametro P1.
Il passo elementare comune ai due algoritmi che verranno successivamente descritti, è
"l'inserimento di un peer nel j-esimo tier se è possibile" e questa porzione di codice è indicata con
A(j). Un pseodocodice per la procedura A(j) è il seguente:
Algoritmo (1)
case j=1
if (P1 < B)
then P1++; else failed
case j=2,...,T
if (Ω·(Pj-1) ≥ Pj+1)
then Pj++; else failed
case j=T+1
if (Ω·(PT) >=1)
then PT+1=1; T++; else failed
Figura 2
Dove un peer è inserito nel j-esimo tier se e solo se l'output bandwidth fornita dal tier
precedente (se j=1 allora il tier precedente è rappresentato dal nodo sorgente) è sufficiente per
accoglierlo.
Ora si assume che la banda B fornita dal nodo sorgente sia tendente a infinito e che si vogliano
servire i nodi che vogliono unirsi alla rete in modo tale che la banda P1 (ossia l'ampiezza di banda
effettiva del nodo sorgente) sia minimizzata senza cambiare i peers ed i loro link, che sono già
presenti nella rete. Se vi sono due reti aventi la stessa banda del nodo sorgente P1 allora si vuole
scegliere tra queste due la rete avente il minore valore del parametro T, per minimizzare il ritardo
massimo della rete. Viene effettuato ciò attraverso il seguente semplice algoritmo:
Algoritmo (2)
for j=2 to T+1
if A(j) not failed then stop
next
Figura 3
A(1)
37
Questo primo algoritmo prova ad aggiungere il nuovo peer nel tier avente il minimo ritardo
complessivo non considerando il tier collegato direttamente al nodo sorgente; in questo modo se,
per i vincoli sull'ampiezza di banda, il nodo non può essere inserito nei tier successivi al primo
allora tale nodo viene inserito nel primo tier poiché il nodo sorgente alimenta tale tier con una
upload band disponibile infinita.
Ora si assume che la banda fornita dal nodo sorgente B sia finita e che si vogliano servire i
nodi, che vogliono unirsi alla rete, in modo tale che venga minimizzato il parametro T che
rappresenta il ritardo massimo che subisce la rete. Viene effettuato ciò attraverso il seguente
algoritmo:
Algoritmo (3)
for j=1 to T+1
if A(j) not failed then stop
next
failed
Figura 4
Questo algoritmo prova ad aggiungere il nuovo peer nel tier caratterizzato dal ritardo minimo
in modo tale da soddisfare i vincoli sull'ampiezza di banda e quindi tale algoritmo viene terminato
con insuccesso (fallisce) se non si possono alimentare ulteriori peers da parte dei peers che vi sono
nei vari tiers della rete di diffusione del contenuto.
Entrambi questi approcci sono sub-ottimi nel numero di peer serviti. Infatti, si potrebbe
racimolare l'output band non utilizzata dai differenti tier per alimentare un nuovo nodo. Gli
algoritmi (2) e (3) producono una struttura nella quale ogni nodo alimenta al massimo due ulteriori
nodi nel tier successivo. Più formalmente, ad ogni istante, ogni peer è in uno dei seguenti 3 stati:
(1) stato del nodo nel quale non invia il contenuto ad ulteriori nodi;
(2) stato del nodo nel quale invia il contenuto ad un ulteriore nodo fornendo un'ampiezza di
banda effettiva pari a ω ≤ Ω (dove Ω è la banda totale disponibile offerta da ogni nodo);
(3) stato del nodo nel quale invia il contenuto a due ulteriori peers saturando completamente la
sua output bandwidth Ω.
Per capire il perché si verifica ciò, si assume che questo è vero per una data rete e si assume
che un nuovo peer entra nella rete e viene assegnato al (j+1)-esimo tier. Se vi è un nodo nel j-esimo
tier che sta già fornendo in uscita un'ampiezza di banda pari a ω < Ω allora tale nodo satura
completamente la sua output band alimentando il nuovo nodo fornendogli la sua banda residua che
è pari a Ω - ω (quindi tale nodo è nello stato (3)). Il quantitativo di banda rimanente ρ = 1 - (Ω - ω),
38
necessario al nuovo nodo per completare il contenuto, viene preso da ulteriori nodi presenti nel jesimo tier: considerando che la banda richiesta dal contenuto, (che è pari a 1), è superiore alla banda
Ω complessiva, che può fornire ogni nodo della rete, allora il nuovo nodo completa il contenuto
prellevando la banda rimanente da un numero di nodi pari a ρ / Ω  (considerando che la banda
rimanente ρ è > Ω), e per tali nodi sarà completamente saturata la loro banda, mentre un ulteriore
nodo fornirà l'ultimo quantitativo di banda restante pari a ρ − ρ / Ω  ⋅ Ω < Ω . Con queste
considerazioni, tutti i peer presenti nella rete sono in uno dei tre stati descritti precedentemente.
3 NUOVI ALGORITMI
Questa tesi si occupa della realizzazione di nuovi algoritmi per la creazione di peer to peer,
dove i nodi che andranno a formare la rete non presentano output band uguale ma differente. Quindi
viene meno un ipotesi del precedente algoritmo su canale asimmetrico. In questo modo, a partire
dall’algoritmo per la creazione di reti peer to peer per la diffusione di contenuti (descritto nel
capitolo precedente) si vogliono realizzare nuovi algoritmi per i quali tutti i nodi che accedono alla
rete possano avere valori di output band differenti.
I meccanismi di gestione dinamica della rete peer to peer, che verranno introdotto e descritti
nelle sezioni successive, hanno i seguenti obiettivi:
massimizzare il numero di nodi inseribili nella rete in funzione della banda del nodo
sorgente (Bs);
minimizzazione della banda totale disponibile che fornisce il nodo sorgente alla rete;
minimizzazione dei possibili costi delle ristrutturazioni che si hanno nella rete peer to
peer all’atto dell’inserimento di un nuovo nodo (questa funzione obiettivo è valida
solamente nei nuovi algoritmi di creazione della rete peer to peer che prevedono
l’inserimento dei peer nella rete con eventuale ristrutturazione locale di questa).
3.1 TOPOLOGIA DELLE RETI GENERATE: SEQUENZA DI NODI CHE
ACCEDONO ALLA RETE
Nella rete peer to peer di diffusione del contenuto che si va a considerare, il nodo sorgente
emette il contenuto mentre i nodi utente, o anche detti peer, sono in grado di accettare stream
parziali (o contenuti parziali) provenienti da più di un nodo attraverso il loro collegamento
d'ingresso e di ridistribuire tale contenuto ad uno o più ulteriori peer attraverso il loro link di uscita.
39
Questo crea una rete di distribuzione del contenuto modellata attraverso un grafo diretto
orientato dalla sorgente. Tale grafo deve essere creato ed aggiornato dinamicamente quando un
nuovo peer entra nella rete.
Gli algoritmi che vengono proposti, analizzati e descritti nelle sezioni successivi, non
contemplano l’ipotesi per la quale tutti i nodi che accedono alla rete sono caratterizzati da uno
stesso valore di output band e quindi si suppone che tali nodi possano avere valori di output band
differenti. Inoltre l’output band dei nodi che accedono alla rete possono avere valori superiori
all’unità ossia superiori alla banda normalizzata richiesta dal contenuto.
Per generare la sequenza di nodi che accedono alla rete è stato implementato un algoritmo
basandosi sulle seguenti considerazioni: come già specificato la caratteristica fondamentale dei nodi
è rappresentata dal fatto che essi possono avere un valore di output band qualunque anche superiore
all’unità. Quindi effettuando la generazione della sequenza dei nodi che accedono alla rete si
potrebbe pensare di generare un sequenza di peer aventi valori di output band casuali, ed in
particolare uniformemente distribuite tra una banda minima (definita come la banda del contenuto
multimediale divisa per un parametro K≥2) ed una banda massima (definita come la banda del
contenuto moltiplicata per un parametro m≥1). Ma in questo modo molti nodi della sequenza
avrebbero output band superiori alla banda del contenuto multimediale da diffondere e quindi
applicando uno qualunque dei successivi algoritmi si otterrebbe che: all’aumentare della banda
fornita dal nodo sorgente la rete continuerebbe ad accettare nodi. In questo modo non si
verificherebbe mai la situazione nella quale la rete non è più in grado di accettare nodi e quindi non
si riuscirebbe a stabilire il numero massimo di nodi inseribili nella rete, dove questo valore
rappresenta un parametro fondamentale per il confronto dei vari algoritmi.
Quindi per eliminare tale problema è stato implementato un algoritmo di generazione della
sequenza di nodi che vogliono accedere alla rete, nel quale ogni nodo della sequenza ha:
una data percentuale Pc1 di possibilità di avere un output band < 1 (ossia della banda
richiesta dal contenuto);
una data percentuale Pc2 di possibilità di avere una output band ≥ 1 e < 2;
ed una data percentuale Pc3 (pari a 100%-Pc1-Pc2)di possibilità di avere una output
band ≥ 2.
Occorre notare che Pc1 + Pc2 + Pc3 = 100%.
Un esempio di valori per i parametri Pc1, Pc2 e Pc3 è rappresentato dal seguente caso, nel
quale ogni nodo della sequenza che viene generata ha:
il 75% delle possibilità di avere una output band <1;
il 15% delle possibilità di avere una output band ≥ 1 e < 2;
40
e il 10% delle possibilità di avere una output band ≥ 2.
Sfruttando questa strategia per generare i nodi che vogliono accedere alla rete si limita il
numero di peer che hanno una output band elevata (ossia ≥ 1).
Con percentuali Pc1 elevate (ossia ≥ 75%) , Pc2 dell’ordine di 20% e Pc3 dell’ordine delle
decine (ossia da 5 a 10) si nota che la sequenza di nodi generati porta la rete nello stato in cui essa
non è più in grado di accettare ulteriori nodi. Quindi in questa situazione si è in grado di stabilire il
numero massimo di nodi inseribili nella rete.
L’algoritmo di generazione della sequenza dei nodi prevede:
come parametri di ingresso:
o il fattore moltiplicativo attraverso il quale si stabilisce il valore massimo di
output band che i vari peer generati possono assumere;
o il fattore di divisione attraverso il quale si stabilisce il valore minimo di output
band che i vari nodi possono assumere;
o il numero di peer che vogliono accedere alla rete (numNodi);
o e le due percentuali di possibilità Pc1 e Pc2; occorre notare che Pc3 non viene
richiesto come parametro d’ingresso poiché lo si ricava considerando che Pc1 +
Pc2 + Pc3 = 100%; quindi Pc3 = 100% – (Pc1 + Pc2);
come risultato si ottiene un file di testo contenente le output band dei peer che vogliono
accedere alla rete.
L’algoritmo può essere descritto attraverso il seguente pseudocodice:
…
int Bmax=Bc*fattMolt;
int Bmin=(int) (((double) Bc)/((double) fattDiv));
Random rm=new Random();
//tale divisione fornisce l’intero inferiore come risultato
Random pRm=new Random();
for (int k=0;k<numNodi;k++)
//ciclo for di generazione delle bande di upload dei nodi che tentano di entrare nella rete peer to peer
{
//si deve generare un numero random che va da 0 a 99 (facendo random 100)
int randomPercentuale=pRm.nextInt(100);
int value=Bmin;
if (randomPercentuale<Pc1) //allora si deve generare un numero casuale
//con valori tra Bmin e Bc con il valore generato che va da Bmin a
//Bmax e quindi si generano numeri finchè non si ottiene un numero < Bc
{ do
{ value=generateRandom(Bmax,Bmin,rm);
}while(value>=Bc);
Figura 5
}//end if
41
else if((randomPercentuale>=Pc1)&&(randomPercentuale<(Pc1+Pc2)))
{ //allora si deve generare un numero casuale con valori >=Bc e <2*Bc e siccome il valore generato
//va da Bmin a Bmax e quindi si generano numeri finché non si ottiene un numero >=Bc e < 2*Bc
do
{ value=generateRandom(Bmax,Bmin,rm);
}while((value<Bc)&&(value>=(2*Bc)));
}//end if
else if (randomPercentuale>=(Pc1+Pc2))
{ //allora si deve generare un numero casuale con valori >=2*Bc e siccome il valore generato va
//da Bmin a Bmax e quindi si generano numeri finché non si ottiene un numero >= 2*Bc
do
{ value=generateRandom(Bmax,Bmin,rm);
}while(value<(2*Bc));
}//end if
< scrittura sul file di output della variabile value appena generate >
}//end for
Figura 6
Questo algoritmo, per ogni nodo che accede alla rete, genera la relativa output band nel
seguente modo:
1. viene generato un numero casuale uniformemente distribuito tra 0 e 99;
2. si confronta questo valore casuale con i parametri Pc1 e Pc2:
a. se il valore casuale è < di Pc1 allora si genera un valore di output band casuale
uniformemente distribuito tra la banda minima (inclusa) e la banda del
contenuto multimediale (esclusa);
b. se il valore casuale è ≥ Pc1 e < Pc2 allora si genera un valore di output band
casuale uniformemente distribuito tra la banda del contenuto (inclusa) e il
doppio della banda del contenuto (esclusa);
c. se invece il valore casuale è ≥ Pc1 + Pc2 allora si genera un valore di output
band casuale ≥ del doppio della banda richiesta dal contenuto multimediale
stesso;
3. il valore di output band così generato viene scritto nel file di testo contente i valori di
output band della sequenza di nodi che vogliono accedere alla rete.
42
IMPLEMENTAZIONE DELL’ALGORITMO
L’algoritmo di generazione della sequenza dei nodi è stato implementato in ambiente Java. Si
hanno due implementazioni per questo algoritmo poiché:
la prima implementazione “NodeSeqGen.java” è utilizzata per generare un solo file di
testo, contenente la sequenza di nodi che vogliono accedere alla rete. Tale sequenza è
generata specificando, in modo iterativo da standard input, i seguenti parametri: banda
fornita dal nodo sorgente non normalizzata (rappresentata in kbit/sec); il fattore
moltiplicativo con il quale si fissa la banda massima che i nodi possono assumere; il
fattore di divisione con il quale si fissa la banda minima che i nodi possono assumere; il
numero di nodi da generare in questa sequenza; e le percentuali Pc1 e Pc2. Con
l’esecuzione di questo componente software si ottiene come risultato un file di testo
(con nome: “NodeSequencePc1=<valore di Pc1>Pc2=<valore di Pc2>.txt” ) avente:
nella prima riga la banda necessaria per la diffusione del contenuto (non normalizzata)
e nelle righe successive le output band, generate in maniera pseudocasuale , dei vari
nodi che vogliono accedere alla rete. Questo file è utilizzato per analizzare i primi
quattro algoritmi per la creazione delle reti peer to peer, poiché questi vengono
confrontati analizzando il loro comportamento in termini di: numero di nodi inseribili,
stima del costo delle ristrutturazioni e banda totale residua al variare della banda fornita
dal nodo sorgente, mantenendo inalterata la sequenza di nodi che vogliono accedere
alla rete ossia utilizzando lo stesso file di testo contenente la sequenza di nodi (si veda
la sezione 4.1);
la seconda implementazione “NodeSeqGen1_1.java” è utilizzata per generare una
successione di file di testo, contenenti ciascuna una sequenza di nodi che vogliono
accedere alla rete. Questa successione di file (dove ogni file rappresenta una
successione di nodi) è generata specificando, in modo interativo da standard input, i
seguenti parametri: banda fornita dal nodo sorgente non normalizzata (rappresentata in
kbit/sec); il fattore moltiplicativo con il quale si fissa la banda massima che i nodi
possono assumere; il fattore di divisione con il quale si fissa la banda minima che i nodi
possono assumere; il numero di nodi da generare in ciascuna sequenza; e la percentuale
iniziale Pc1_init, inoltre non è necessari avere anche un valore iniziale per Pc2 poiché
si suppone che Pc2 sia pari a 100-Pc1, mentre Pc3 è sempre pari a 0. Con l’esecuzione
di questo componente software si ottiene come risultato la creazione di un dato numero
di file di testo ossia: viene generato un file di testo (contente una sequenza di nodi
rappresentati dalle relative output band) per ogni possibile valore che può assumere la
43
coppia di parametri (Pc1,Pc2), dove l’insieme di valori che questa coppia può assumere
è rappresentato da: {( Pc1, Pc 2), ( Pc1 + 1, Pc 2 − 1),..., (99,1)} . Questa sequenza di file è
utilizzata per analizzare gli ultimi due algoritmi per la creazione delle reti peer to peer,
poiché questi vengono confrontati analizzando il loro comportamento in termini di:
numero di nodi inseribili, stima del costo delle ristrutturazioni, banda totale residua e
numero di nodi in attesa al variare del parametro Pc1 (si veda la sezione 4.2).
I file sorgenti “NodeSeqGen.java” e “NodeSeqGen1_1.java” sono compilati, a linea di
comando, nel seguente modo:
E:\Tesi_src>javac NodeSeqGen.java
E:\Tesi_src>javac NodeSeqGen1_1.java
Figura 7
I file .class generati da tale compilazione vengono eseguiti nel seguente modo:
E:\Tesi_src>java NodeSeqGen
…
<esecuzione del software>
…
E:\Tesi_src>java NodeSeqGen1_1
…
<esecuzione del software>
Figura 8
…
Questi due componenti software generano dei file di testo caratterizzati dalla seguente
struttura:
NodeSequencePc1=<valore di Pc1>Pc2=<valore di Pc2>.txt
<La prima riga contiene la banda non normalizzata, richiesta dal contenuto>
<La seconda riga contiene l’output band non normalizzata del primo nodo>
<La terza riga contiene l’output band non normalizzata del secondo nodo>
…
<L’n-esima riga contiene l’output band non normalizzata dell’n-esimo nodo>
Figura 9
Esempio di file di testo, generato dai due componenti software appena descritti:
44
NodeSequencePc1=75 Pc2=25.txt
48
32
27
15
…
Figura 10
22
3.2 PRIMO ALGORITMO DI PEER TO PEER: ALGORITMO MAZZINI /
ROVATTI ADATTATO ALLE NUOVE CONDIZIONE DI RETE
Il primo algoritmo, per la creazione di reti peer to peer atte alla diffusione di contenuti, è
derivato dall’algoritmo descritto nel capitolo 2 con adattamento alle nuove condizioni di rete:
i nodi che vogliono accedere alla rete hanno input band sufficiente per acquisire il
contenuto;
ed hanno output band caratterizzate da valori diversi.
Quindi modificando e generalizzando opportunamente le condizioni dell’algoritmo di peer to
peer Mazzini/Rovatti
[9]
si è in grado di inserire nella rete nodi con output band diverse. Le
assunzioni e le ipotesi di questo algoritmo sono le seguenti:
si suppone che la banda richiesta per la diffusione del contenuto sia normalizzata
all’unità;
l’output band dei differenti peer che accedono alla rete è pari a Ωi, per i che va da 1 al
numero di nodi della rete stessa.
Secondo questo algoritmo di inserimento nodi nella rete si considera che: la rete peer to peer di
distribuzione del contenuto è organizzata in "tiers" o file numerate a partire da 1. I peer contenuti
nel primo tier sono alimentati dal nodo sorgente. Mentre i peers del j-esimo tier ricevono il
contenuto solamente dai peer presenti nel (j-1)-esimo tier. Il numero di tiers presenti nella rete di
distribuzione del contenuto è indicato dal parametro T.
Si indica con Pj il numero di peers presenti nel j-esimo tier. Considerando che la banda del
contenuto è normalizzata all'unità allora la banda complessiva richiesta per distribuire il contenuto
al j-esimo tier è Pj. Mentre considerando che ogni nodo fornisce una output band pari a Ωi (con i
che varia nell’insieme dei nodi della rete) allora l'intera ampiezza di banda messa a disposizione dal
45
Pj −1
j-esimo tier è pari a
∑ Ωi . L'ampiezza di banda fornita in output dal nodo sorgente è data dal
i =0
parametro P1, mentre la banda totale che fornisce il nodo sorgente per alimentare il primo tier è
indicata dal parametro B. Inoltre si suppone che la banda B sia finita.
Il passo elementare, è "l'inserimento di un peer nel j-esimo tier se è possibile" e questa
porzione di codice è indicata con A(j). Un pseodocodice per la procedura A(j) è il seguente:
case j = 1
if ( p1 + 1) < B then p1 + +; else failed
case j = 2, …, T
p j −1 −1
if
∑ Ωi ≥
( p j + 1) then p j + +; else failed
i =0
(somma sui Pj-1 peer
del j-1 – esimo tier)
case j = T+1
pT
if
∑ Ωi ≥ 1 then
pT +1 = 1 ; T++; else failed
i =0
(somma sui PT peer
del T – esimo tier)
Figura 11
L’algoritmo che effettua l’inserimento di un nuovo peer nella rete è rappresentato dal seguente
pseudocodice:
for j=1 to T+1
if A(j) not failed then stop
next
failed
Figura 12
Questo algoritmo prova ad aggiungere il nuovo peer nel tier caratterizzato dal ritardo minimo,
ossia nel tier più vicino possibile al nodo sorgente, in modo tale da soddisfare i vincoli
sull'ampiezza di banda e quindi tale algoritmo viene terminato con insuccesso (fallisce) se non si
46
possono alimentare ulteriori peer da parte dei peer che vi sono nei vari tiers della rete di diffusione
del contenuto.
Gli algoritmi di inserimento nodi nella rete, visti nel capitolo 2, producono una struttura nella
quale ogni nodo alimenta al massimo due ulteriori nodi nel tier successivo; mentre nell’algoritmo
descritto in questo capitolo non vi è questa limitazione poiché i nodi che accedono alla rete possono
avere una output band superiore all’unità (ossia superiore alla banda richiesta dal contenuto
normalizzata a 1).
Questo algoritmo è sub-ottimo nel numero di peer serviti. Infatti, si potrebbe racimolare
l'output band non utilizzata dai differenti tier per alimentare un nuovo nodo o in alternativa si
potrebbe fare la seguente considerazione: data una sequenza di nodi con output band diverse, questi
nodi accedono successivamente alla rete e questa accetta nodi finché l’ultimo tier che ha banda a
disposizione è in grado di alimentare un nuovo nodo; quindi la rete non è più in grado di accettare
nodi quando l’ultimo tier disponibile non ha una banda sufficiente (ossia ≥ 1) in grado di alimentare
un nuovo nodo.
Quindi in questo caso si può notare che:
1.
data una sequenza di nodi con le seguenti output band: B1, B2, … , Bn con
B1<B2<…<Bn≤Bc=1 allora si suppone che il numero massimo di nodi che la rete è in
grado di accettare sia pari a K;
2.
se invece si considerano gli stessi nodi con le stesse output band ma con una sequenza
di accesso dei nodi alla rete tale per cui vengono inseriti prima i peer con output band
maggiore, ossia se i nodi con bande di output maggiori vanno a finire nei tiers più
vicini al nodo sorgente, allora si verifica che il numero massimo di nodi che la rete
peer to peer è in grado di accettare risulterà essere > K o al più uguale a K.
In questo modo la situazione ideale sarebbe quella di avere un algoritmo che inserisca, di volta
in volta, il nuovo nodo nella rete, determinando in che tier inserirlo in base alla sua output band. Per
tale motivo è stato ideato l’algoritmo descritto nella sezione 3.3.
3.3 SECONDO
ALGORITMO
RISTRUTTURAZIONE
DI
LOCALE
PEER
DELLA
TO
RETE
PEER
CON
CON
BLOCCO
ALL’INGRESSO
Il secondo algoritmo per la creazione di reti peer to peer derivata dal primo algoritmo
presentato con l’aggiunta di un’eventuale ristrutturazione locale, nel caso dell’inserimento di un
nuovo nodo.
47
In questo algoritmo si cercano di risolvere le limitazioni che affliggono il primo algoritmo
presentato in questo capitolo ed ha il seguente comportamento: dato un nodo con output band pari a
Bj allora tale nodo viene inserito:
nel primo tier se Bj è superiore al output band del peer avente banda minima per tale
tier;
altrimenti il nodo viene inserito nel tier avente output band minima < Bj ed avente
output band minima del tier precedente ≥ Bj.
Per notazione il tier dove viene inserito il nodo considerato viene indicato come tier i-esimo.
Quindi in questa situazione se, per i requisiti di banda del i-esimo tier il nodo da inserire può
essere direttamente inserito nell’i-esimo tier stesso allora lo si inserisce senza effettuare
ristrutturazioni della rete.
Se invece nel tier i-esimo non possono essere inseriti ulteriori nodi, per i requisiti di banda
(poiché la banda disponibile nel tier i-esimo è inferiore all’unità), allora si determina il nodo Nm
avente banda in output minima presente nel tier i-esimo, lo si estrae dal tier e lo si sostituisce con il
nuovo nodo.
In questo modo il nodo Nm estratto viene inserito nel tier successivo, inserendolo direttamente
pi −1
nel tier se vi è posto (ossia se ∑ Ω k ≥ ( pi +1 + 1) ), altrimenti si determina il nodo avente output band
k =0
minore, in tale tier, e questo viene sostituito con il nodo Nm. Tale procedura ricorsiva si termina se:
1.
il nodo che deve essere inserito nel tier a cui si è giunti può essere inserito
direttamente (senza ristrutturazione locale) poiché i requisiti di banda lo consentono;
2.
oppure se si giunge all’ultimo tier e si riesce ad inserire il nodo prelevato dal tier
precedente, poiché per l’ultimo tier sono garantiti i requisiti di banda richiesti dal
contenuto multimediale (ossia banda totale in upload dell’ultimo tier ≥ 1);
3.
oppure se la rete non è in grado di accettare più nodi; ciò si verifica se, con la
procedura ricorsiva, si giunge all’ultimo tier e se per questo non sono garantiti i
requisiti di banda richiesti dal contenuto multimediale (ossia output band totale
dell’ultimo tier < 1). Quindi a causa di tale evento prima di effettuare l’inserimento si
controllano tutte le condizioni sui requisiti di banda che vengono considerate a causa
dell’inserimento ricorsivo dei nodi.
L’algoritmo di inserimento in pseudocodice auto commentato è il seguente:
48
int insertNodeInTiers(Nodo n,int B,int Bc,Vector tiers)
{//procedura che restituisce -1 se l’inserimento fallisce, mentre restituisce il costo complessivo
//della ristrutturazione (≥0) che si può verificare a seguito dell’inserimento del nuovo nodo
int T=tiers.size();
/*(1) si deve determinare in che tier dei T tiers inserire il nodo*/
int posTier=-1; //posizione del tier dove inserire il nuovo nodo e va da 1 a T+1
//occorre notare che pero' i tier hanno indice da 0 a T
for (int j=1;j<=T+1;j++)
{ posTier=functionB(j,n,B,Bc,tiers);
if (posTier!=-1)
{/*posizione trovata*/
break; }//end if
}//end for
// inserimento del nuovo nodo nell’ultimo tier
if (posTier==(T+1)) {
return functionAA(T+1,n,B,Bc,tiers,0);
}//end if
//altrimenti si inserisce il nuovo nodo nel tier di poszione posTier-1
//e se non c'e' posto in posTier si sposta il nodo con output band minima di tale tier
//nel tier successivo e si inserisce il nuovo nodo nel tier considerato,
//tale procedura si ripete in maniera ricorsiva (functionAA)
//--- per determinare se tale inserimento va a buon fine si utilizza una procedura che
//--- testa ricorsivamente l'inserimento del nodo nel tier considerato (posTier-1)
//--- e se necessario effettua un test ricorsivo ossia: se il tier dove viene
//--- inserito il nuovo nodo è pieno allora si stabilisce se il nodo con output band
//--- minima può essere inserito nel tier successivo e così via in maniera ricorsiva
int incrementoBanda=0; //incremento di banda iniziale per il tier successivo
// a causa del test di inserimento di un nuovo nodo nel tier corrente
boolean result=testInsert(posTier,n,B,Bc,tiers,incrementoBanda);
if (result==true) {//allora l'inserimento può essere effettuato poiche' non si genera la
// saturazione della rete ossia la rete è in grado di accettare ulteriori nodi
return functionAA(posTier,n,B,Bc,tiers,0); //l’ultimo parametro di questa
//procedura è un parametro iniziale di conteggio che rappresenta il costo totale delle
//ristrutturazioni che si hanno a seguito dell'inserimento del nodo
}//end if
else{
/*se invece la funzione di testInsert da esito negativo allora la rete è satura e
quindi return -1*/ return -1; }//end else
Figura 13
}
49
/* Procedura che determina in che tier inserire il nuovo Nodo (con tiers numerati da 1 a T) */
int functionB(int j,Nodo n,int B,int Bc,Vector tiers)
{int T=tiers.size();
if (j==1) {//si determina se il nodo ha una output band maggiore della banda minima del
//primo tier o 0-esimo tier (in OR con il vincolo di banda)
if(((Output Band Minima del (j-1)-esimo tier)<n.getUploadBand()) OR ( Bc ⋅ ( p 0 + 1) < B ))
{ /*se è soddisfatta questa condizione allora si restituisce j*/ return j; }
else{/*il tier ha banda minima di output >= a quella del nodo considerato e quindi tale tier non
va bene per inserire il nuovo nodo*/ return -1; }//end else
}else
if ((j>=2)&&(j<=T))
{/*j-1 varia dal tier 1-esimo a (T-1)-esimo: si determina se il nodo ha output band maggiore
della output band minima del tier (corrente) j-1-esimo e minore o uguale al massimo tra l’output
band minima del tier precedente e l’output band massima del tier corrente*/
int minTierPrec=<Output band Minima del tier precedente, (j-2)-esimo>;
int maxTierCurr=<Output band massima del tier corrente, (j-1)-esimo>;
int maxBandTier=max(minTearPrec,maxTearCurr);
if ( (((Output Band Minima del (j-1)-esimo tier)<n.getUploadBand()) &&
p j − 2 −1
(n.getUploadBand()<=maxBandTier) ) || (
∑ Ωi ≥
Bc ⋅ ( p j −1 + 1) ) )
i =0
{/*se è soddisfatta la condizione allora si restituisce il numero del tier dove inserire il
nodo che è pari a j*/ return j; }//end if
else{/*il tier ha output band minima ≥ di quella del nodo considerato e quindi tale tier
non va bene per inserire il nuovo nodo*/ return -1;
}//end else
}//end if
else if (j==(T+1))
{/*quindi se si è giunti al T+1-esimo tier allora il nodo deve essere aggiunto ad un nuovo tiers
che è il (T+1)-esimo*/ return T+1;
}//end if
return -1; //si giunge qua in fondo solo in caso di errore
}
Figura 14
50
int functionAA(int j,Nodo n,int B,int Bc,Vector tiers,int CostoRicIn)
{int T=tiers.size();
if (j==1){//si testa la condizione relativa ai requisiti di banda sul primo tier o 0-esimo tier
if ( Bc ⋅ ( p 0 + 1) < B )
{
<allora si aggiunge il Nodo n nel primo tier o 0-esimo tier>
return CostoRicIn+0; //inserimento effettuato con successo
}
else{/* se la condizione sui requisiti di banda non è soddisfatta allora si estrae il nodo
con output band minima e si aggiunge il nuovo nodo nel primo tier*/
Nodo nodoRimosso=<nodo avente output band minima presente nel tier (j-1)-esimo>;
<si elimina il nodo avente output band minima dal tier (j-1)-esimo>
int CostoRist = <N° Nodi padri del nodoRimosso> + <N° Nodi figli del nodoRimosso>;
<si sostituisce il nodoRimosso con il nuovo nodo n imponendo che n abbia come nodi
padri quelli del nodoRimosso e come nodi figli quelli del nodoRimosso stesso>
/* si imposta la banda residua che può fornire il nodo n ad ulteriori successivi nodi */
<Output band residua del nodo n> = <Output band totale disponibile del nodo n> –
(<Output band totale disponibile del nodo Rimosso> – <Output band residua del
nodoRimosso>);
nodoRimosso.emptyLists(); /*Svuotamento della lista dei padri del nodoRimosso*/
<Output band residua del nodoRimosso> = <Output band totale disponibile del nodo
rimosso>; /*si restituisce al nodoRimosso tutta la banda che può fornire*/
<(a) scansione del tier precedente considerando che: per ogni nodo del tier precedente,
nella lista dei figli di tale nodo si deve sostituire l'Id del nodoRimosso con l’Id del nuovo
nodo n >
<b) scansione del tier successivo (se c'e') considerando che: per ogni nodo del tier
successivo, nella lista dei padri di tale nodo si deve sostituire l'Id del nodoRimosso
con l'Id del nuovo nodo n>
/*si aggiunge il nuovo nodo al tier j-esimo (o j-1 esimo in base, da dove parte l'indice)*/
((Tier) tiers.elementAt(j-1)).add(n);
/* si reinvoca ricorsivamente la functionAA relativamente al nodoRimosso e
relativamente al tier successivo j+1 */
return functionAA(j+1,nodoRimosso,B,Bc,tiers,CostoRist+CostoRicIn);
}//end else
Figura 15
}//end if
51
else if ((j>=2)&&(j<=T))
{//si testa la condizione relativa ai requisiti di banda sul (j-1)-esimo tier
p j − 3 −1
if (
∑ Ωi ≥
Bc ⋅ ( p j −1 + 1) ){<allora si aggiunge il Nodo n nel (j-1)-esimo tier stabilendo i
i =0
suoi nodi padri presenti nel tier precedente, (j-2)-esimo>
return CostoRicIn+0; //inserimento effettuato con successo
}
else{/* se la condizione sui requisiti di banda non è soddisfatta allora si estrae il nodo
con output band minima e si aggiunge il nuovo nodo nel tier (j-1)-esimo*/
Nodo nodoRimosso=<nodo avente output band minima presente nel tier (j-1)-esimo>;
<si elimina il nodo avente output band minima dal tier (j-1)-esimo>
int CostoRist = <N° Nodi padri del nodoRimosso> + <N° Nodi figli del nodoRimosso>;
<si sostituisce il nodoRimosso con il nuovo nodo n imponendo che n abbia come nodi
padri quelli del nodoRimosso e come nodi figli quelli del nodoRimosso stesso>
/*si imposta la banda residua che può fornire il nodo n ad ulteriori successivi nodi */
<Output band residua del nodo n> = <Output band totale disponibile del nodo n> –
(<Output band totale disponibile del nodo Rimosso> – <Output band residua del
nodoRimosso>);
nodoRimosso.emptyLists(); /*Svuotamento della lista dei padri del nodoRimosso*/
<Output band residua del nodoRimosso> = <Output band totale disponibile del nodo
rimosso>; /*si restituisce al nodoRimosso tutta la banda che può fornire*/
<(a) scansione del tier precedente considerando che: per ogni nodo del tier precedente,
nella lista dei figli di tale nodo si deve sostituire l'Id del nodoRimosso con l’Id del nuovo
nodo n >
<b) scansione del tier successivo (se c'e') considerando che: per ogni nodo del tier
successivo, nella lista dei padri di tale nodo si deve sostituire l'Id. del nodoRimosso
con l'Id del nuovo nodo n>
/*si aggiunge il nuovo nodo al tier j-esimo (o j-1 esimo in base, da dove parte l'indice)*/
((Tier) tiers.elementAt(j-1)).add(n);
/*si reinvoca ricorsivamente la functionAA relativamente al nodoRimosso e
relativamente al tier successivo j+1*/
return functionAA(j+1,nodoRimosso,B,Bc,tiers,CostoRist+CostoRicIn);
}//end else
Figura 16
}//end if
52
else if (j==(T+1))
{/*si testa la condizione relativa ai requisiti di banda per poter allocare un nuovo tier nel quale
inserire il nodo n*/
/*se l'ultimo tier ossia il tier (T-1)-esimo offre una banda sufficiente a un nuovo utente nel tier T,
da aggiungere, allora si crea il T-esimo tier e si inserisce il nuovo nodo in esso ossia:*/
pT −1
if ( ∑ Ωi ≥ Bc )
i =0
{
<allora si aggiunge il Nodo n nel T-esimo tier stabilendo i suoi nodi padri presenti
nel tier precedente, (T-1)-esimo>
return CostoRicIn+0; //inserimento effettuato con successo
}
else
{ /* se il vincolo di banda non è soddisfatto allora l’inserimento del nuovo nodo non ha
successo e di conseguenza la rete non è in grado di accettare ulteriori nodi */
return -1;
}//end else
}//end if
}//fine procedura
Figura 17
Il fatto che il nuovo nodo venga inserito in un tier sostituendo il nodo a banda minima del tier
considerato con il nuovo nodo stesso, rappresenta una situazioni di ristrutturazione locale della rete
che si propaga eventualmente ai tier successivi.
Il costo della ristrutturazione o sostituzione di due nodi viene stimata nel seguente modo:
[Stima del costo di ristrutturazione] = [(1)° di nodi padri del nodo da sostituire] + [(2) °
di nodi figli del nodo da sostituire]
Figura 18
Dove:
(1) = “ si stima il numero di comunicazioni verso i nodi padri necessarie per indicare che
il nodo figlio è cambiato con il numero di nodi padri del nodo da sostituire”;
(2) = “si stima il numero di comunicazioni verso i nodi figli necessarie per indicare che il
nodo padre è cambiato con il numero di nodi figli che ha il nodo da sostituire”.
Il costo totale della ristrutturazione relativa all’inserimento di un nuovo nodo è dato dalla
somma delle stime dei costi di ristrutturazione che si hanno a causa:
53
dell’inserimento del nuovo nodo in un tier con eventuale sostituzione del nodo a banda
minima con il nuovo nodo stessa;
e a causa della propagazione degli inserimenti, con eventuale sostituzione, dei nodi
estratti dai tier successivi a quello in cui è stato inserito il nuovo nodo.
In altri termini: considerando che il costo di una sostituzione è pari alla somma tra il numero
dei nodi figli ed il numero dei nodi padri del nodo che sostituisco con quello nuovo o con quello a
banda minima proveniente dal tier precedente, allora il costo complessivo dell’inserimento di un
nuovo nodo è dato dalla somma di tutti questi costi di sostituzione, necessari per portare a termine
l’inserimento del nuovo nodo.
Quindi tale costo è calcolato ricorsivamente, se vi sono dei nodi da fare scorrere nei tier
successivi a causa dell'inserimento del nuovo nodo; in questi termini, il costo dell’inserimento del
nuovo nodo con ristrutturazioni è dato dalla somma dei costi di tutte le sostituzioni che si devono
effettuare per portare a termine l’inserimento.
Per permettere il calcolo del costo dello scambio di due nodi, per ogni nodo si mantiene:
la lista dei nodi da cui riceve il contenuto multimediale;
e la lista dei nodi a cui fornisce il contenuto.
In questo modo si stima il costo dello scambio di due nodi come la somma del numero di nodi
padri con il nodi figli, che il peer da sostituire deve interpellare per indicargli il nuovo nodo che lo
sostituisce ossia:
[Costo dello scambio] = [N° nodi padri] + [N° nodi figli]
Indicando con Ci l’i-esimo scambio, necessario per poter inserire il nuovo nodo nella rete,
allora il costo totale di queste sostituzioni è pari a:
[Costo Totale della ristruttur azione ] = ∑ Ci ,per i che varia su tutti gli scambi effettuati.
i
Questo algoritmo presenta, rispetto al primo algoritmo, un possibile aumento del numero di
nodi inseribili nella rete a scapito di un onere rappresentato dal costo delle varie ristrutturazioni
locali della rete che potenzialmente si possono verificare ad ogni inserimento.
Sia nel primo algoritmo che nel secondo algoritmo presentato vale la seguente considerazione:
siccome inserendo un nodo in un tier si considera solo la banda ancora disponibile del solo tier
precedente e non l’intera banda disponibile di tutta la rete allora, se la banda del tier precedente non
è sufficiente e se la procedura di inserimento ricorsivo dei nodi sostituiti fallisce si verifica che il
nuovo nodo non è inseribile anche se la banda totale disponibile di tutti i tier è ≥ 1 ossia
teoricamente la rete sarebbe in grado di alimentare un nuovo nodo; per capire meglio questa
considerazione è sufficiente considerare il seguente esempio:
54
Tier 1 BandaDisponibile1 < 1
Tier 2 BandaDisponibile2 < 1
…
Tier n BandaDisponibilen < 1
Figura 19
Quindi in questo caso la rete non è in grado di accettare più nodi anche se:
BtotaleDisponibile = BandaDispnobile1 + … + BandaDispnobilen ≥ 1
Figura 20
ossia anche se teoricamente la rete sarebbe in grado di alimentare almeno un nodo in più.
Quindi per eliminare questo problema è stato introdotto il terzo algoritmo per la creazione di
reti peer to peer.
3.4 TERZO ALGORITMO SENZA RISTRUTTURAZIONE LOCALE
Il terzo algoritmo è ottenuto considerando che si potrebbe racimolare l'output band non
utilizzata dai differenti tier per alimentare un nuovo nodo anche se la strutturazione in tier della rete
non consentirebbe l’inserimento di un nuovo peer.
In questo algoritmo di peer to peer l’inserimento di nuovi nodi nella rete è effettuato senza la
ristrutturazione locale della rete stessa.
Quindi per eliminare il problema di cui è affetto il secondo algoritmo è stato introdotto il terzo
algoritmo nel quale:
la rete è rappresentata da una lista di nodi, dove ogni nodo è caratterizzato da un
identificativo (coincidente con la posizione del nodo nella lista), dalla sua output band
disponibile e la lista degli identificativi dei nodi figli;
inizialmente, nella lista dei nodi vi è solo il nodo sorgente, avente identificativo pari a 0
(essendo in posizione 0 della lista dei nodi che formano la rete);
nel momento in cui si inserisce un nuovo nodo N, questo richiede, ai nodi presenti nella
rete, un quantitativo di banda in modo da raggiungere la banda richiesta dal contenuto
cioè:
o il nuovo nodo scandisce la sequenza dei nodi della lista, a partire dal primo,
chiedendo ad ogni nodo a cui giunge:
1. il massimo quantitativo di banda che gli può fornire, se l’output band
disponibile del nodo è inferiore al quantitativo di banda richiesta dal
contenuto non ancora ottenuto;
55
2. oppure solo il quantitativo di banda richiesta dal contenuto non ancora
ottenuto, se l’output band disponibile del nodo è superiore al
quantitativo di banda richiesta dal contenuto non ancora ottenuta;
o tale scansione termina quando:
1. il nuovo nodo N ha racimolato il quantitativo di banda richiesta per
ottenere il contenuto e conseguentemente viene aggiunto alla rete; quindi
in questo caso, i nodi della rete che forniscono della banda al nuovo
nodo, lo aggiungono alla lista dei propri figli e decrementano la loro
banda disponibile del quantitativo di banda che hanno fornito al nodo N;
2. oppure quando il nuovo nodo ha scandito tutta la lista dei nodi ma non
ha racimolato la banda richiesta dal contenuto e quindi la rete non è più
in grado di accettare il nuovo peer.
I vantaggi del terzo algoritmo, rispetto al secondo, sono i seguenti:
nel caso di inserimento di un nuovo nodo non vi sono possibili ristrutturazioni locali
della rete peer to peer;
nel caso in cui la rete non è in grado di accettare più nodi, la banda totale disponibile di
essa è sempre inferiore all’unità (ossia alla banda richiesta dal contenuto normalizzata a
1); per vedere tale fenomeno si vedano gli esempi descritti nel capitolo 4.
Lo svantaggio che si ha nel terzo algoritmo è dovuto al fatto che: modificando,
opportunamente,
l’algoritmo 3 di modo che l’inserimento dei nodi venga effettuato con una
eventuale ristrutturazione locale della rete, si ottiene un nuovo algoritmo che consente di aumentare
il numero massimo di nodi inseribili nella rete, a scapito di un onere dovuto alle ristrutturazioni.
3.4.1 DESCRIZIONE DETTAGLIATA DELL’ALGORITMO 3
Il terzo algoritmo gestisce l’inserimento di un nuovo nodo nella rete con le seguenti modalità:
ogni volta che vi è un nuovo nodo da inserire nella rete si verifica che tale peer interpella
successivamente tutti i nodi della rete finché non racimola tutta la banda che desidera, dove la
banda desiderata è pari alla banda richiesta dal contenuto.
Il terzo algoritmo è caratterizzato dalle seguenti strutture dati:
struttura dati nodo che contiene:
o l’output band complessiva che fornisce tale nodo (OutputBandTotale);
o l’output band attualmente disponibile, che è data dalla differenza tra l’output
band complessiva del nodo e quella che sta attualmente servendo ai propri nodi
figli (OutputBandDisponibile);
56
o la lista degli identificativi dei nodi figli, dove l’identificativo di un nodo
coincide con la posizione del nodo nella lista dei nodi che costituiscono la rete
peer to peer;
lista L dei nodi della rete peer to peer: ogni elemento di questa struttura dati è di tipo
nodo;
struttura dati che rappresenta un nodo padre che contiene:
o l’identificativo del nodo padre, che rappresenta la posizione di tale nodo nella
lista L;
o quantitativo di output band che il nodo padre fornisce al nuovo nodo N;
lista Lp dei nodi padri: ogni elemento di questa struttura dati è di tipo nodo padre.
Questa lista contiene le caratteristiche dei nodi padri del nuovo nodo da inserire.
Quindi nel terzo algoritmo di creazione della rete peer to peer adottata per la diffusione di
contenuti, si hanno le seguenti strutture dati ed ipotesi:
lista L dei nodi contenuti nella rete: tale lista viene inizializzata con il solo nodo
sorgente, prima di inserire un qualunque peer nella rete;
sia il nuovo nodo da inserire nella rete peer to peer;
sia Lp la lista che conterrà i nodi pari del nodo N: prima di eseguire l’algoritmo di
inserimento del nuovo nodo N, questa lista viene inizializzata a lista vuota;
si suppone che Bc sia la banda non normalizzata richiesta dal contenuto da diffondere;
si suppone di avere una variabile Br che rappresenta la banda totale che il nuovo nodo
N deve racimolare per riuscire ad acquisire il contenuto desiderato. Quindi Br viene
inizializzata al valore Bc;
si suppone di avere una variabile booleana denominata trovato che assume valore
“true” solamente quando il nodo N è riuscito ad acquisire, dai nodi correntemente
presenti nella rete, un quantitativo sufficiente di banda per ottenere il contenuto
richiesto (ossia quando Br diventa pari a 0). Quindi prima di eseguire l’algoritmo di
inserimento di un nuovo nodo tale variabile è inizializzata a false;
sia n il numero di nodi presenti nella rete, ossia il numero di elementi presenti nella
lista L.
Con queste ipotesi l’algoritmo di inserimento di un nuovo nodo nella rete è rappresentato dal
seguente pseudocodice:
57
for (int i=0;i<n;i++) //ossia per ogni nodo Ni appartenente a L
{
if (Ni.OutputBandDisponibile≥Br) then
{ Lp = Lp ∪ {(i, Br )}; //dove Br è la banda che il nodo Ni fornisce al nodo N
//ed i rappresenta l’identificativo del nodo Ni
trovato=true;
Br=0;
break;
//uscita dal ciclo di scansione dei nodi avendo trovato
//tutta la banda richiesta
}
else if (Ni.OutputBandDisponibile<Br)AND(Ni.OutputBandDisponibile!=0) then
{//Ni fornisce tutta la banda che ha al nodo N quindi:
Lp = Lp ∪ {(i, i.OutputBandDisponibile)};
Br = Br – Ni.OutputBandDisponibile;
}//end else
}//end for
if (trovato==false) then <La rete non è in grado di accettare il nuovo nodo non avendo a
disposizione banda a sufficienza (ossia la banda totale disponibile è inferiore a Bc)>
else //ossia trovato uguale a true
{
<allora il nuovo nodo N è inseribile nella rete e quindi lo si inserisce attraverso la seguente
procedura>
< 1) inserimento del nodo nella rete:>
L = L ∪ {( Identifica tivo odo , Output band fornita dal nodo )};
//dove l’identificativo del nodo N è n, che rappresenta il numero di nodi presenti nella lista
// L
n++;
< 2) scansione della lista Lp dei nodi padri: “per ogni nodo padre si aggiunge N come figlio
e conseguentemente si decrementa la banda che ha a disposizione tale nodo padre in
base alla banda che gli fornisce al nodo N”>
for (k=0;k<Lp.size();k++) //dove Lp.size() = “è il numero di elementi della lista dei padri”
{
L.elementAt(Lp.elementAt(k).Id()).ListaFigli.add(Indetificativo_del_nodo_N);
58
/* Si aggiunge alla lista dei nodi figli, del nodo avente come posizione nella lista L
l’identificativo del k-esimo nodo padre di N, il nodo N stesso. In altri termini si
inserisce l’identificativo del nodo N nella lista dei nodi figli del k-esimo nodo padre
di N*/
L.elementAt(Lp.elementAt(k).Id()).OutputBandDisponibile=Lp.elementAt(k).OutputBand;
/*Si decrementa l’output band che fornisce il k-esimo nodo padre del quantitativo
di banda che tale nodo fornisce al nuovo nodo N*/
}//end for
}//end else
Questo algoritmo effettua l’inserimento di un nuovo nodo N, determinando i nodi, presenti
attualmente nella rete, che possono fornire al peer N il quantitativo di banda necessario per poter
acquisire il contenuto diffuso in questa rete peer to peer. Per fare ciò, si scandiscono tutti i nodi
della rete al fine di racimolare la banda necessaria al nodo N:
ciclo di scansione della lista dei nodi della rete: per ogni nodo Ni appartenente alla lista
L dei nodi della rete si effettuano i seguenti controlli:
o se la banda fornita dal nodo Ni è maggiore o uguale alla banda richiesta dal
nodo N allora si aggiunge nella lista dei nodi padri la coppia rappresentata
dall’identificativo del nodo Ni (che rappresenta la posizione di tale peer nella
lista L) e dalla banda che tale nodo fornisce ad N (in questo caso il nodo Ni
fornisce ad N tutta la banda di cui ha bisogno N stesso). Siccome tutta la banda
che il nodo N richiedeva è stata fornita dal peer Ni allora termina il ciclo di
scansione dei nodi presenti nella lista L. Inoltre viene posta la variabile trovato
al valore “true” per indicare che il nodo N è riuscito ad acquisire, dai nodi
correntemente presenti nella rete, un quantitativo sufficiente di banda per
ottenere il contenuto richiesto (ossia quando Br diventa pari a 0);
o se invece la banda disponibile che il nodo Ni può fornire non è nulla ed è
inferiore a quella richiesta dal nodo N (ossia è < Br) allora Ni fornisce ad N
tutta la banda che ha a disposizione. In questo modo si aggiunge nella lista dei
59
nodi padri la coppia rappresentata dall’identificativo del nodo Ni (che
rappresenta la posizione di tale peer nella lista L) e dalla banda che tale nodo
fornisce ad N (in questo caso il nodo Ni fornisce ad N tutta la banda che ha a
disposizione). Siccome in questa situazione il nodo N non è ancora riuscito ad
ottenere il quantitativo di banda necessario per acquisire il contenuto allora è
necessario continuare la scansione dei nodi presenti nella lista L.
se all’uscita del ciclo di scansione della lista dei nodi presenti nella rete la variabile
booleana trovato ha valore false allora la rete non è in grado di accettare il nuovo nodo,
poiché la banda totale disponibile della rete è inferiore alla banda richiesta per la
diffusione del contenuto;
se invece la variabile trovato ha valore true allora si inserisce il nuovo nodo nella lista
L, dei nodi della rete, e si scandisce la lista dei padri di N per effettuare la seguente
operazione: per ogni nodo padre Ni si aggiunge il peer N come figlio e
conseguentemente si decrementa la banda che Ni ha a disposizione di un quantitativo
pari alla banda che fornisce ad N.
3.4.2 SVANTAGGI DELL’ALGORITMO3 E INTRODUZIONE ALL’ALGORITMO4
La ristrutturazione che in questo algoritmo 3 non è impiegata può portare ad aumentare il
numero di nodi inseribili nella rete stessa cioè:
sia Bi l’output band del nuovo nodo da inserire nella rete;
sia BtotDisp l’output band disponibile dell’intera rete (ossia la somma delle output
band residue di tutti i nodi della rete);
se BtotDisp – [La banda del nodo a banda minima della rete] + Bi ≥ 1
(1)
allora il nuovo nodo può essere inserito nella rete con un’opportuna ristrutturazione
anche se l’attuale banda totale disponibile dell’intera rete è < 1.
Quindi questa situazione si verifica se la banda del nuovo nodo è talmente elevata che è in
grado di garantire la condizione (1).
In questo caso se la condizione (1) è verificata allora:
1.
si estrae dalla rete il nodo avente output band minima e lo si sostituisce con il nuovo
nodo Ni;
2.
il nodo estratto o sostituito viene reinserito nella rete secondo la procedura di
inserimento mostrata nella descrizione dell’algoritmo 3.
60
Quindi in base a queste considerazioni viene realizzato l’algoritmo 4. Anche in questo caso il
costo della ristrutturazione locale, dovuto alla sostituzione del nodo a banda minima con quello da
inserire è dato dalla seguente somma:
[Stima del costo di ristrutturazione] = [° di nodi padri del nodo da sostituire] + [° di
nodi figli del nodo da sostituire]
Figura 21
In ogni modo tali ristrutturazioni si verificano più di rado rispetto a quelle che si hanno
nell’algoritmo 2 poiché:
1.
nell’algoritmo 2 ogni volta che si inserisce un nuovo nodo si può verificare una
ristrutturazione locale;
2.
invece nell’algoritmo 4 (che è rappresenta un’evoluzione dell’algoritmo) si verifica
una ristrutturazione locale solamente quando la rete non è più in grado di accettare
nodi, ma il nuovo nodo che vuole accedere alla rete ha una output band talmente
elevata che rende vera la condizione (1), dove questa rappresenta la banda totale
disponibile della rete nel caso in cui nella rete si ha il nuovo nodo al posto del nodo a
banda minima.
3.4.3 NOTA IMPORTANTE
Occorre notare che negli algoritmi 2 e 4, che presentano ristrutturazioni locali, si potrebbe
pensare che:
se la rete non accetta più nodi poiché ha una banda totale disponibile < 1 allora si può
pensare di mettere in attesa tutti i nodi successivi che tentano di accedere alla rete
aspettando che arrivi un nodo che garantisca il verificarsi della condizione (1), ossia di un
nodo che è in grado di aumentare la banda totale disponibile della rete;
quando si verifica tale condizione si inserisce nella rete il nodo a banda elevata (che
verifica la condizione (1)) con ristrutturazione locale e successivamente si provano ad
inserire i nodi in attesa, che erano stati sospesi poiché la banda totale disponibile della
rete prima dell’ultimo inserimento era < 1.
In base a questa considerazione sono nati gli algoritmi 5 e 6.
61
3.5 QUARTO ALGORITMO CON RISTRUTTURAZIONE LOCALE CON
BLOCCO ALL’INGRESSO
Il quarto algoritmo è del tutto analogo a quello precedente con l’aggiunta della ristrutturazione
locale della rete, nel caso in cui l’inserimento di un nuovo nodo può essere effettuato solo
sostituendo il nodo avente output band minima con il nuovo nodo e reinserendo il nodo avente
banda minima. In questo caso si ferma l’inserimento di nuovi nodi, se il nuovo nodo entrante risulta
essere non inseribile nella rete anche con la sostituzione di questo con il nodo a banda di upload
minima. Quando si verifica tale evento il sistema rifiuta l’inserimento di nuovi nodi nella rete anche
se questi potrebbero essere inseriti con ristrutturazione locale.
L’algoritmo 4 ha lo stesso comportamento dell’algoritmo 3, tranne nel caso in cui il nuovo
nodo non è inseribile nella rete poiché questa fornisce un quantitativo di banda inferiore a quello
richiesto dal contenuto. Quindi in questa situazione l’algoritmo 4 si comporta nel seguente modo:
sia Bi l’output band del nuovo nodo da inserire nella rete;
sia BtotDisp l’output band disponibile dell’intera rete (ossia la somma delle output
band residue di tutti i nodi della rete);
se BtotDisp – [La banda del nodo a banda minima della rete] + Bi ≥ 1
(1)
allora il nuovo nodo viene inserito nella rete con un’opportuna ristrutturazione anche se
l’attuale banda totale disponibile dell’intera rete è < 1.
Quindi questa situazione si verifica se la banda del nuovo nodo è talmente elevata che è in
grado di garantire la condizione (1).
In questo caso se la condizione (1) è verificata allora:
1.
si estrae dalla rete il nodo avente output band minima e lo si sostituisce con il nuovo
nodo Ni;
2.
il nodo estratto o sostituito viene reinserito nella rete secondo la procedura di
inserimento mostrata nella descrizione dell’algoritmo 3.
Se invece la condizione (1) non è verificata allora il sistema non è in grado di accettare ulteriori
nodi.
Anche in questo caso il costo della ristrutturazione locale, dovuto alla sostituzione del nodo a
banda minima con quello da inserire è dato dalla seguente somma:
[Stima del costo di ristrutturazione] = [° di nodi padri del nodo da sostituire] + [° di
nodi figli del nodo da sostituire]
Figura 22
62
3.6 QUINTO ALGORITMO SENZA BLOCCO ALL’INGRESSO
Il quinto algoritmo è derivato dal secondo algoritmo presentato, con l’ipotesi aggiuntiva di non
avere il blocco all’ingresso della rete, ossia si inseriscono tutti i nodi inseribili nella sequenza di
nodi di ingresso scartando quelli non inseribili. Per fare questo si modifica il comportamento del
secondo algoritmo, per quanto riguarda la situazione nella quale il nuovo nodo non è inseribile nella
rete, cioè:
se la rete non accetta più nodi poiché ha una banda totale disponibile < 1, in tutti i suoi
tier, allora si mettono in attesa tutti i nodi successivi che tentano di accedere alla rete,
aspettando che arrivi un nodo che sia in grado di aumentare la banda totale disponibile in
almeno un tier della rete;
quando si verifica tale condizione si inserisce nella rete il nodo a banda elevata con
ristrutturazione locale e successivamente si provano ad inserire i nodi in attesa che erano
stati sospesi.
3.7 SESTO ALGORITMO CON RISTRUTTURAZIONE SENZA BLOCCO
ALL’INGRESSO
Il sesto algoritmo è derivato dal quarto algoritmo presentato con l’ipotesi aggiuntiva di non
avere il blocco all’ingresso della rete, ossia si inseriscono tutti i nodi inseribili nella sequenza di
nodi di ingresso scartando quelli non inseribili.
Per fare questo si modifica il comportamento del quarto algoritmo, per quanto riguarda la
situazione nella quale il nuovo nodo non è inseribile nella rete, cioè:
si consideri la seguente condizione:
BtotDisp – [La banda del nodo a banda minima della rete] + Bi ≥ 1
(1)
se la rete non accetta più nodi poiché ha una banda totale disponibile < 1 allora si
mettono in attesa tutti i nodi successivi che tentano di accedere alla rete aspettando che
arrivi un nodo che garantisca il verificarsi della condizione (1), ossia di un nodo che sia
in grado di aumentare la banda totale disponibile della rete;
quando si verifica tale condizione si inserisce nella rete il nodo a banda elevata (che
verifica la condizione (1)) con ristrutturazione locale e successivamente si provano ad
inserire i nodi in attesa, che erano stati sospesi poiché la banda totale disponibile della
rete prima dell’ultimo inserimento era < 1.
63
Quindi sia nel quinto che nel sesto algoritmo non si giunge mai in una situazione nella quale la
rete non è in grado di accettare nuovi nodi poiché prima o poi giungerà un nodo con output band
sufficientemente elevata da consentire l’inserimento dei nodi sospesi.
64
4 ESEMPI E CONFRONTI
4.1 ALGORITMI 1,2,3 E 4
I vari algoritmi, descritti nel capitolo precedente, sono stati implementati nel linguaggio di
programmazione orientato agli oggetti Java, utilizzando l’ambiente di sviluppo NetBeans. La scelta
del linguaggio di programmazione è ricaduta sul Java poiché consente di avere delle strutture dati
astratte (LinkedList e Vector) che permettono di modellare, in modo veloce ed efficiente, la rete
peer to peer di diffusione del contenuto. In particolare per gli algoritmi 1,2 e 5 sono state utilizzate
le seguenti strutture di dati astratte:
ogni tier della rete viene modellato attraverso una LinkedList che contiene al suo
interno tutti i nodi afferenti a tale tier;
l’insieme di tutti i tier che costituiscono la rete sono contenuti all’interno di un Vector;
per tale struttura dati astratta Vector si ha un metodo (o procedura) che consente
l’inserimento di un nuovo nodo nella rete ossia nel tier opportuno, contenuto nel
Vector;
ogni nodo è a sua volta una struttura dati astratta che contiene (nel caso degli algoritmi
con ristrutturazione locale 2 e 5) al suo interno la lista degli identificativi dei suoi nodi
figli e la lista degli identificativi dei suoi nodi padri. Negli algoritmi 2 e 5, ogni nodo ha
queste due liste per consentire la stima del costo di ristrutturazione locale della rete, e
tale ristrutturazione si verifica nel caso in cui il nodo considerato viene sostituito con il
nuovo nodo da inserire, e ricorsivamente il nodo sostituito viene inserito nel tier
successivo.
Per gli algoritmi 3,4 e 6 sono state utilizzate le seguenti strutture di dati astratte:
una LinkedList che contiene al suo interno la lista di tutti i nodi che fanno parte della
rete peer to peer, ed un metodo che implementa l’algoritmo di inserimento di un nuovo
nodo nella rete;
ogni nodo è a sua volta una struttura dati astratta che contiene al suo interno la lista
degli identificativi dei suoi nodi figli; tale lista è rappresentata attraverso una
LinkedList;
struttura dati ausiliaria di tipo LinkedList Lp, utilizzata solo all’atto dell’inserimento
del nuovo nodo N, per contenere la lista degli identificativi dei nodi padri del peer N. In
questo modo, nella lista dei figli di ogni nodo padre, appartenente alla LinkedList Lp, si
aggiunge il nuovo nodo N al fine di portare a termine l’inserimento del nuovo peer
nella rete.
65
4.1.1 UTILIZZO DEL SOFTWARE IMPLEMENTATO
Sia X una variabile intera che indica il numero dell’algoritmo che si vuole eseguire. Se ad
esempio si vuole eseguire il primo algoritmo, X varrà 1 mentre, se si vuole eseguire il secondo
algoritmo X varrà 2, e così via … .
Tutti gli algoritmi di costruzione delle reti peer to peer adottati per la diffusione di contenuti
sono stati realizzati in ambiente Java. Il file sorgente che contiene l’implementazione dell’algoritmo
X è denominato “AlgoritmoX.java”; la sua compilazione avviene nel seguente modo:
E:\Tesi_src\AlgoritmoX>javac AlgoritmoX.java
Figura 23
Per poter eseguire il file .class, generato dalla compilazione del file sorgente
“AlgoritmoX.java”, è necessario che nella directory che contiene il file .class vi sia anche il file di
testo contente la sequenza di nodi che vogliono accedere alla rete. Tale file può essere generato
eseguendo il componente software NodeSeqGen (visto nella sezione 3.1) nel seguente modo:
E:\Tesi_src>java NodeSeqGen
Figura 24
…
Attraverso tale esecuzione si ottiene un file di testo denominato: “NodeSequencePc1=<valore
di Pc1>Pc2=<valore di Pc2>.txt”. Per poter eseguire l’implementazione dell’algoritmo X è
sufficiente rinominare il file di testo appena creato dandogli come nome “NodeSequence.txt”,
posizionarlo nella directory dell’algoritmo X ed eseguire il seguente comando da console:
E:\Tesi_src\AlgoritmoX>java AlgoritmoX
Figura 25
…
Al termine dell’esecuzione dell’algoritmo si ottiene, sulla console, la tabella dei risultati ed in
particolare si può notare che in tale tabella sono indicati il numero di nodi inseribili nella rete, il
costo delle eventuali ristrutturazioni locali necessarie per effettuare l’inserimento dei nuovi nodi e la
banda totale che può rendere disponibile l’intera rete peer to peer creata, dove tutti questi parametri
sono rappresentati in funzione della banda fornita dal nodo sorgente che varia da 1 a 10.
Nelle sezioni successive di questo capitolo, si spiegano su che basi e su quali parametri
vengono effettuati i confronti tra i vari algoritmi implementati.
66
4.1.2 NUMERO DI NODI INSERIBILI NELLA RETE IN FUNZIONE DELLA
OUTPUT BAND FORNITA DAL NODO SORGENTE
Per gli algoritmi 1,2,3 e 4 si analizza, come primo parametro prestazionale, il numero massimo
di nodi inseribili nella rete in funzione alla output band del nodo sorgente: per fare questo il
componente software (realizzato in Java), che implementa ciascun algoritmo, effettua l’inserimento
dei nodi generati dall’algoritmo specificato nella sezione 3.1 di questa tesi fino a che la rete è in
grado di accettare peer. Tale procedura di inserimento della sequenza di nodi nella rete è ripetuta
per ogni valore che l’output banda del nodo sorgente può assumere nell’insieme {1,2,3,…,10}.
In questo modo, per ogni algoritmo si ottiene una tabella ed un corrispondente grafico nel quale
vi è come variabile indipendente l’ output band del nodo sorgente e come variabile dipendente il
numero massimo di nodi che possono essere inseriti nella rete. Un esempio di tabella contente i
valori di output band, con i relativi valori di “numero massimo di nodi inseribili nella rete” è la
seguente:
Output Band
nodo sorgente
1
2
3
4
5
6
7
8
9
10
N°Nodi 1° algoritmo
3
7
7
14
20
27
27
29
33
36
N°Nodi 2° algoritmo
3
7
9
22
22
26
31
33
36
40
67
N°Nodi 3° algoritmo
3
20
21
24
29
32
34
39
43
47
N°Nodi 4° algoritmo
3
20
23
28
31
33
36
41
46
49
Il grafico associato a tale tabella è il seguente:
Numero Nodi
60
50
Numero Nodi
40
Algoritmo1
30
Algoritmo2
Algoritmo3
20
Algoritmo4
10
0
1
2
3
4
5
6
7
8
9
Banda Nodo Sorgente
10
Figura 26
Le output band della sequenza di nodi che vogliono accedere nella rete, in questo esempio,
sono state generata a mano e non dall’algoritmo di generazione della sequenza di nodi descritto
nella sezione 3.1 .
Occorre notare che la rete non è più grado di accettare ulteriori nodi, specificati nella sequenza
di peer che vogliono accedere alla rete, quando per i suoi vincoli di banda non è possibile inserire
un nuovo nodo in essa.
Inoltre in questa sezione si presentano una serie di esempi relativi al numero massimo di nodi
inseribili nella rete al variare della output band fornita dal nodo sorgente:
68
primo esempio, con output band dei nodi che accedono alla rete da me definiti:
Numero Nodi
60
50
Numero Nodi
40
Algoritmo1
30
Algoritmo2
Algoritmo3
20
Algoritmo4
10
0
1
2
3
4
5
6
7
8
9
10
Banda Nodo Sorgente
Figura 27
secondo esempio, con Pc1=75% Pc2=12% Pc3=13%:
Numero Nodi
140
120
Numero Nodi
100
80
Algoritmo1
Algoritmo2
60
Algoritmo3
Algoritmo4
40
20
0
1
2
3
4
5
6
Banda Nodo Sorgente
69
7
8
9
10
Figura 28
terzo esempio, con Pc1=80% Pc2=12% Pc3=8%:
Numero Nodi
90
80
70
Numero Nodi
60
50
Algoritmo1
Algoritmo2
40
Algoritmo3
30
Algoritmo4
20
10
0
1
2
3
4
5
6
7
8
9
10
Banda Nodo Sorgente
Figura 29
quarto esempio, con Pc1=76% Pc2=14% Pc3=10%:
Numero Nodi
120
100
Numero Nodi
80
Algoritmo1
60
Algoritmo2
Algoritmo3
40
Algoritmo4
20
0
1
2
3
4
5
6
7
Banda Nodo Sorgente
70
8
9
10
Figura 30
quinto esempio, con Pc1=70% Pc2=25% Pc3=5%:
Numero Nodi
60
50
Numero Nodi
40
Algoritmo1
30
Algoritmo2
Algoritmo3
20
Algoritmo4
10
0
1
2
3
4
5
6
7
8
9
10
Banda Nodo Sorgente
Figura 31
sesto esempio, con Pc1=75% Pc2=20% Pc3=5%:
Numero Nodi
140
120
Numero Nodi
100
80
Algoritmo1
Algoritmo2
60
Algoritmo3
Algoritmo4
40
20
0
1
2
3
4
5
6
Banda Nodo Sorgente
71
7
8
9
10
Figura 32
settimo algoritmo, con Pc1=85% Pc2=10% Pc3=5%:
Numero Nodi
30
25
Numero Nodi
20
Algoritmo1
15
Algoritmo2
Algoritmo3
10
Algoritmo4
5
0
1
2
3
4
5
6
7
8
9
10
Banda Nodo Sorgente
Figura 33
ottavo esempio, con Pc1=78% Pc2=14% Pc3=8%:
Numero Nodi
250
Numero Nodi
200
150
Algoritmo1
Algoritmo2
100
Algoritmo3
Algoritmo4
50
0
1
2
3
4
5
6
Banda Nodo Sorgente
72
7
8
9
10
Figura 34
nono esempio, con Pc1=81% Pc2=10% Pc3=9%:
Numero Nodi
50
45
40
Numero Nodi
35
30
Algoritmo1
25
Algoritmo2
20
Algoritmo3
15
Algoritmo4
10
5
0
1
2
3
4
5
6
7
8
9
10
Banda Nodo Sorgente
Figura 35
decimo esempio, con Pc1=81% Pc2=10% Pc3=9%:
Numero Nodi
120
100
Numero Nodi
80
Algoritmo1
60
Algoritmo2
Algoritmo3
40
Algoritmo4
20
0
1
2
3
4
5
6
Banda Nodo Sorgente
73
7
8
9
10
Figura 36
undicesimo esempio, con Pc1=79% Pc2=20% Pc3=1%:
Numero Nodi
30
25
Numero Nodi
20
Algoritmo1
Algoritmo2
Algoritmo3
Algoritmo4
15
10
5
0
1
2
3
4
5
6
7
Banda Nodo Sorgente
8
9
10
Figura 37
dodicesimo esempio, con Pc1=79% Pc2=20% Pc3=1%:
Numero Nodi
70
60
Numero Nodi
50
40
Algoritmo1
Algoritmo2
30
Algoritmo3
Algoritmo4
20
10
0
1
2
3
4
5
6
Banda Nodo Sorgente
74
7
8
9
10
Figura 38
In quest’ultimo esempio si nota che: per il valore di output band, del nodo sorgente, pari a 3 il
numero massimo di nodi inseribili nell’algoritmo 3 è inferiore al numero massimo di nodi inseribili,
nella rete, nell’algoritmo 2; si verifica ciò poiché il secondo algoritmo presenta un inserimento dei
nodi nella rete con una eventuale ristrutturazione locale della rete stessa e quindi ciò fa sì che: con
opportune sequenze di nodi che accedono alla rete si verifica la possibilità di inserire un maggior
numero di nodi applicando l’algoritmo 2, rispetto al numero di nodi inseribili applicando
l’algoritmo 3. Per tale motivo è stato implementato l’algoritmo 4, che è realizzato aggiungendo
all’algoritmo 3 la gestione dell’inserimento di un nodo con eventuale ristrutturazione locale della
rete. Per maggiori dettagli sull’algoritmo 4 si veda la sezione 3.5 .
Un ulteriore considerazione che si può estrarre da questo esempio è la seguente: nell’esempio
si può notare che gli algoritmi 1 e 3 si comportano, quasi, nello stesso modo per quanto riguarda il
numero massimo di nodi inseribili nella rete, quando la banda fornita dal nodo sorgente è pari a 3;
quindi gli algoritmi 1 e 3, che effettuano l’inserimento dei nodi nella rete senza una eventuale
ristrutturazione locale della stessa, hanno lo svantaggio che il numero massimo di nodi inseribili
nella rete dipende dall’ordine con cui i nodi accedono alla rete stessa poiché non riorganizzano
opportunamente la rete quando viene inserito un nuovo nodo. Invece gli algoritmi 2 e 4 sono meno
sensibili a questo problema poiché, potenzialmente, ogni nodo che viene inserito nella rete può
determinare una ristrutturazione locale della stessa; di conseguenza, per tali algoritmi, il numero
massimo di nodi inseribili nella rete è meno sensibile all’ordine con cui i nodi accedono alla rete.
Infatti considerando, la sequenza di nodi dell’esempio 13, con un altro ordine di accesso dei nodi
stessi, si evidenzia che solamente con un opportuno ordine di accesso dei nodi, l’algoritmo 3 ha:
un comportamento simile all’algoritmo 4, rispetto al numero massimo di nodi inseribili nella
rete;
ed un comportamento migliore rispetto all’algoritmo 2, in base al numero di nodi inseribili nella
rete in funzione all’output band del nodo sorgente, cioè:
75
Numero Nodi
70
60
Numero Nodi
50
40
Algoritmo1
Algoritmo2
30
Algoritmo3
20
Algoritmo4
10
0
1
2
3
4
5
6
7
8
9
10
Banda Nodo Sorgente
Figura 39
Inoltre, per poter osservare che gli algoritmi dipendono dall’ordine con cui i nodi accedono alla
rete, possiamo confrontare ogni algoritmo con se stesso, applicandolo a due sequenze che
contengono gli stessi nodi e differiscono solamente per l’ordine con cui i nodi vogliono accedere
alla rete, cioè:
1. primo algoritmo con le due differenti sequenze di nodi:
Numero Nodi Algoritmo 1
60
50
Numero Nodi
40
30
Algoritmo1, Seq. 2
Algoritmo1, Seq. 1
20
10
0
1
2
3
4
5
6
7
Banda Nodo Sorgente
76
8
9
10
Figura 40
2. secondo algoritmo con le due differenti sequenze di nodi:
Numero Nodi Algoritmo 2
60
50
Numero Nodi
40
30
Algoritmo2, Seq. 2
Algoritmo2, Seq. 1
20
10
0
1
2
3
4
5
6
7
8
9
10
Banda Nodo Sorgente
Figura 41
3. terzo algoritmo con le due differenti sequenze di nodi:
Numero Nodi Algoritmo 3
70
60
Numero Nodi
50
40
Algoritmo3, Seq. 2
30
Algoritmo3, Seq. 1
20
10
0
1
2
3
4
5
6
7
Banda Nodo Sorgente
77
8
9
10
Figura 42
4. quarto algoritmo con le due differenti sequenze di nodi:
Numero Nodi Algoritmo 4
70
60
Numero Nodi
50
40
Algoritmo4, Seq. 2
30
Algoritmo4, Seq. 1
20
10
0
1
2
3
4
5
6
7
8
Banda Nodo Sorgente
9
10
Figura 43
Confrontando i vari algoritmi in base al numero massimo di nodi inseribili nella rete si nota
che: l’algoritmo che massimizza il numero di nodi inseribili nella rete è il quarto algoritmo.
4.1.3 BANDA TOTALE RESIDUA DELLA RETE IN FUNZIONE DELLA OUTPUT
BAND FORNITA DAL NODO SORGENTE
Per gli algoritmi 1,2,3 e 4 si analizza, come secondo parametro prestazionale, la banda totale
residua della rete (che si ha quando questa non è più in grado di accettare nuovi nodi) in funzione
della output band del nodo sorgente: per fare questo il componente software (realizzato in Java), che
implementa ciascun algoritmo, effettua l’inserimento dei nodi generati dall’algoritmo specificato
nella sezione 3.1 di questa tesi, fino a che la rete è in grado di accettare peer. Tale procedura di
inserimento della sequenza di nodi nella rete è ripetuta per ogni valore che l’output banda del nodo
sorgente può assumere nell’insieme {1,2,3,…,10}.
La banda totale residua della rete si determina quando la rete non è più in grado di accettare
nuovi nodi e viene calcolata come la somma delle output band residue di tutti i nodi contenuti nella
rete. L’output band residua di un nodo è pari alla differenza tra l’output band totale che il nodo ha a
78
disposizione quando non alimenta alcun nodo, e l’output band che tale nodo sta attualmente
utilizzando per alimentare ulteriori peer.
In questo modo, per ogni algoritmo si ottiene una tabella ed un corrispondente grafico nel quale
vi è come variabile indipendente l’ output band del nodo sorgente e come variabile dipendente la
banda totale residua della rete. Un esempio di tabella contente i valori di output band, con i relativi
valori di banda totale residua è la seguente:
Output Band fornita dal nodo
sorgente
1
2
3
4
5
6
7
8
9
10
BandaDisponibile BandaDisponibile
Algoritmo 1
Algoritmo 2
0,9921875
0,9921875
1,9375
1,9375
2,9375
2,90625
3,78125
1,9609375
3,640625
2,9609375
2,125
2,1328125
3,125
2,25
3,53125
2,1015625
3,1015625
2,078125
3,078125
2,2734375
BandaDisp.
Algoritmo 3
0,9921875
0,640625
0,9921875
0,921875
0,53125
0,8359375
0,921875
0,828125
0,734375
0,7734375
BandaDisp.
Algoritmo 4
0,9921875
0,640625
0,140625
0,21875
0,25
0,1015625
0,078125
0,2734375
0,5234375
0,71875
Il grafico associato a tale tabella è il seguente:
Banda Disponibile
Banda Disponibile
4
3,5
3
2,5
2
1,5
1
0,5
0
Algoritmo1
Algoritmo2
Algoritmo3
Algoritmo4
1
2
3
4
5
6
7
Banda Sorgente
8
9
10
Figura 44
Le output band della sequenza di nodi che vogliono accedere nella rete, in questo esempio,
sono state generata a mano e non dall’algoritmo di generazione della sequenza di nodi descritto
nella sezione 3.1 .
Inoltre in questa sezione si presentano una serie di esempi relativi alla banda totale residua
della rete al variare della output band fornita dal nodo sorgente:
79
primo esempio, con output band dei nodi che accedono alla rete da me definiti:
Banda Disponibile
Banda Disponibile
5
4,5
4
3,5
3
2,5
2
1,5
1
0,5
0
Algoritmo1
Algoritmo2
Algoritmo3
Algoritmo4
1
2
3
4
5
6
7
8
9
10
Banda Sorgente
Figura 45
secondo esempio, con Pc1=75% Pc2=12% Pc3=13%:
Banda Disponibile
7
Banda Disponibile
6
5
4
Algoritmo1
3
Algoritmo2
2
Algoritmo3
1
Algoritmo4
0
1
2
3
4
5
6
Banda Sorgente
80
7
8
9
10
Figura 46
terzo esempio, con Pc1=80% Pc2=12% Pc3=8%:
Banda Disponibile
Banda Disponibile
4,5
4
3,5
3
2,5
2
1,5
1
0,5
0
Algoritmo1
Algoritmo2
Algoritmo3
Algoritmo4
1
2
3
4
5
6
7
8
9
10
Banda Sorgente
Figura 47
quarto esempio, con Pc1=76% Pc2=14% Pc3=10%:
Banda Disponibile
Banda Disponibile
4,5
4
3,5
3
2,5
2
1,5
1
0,5
0
Algoritmo1
Algoritmo2
Algoritmo3
Algoritmo4
1
2
3
4
5
6
Banda Sorgente
81
7
8
9
10
Figura 48
quinto esempio, con Pc1=70% Pc2=25% Pc3=5%:
Banda Disponibile
6
Banda Disponibile
5
4
Algoritmo1
3
Algoritmo2
2
Algoritmo3
1
Algoritmo4
0
1
2
3
4
5
6
7
8
9
10
Banda Sorgente
Figura 49
sesto esempio, con Pc1=75% Pc2=20% Pc3=5%:
Banda Disponibile
8
Banda Disponibile
7
6
5
Algoritmo1
4
3
Algoritmo2
2
Algoritmo3
1
Algoritmo4
0
1
2
3
4
5
6
Banda Sorgente
82
7
8
9
10
Figura 50
settimo algoritmo, con Pc1=85% Pc2=10% Pc3=5%:
Banda Disponibile
3
Banda Disponibile
2,5
2
Algoritmo1
1,5
Algoritmo2
1
Algoritmo3
0,5
Algoritmo4
0
1
2
3
4
5
6
7
8
9
10
Banda Sorgente
Figura 51
ottavo esempio, con Pc1=78% Pc2=14% Pc3=8%:
Banda Disponibile
12
Banda Disponibile
10
8
Algoritmo1
6
Algoritmo2
4
Algoritmo3
2
Algoritmo4
0
1
2
3
4
5
6
Banda Sorgente
83
7
8
9
10
Figura 52
nono esempio, con Pc1=81% Pc2=10% Pc3=9%:
Banda Disponibile
4
Banda Disponibile
3,5
3
2,5
Algoritmo1
2
1,5
Algoritmo2
1
Algoritmo3
0,5
Algoritmo4
0
1
2
3
4
5
6
7
8
9
10
Banda Sorgente
Figura 53
decimo esempio, con Pc1=81% Pc2=10% Pc3=9%:
Banda Disponibile
7
Banda Disponibile
6
5
4
Algoritmo1
3
Algoritmo2
2
Algoritmo3
1
Algoritmo4
0
1
2
3
4
5
6
Banda Sorgente
84
7
8
9
10
Figura 54
undicesimo esempio, con Pc1=79% Pc2=20% Pc3=1%:
Banda Disponibile
Banda Disponibile
3
2
Algoritmo1
Algoritmo2
Algoritmo3
1
Algoritmo4
0
1
2
3
4
5 Sorgente
6
Banda
7
8
9
10
Figura 55
dodicesimo esempio, con Pc1=79% Pc2=20% Pc3=1%:
Banda Disponibile
Banda Disponibile
5
4,5
4
3,5
3
2,5
2
1,5
1
0,5
0
Algoritmo1
Algoritmo2
Algoritmo3
Algoritmo4
1
2
3
4
5
6
Banda Sorgente
7
8
9
10
Figura 56
Confrontando i vari algoritmi in base alla banda totale residua della rete si nota che:
l’algoritmo che minimizza tale banda è il quarto algoritmo.
85
4.1.4 STIMA DEL COSTO DELLE RISTRUTTURAZIONI IN FUNZIONE DELLA
OUTPUT BAND FORNITA DAL NODO SORGENTE
Per gli algoritmi 1,2,3 e 4 si analizza, come terzo parametro prestazionale, la stima del costo
delle ristrutturazioni della rete (che si verificano a causa dell’inserimento di nuovi nodi nella rete
stessa) in funzione della output band del nodo sorgente: per fare questo il componente software
(realizzato in Java), che implementa ciascun algoritmo, effettua l’inserimento dei nodi generati
dall’algoritmo specificato nella sezione 3.1 di questa tesi, fino a che la rete è in grado di accettare
peer. Tale procedura di inserimento della sequenza di nodi nella rete è ripetuta per ogni valore che
l’output banda del nodo sorgente può assumere nell’insieme {1,2,3,…,10}.
La stima del costo delle ristrutturazioni della rete si considera come parametro da analizzare,
quando la rete non è più in grado di accettare nuovi nodi e tale stima viene calcolata come la somma
dei costi di ristrutturazione che vi sono, per ogni nodo che accede alla rete. Il costo della
ristrutturazione della rete causato dall’inserimento di un nuovo nodo è definito nella sezione 3.3.
In questo modo, per ogni algoritmo si ottiene una tabella ed un corrispondente grafico nel quale
vi è come variabile indipendente l’ output band del nodo sorgente e come variabile dipendente la
stima del costo delle ristrutturazioni della rete, che è nello stato in cui non è in grado di accettare
ulteriori nodi. Un esempio di tabella contente i valori di output band, con i relativi valori di stima
del costo delle ristrutturazioni della rete è la seguente:
Output band fornita dal
nodo sorgente
1
2
3
4
5
6
7
8
9
10
Costo della
ristrutturazione Algoritmo
1
0
0
0
0
0
0
0
0
0
0
86
Costo della
ristrutturazione
Algoritmo 2
0
5
5
35
31
32
60
43
57
66
Costo della
ristrutturazione
Algoritmo 3
0
0
0
0
0
0
0
0
0
0
Costo della
ristrutturazione
Algoritmo 4
0
0
4
10
6
5
5
6
8
2
Il grafico associato a tale tabella è il seguente:
Costo delle ristrutturazioni locali
70
60
Costo
50
40
Algoritmo1
30
Algoritmo2
20
Algoritmo3
10
Algoritmo4
0
1
2
3
4
5
6
7
8
9
10
Banda Sorgente
Figura 57
Le output band della sequenza di nodi che vogliono accedere nella rete, in questo esempio,
sono state generata a mano e non dall’algoritmo di generazione della sequenza di nodi descritto
nella sezione 3.1 .
Inoltre in questa sezione si presentano una serie di esempi relativi stima del costo delle
ristrutturazioni della rete al variare della output band fornita dal nodo sorgente:
primo esempio, con output band dei nodi che accedono alla rete da me definiti:
Costo
Costo delle ristrutturazioni locali
100
90
80
70
60
50
40
30
20
10
0
Algoritmo1
Algoritmo2
Algoritmo3
Algoritmo4
1
2
3
4
5
6
Banda Sorgente
87
7
8
9
10
Figura 58
secondo esempio, con Pc1=75% Pc2=12% Pc3=13%:
Costo
Costo delle ristrutturazioni locali
200
180
160
140
120
100
80
60
40
20
0
Algoritmo1
Algoritmo2
Algoritmo3
Algoritmo4
1
2
3
4
5
6
7
8
9
10
Banda Sorgente
Figura 59
terzo esempio, con Pc1=80% Pc2=12% Pc3=8%:
Costo delle ristrutturazioni locali
160
140
120
Costo
100
Algoritmo1
80
60
Algoritmo2
40
Algoritmo3
20
Algoritmo4
0
1
2
3
4
5
6
Banda Sorgente
88
7
8
9
10
Figura 60
quarto esempio, con Pc1=76% Pc2=14% Pc3=10%:
Costo delle ristrutturazioni locali
250
Costo
200
150
Algoritmo1
Algoritmo2
100
Algoritmo3
50
Algoritmo4
0
1
2
3
4
5
6
7
8
9
10
Banda Sorgente
Figura 61
quinto esempio, con Pc1=70% Pc2=25% Pc3=5%:
Costo
Costo delle ristrutturazioni locali
90
80
70
60
50
40
30
20
10
0
Algoritmo1
Algoritmo2
Algoritmo3
Algoritmo4
1
2
3
4
5
6
Banda Sorgente
89
7
8
9
10
Figura 62
sesto esempio, con Pc1=75% Pc2=20% Pc3=5%:
Costo delle ristrutturazioni locali
300
250
Costo
200
Algoritmo1
150
Algoritmo2
100
Algoritmo3
50
Algoritmo4
0
1
2
3
4
5
6
7
8
9
10
Banda Sorgente
Figura 63
settimo algoritmo, con Pc1=85% Pc2=10% Pc3=5%:
Costo delle ristrutturazioni locali
35
30
Costo
25
20
Algoritmo1
15
Algoritmo2
10
Algoritmo3
5
Algoritmo4
0
1
2
3
4
5
6
Banda Sorgente
90
7
8
9
10
Figura 64
ottavo esempio, con Pc1=78% Pc2=14% Pc3=8%:
Costo delle ristrutturazioni locali
700
600
Costo
500
400
Algoritmo1
300
Algoritmo2
200
Algoritmo3
100
Algoritmo4
0
1
2
3
4
5
6
7
8
9
10
Banda Sorgente
Figura 65
nono esempio, con Pc1=81% Pc2=10% Pc3=9%:
Costo delle ristrutturazioni locali
90
80
70
Costo
60
50
Algoritmo1
40
Algoritmo2
30
Algoritmo3
20
Algoritmo4
10
0
1
2
3
4
5
6
Banda Sorgente
91
7
8
9
10
Figura 66
decimo esempio, con Pc1=81% Pc2=10% Pc3=9%:
Costo delle ristrutturazioni locali
250
Costo
200
150
Algoritmo1
Algoritmo2
100
Algoritmo3
50
Algoritmo4
0
1
2
3
4
5
6
7
8
9
10
Banda Sorgente
Figura 67
undicesimo esempio, con Pc1=79% Pc2=20% Pc3=1%:
Costo delle ristrutturazioni locali
12
10
Costo
8
Algori
tmo1
Algori
tmo2
6
4
2
0
1
2
3
4
5
6
Banda Sorgente
92
7
8
9
10
Figura 68
dodicesimo esempio, con Pc1=79% Pc2=20% Pc3=1%:
Costo delle ristrutturazioni locali
120
100
Costo
80
Algoritmo1
60
Algoritmo2
40
Algoritmo3
20
Algoritmo4
0
1
2
3
4
5
6
7
Banda Sorgente
8
9
10
Figura 69
Confrontando i vari algoritmi in base alla stima del costo delle ristrutturazioni della rete, si
nota che: gli algoritmi che minimizzano tale costo sono quelli che effettuano l’inserimento di un
nuovo nodo nella rete senza un’eventuale ristrutturazione della rete stessa; quindi gli algoritmi che
presentano un costo delle ristrutturazioni sempre nullo sono gli algoritmi 1 e 3; tra questi due
algoritmi, quello che massimizza il numero di nodi inseribili e minimizza la banda totale residua
della rete è l’algoritmo 3. Inoltre occorre notare che: di solito tra i due algoritmi (2 e 4), che
effettuano l’inserimento dei nodi nella rete con una eventuale ristrutturazione della rete stessa,
quello che ha un di costo di ristrutturazione minore è l’algoritmo 4.
4.2 ALGORITMI 5 E 6
Gli algoritmi 5 e 6 sono stati realizzati nell’ambiente di programmazione Java, come i
precedenti algoritmi visti.
L’algoritmo 5 è completamente uguale all’algoritmo 2, con la sola differenza che è stata
utilizzata una LinkedList; tale LinkedList contiene la lista dei nodi che sono in attesa di essere
inseriti: quando un nuovo nodo non può essere inserito nella rete, a causa del fatto che l’algoritmo
di inserimento fallisce, esso viene inserito nella lista dei nodi in attesa; solamente quando il nuovo
nodo che vuole accedere alla rete viene inserito nella rete stessa con successo, si verifica che:
l’algoritmo 5 scandisce la lista dei nodi in attesa e prova ad inserire ogni peer presente in tale lista,
togliendolo da questa se l’inserimento va a buon fine.
93
In maniera del tutto analoga l’algoritmo 6 è completamente uguale all’algoritmo 4, con la sola
differenza che è stata utilizzata una ulteriore LinkedList; tale LinkedList contiene la lista dei nodi
che sono in attesa di essere inseriti: quando un nuovo nodo non può essere inserito nella rete, a
causa del fatto che l’algoritmo di inserimento fallisce, esso viene inserito nella lista dei nodi in
attesa; solamente quando il nuovo nodo che vuole accedere alla rete viene inserito nella rete stessa
con successo, si verifica che: l’algoritmo 5 scandisce la lista dei nodi in attesa e prova ad inserire
ogni peer presente in tale lista, togliendolo da questa se l’inserimento va a buon fine.
Confrontando il comportamento di questi due algoritmi, attraverso il numero massimo di
inseribili nella rete, si nota che tale parametro varia relativamente poco in funzione della banda
erogata dal nodo sorgente cioè:
Numero nodi inseribili
650
Numero Nodi
600
550
ALGORITMO 5
500
ALGORITMO 6
450
400
1
2
3
4
5
6
Pc1
7
8
9
10
Figura 70
Quindi si è pensato di considerare i parametri di confronto degli algoritmi in funzione al
parametro Pc1 (che rappresenta la percentuale di nodi, presenti nella sequenza dei peer che
vogliono accedere alla rete, che hanno output band inferiore all’unità), con il valore della banda
fornita dal nodo sorgente costante. Quindi per confrontare i due algoritmi si utilizzano le sequenze
94
di nodi generate dal componente software “NodeSeqGen1_1”, descritto nella sezione 3.1; in questo
modo la sequenza di file, generati da tale componente software, è utilizzata per analizzare gli
algoritmi 5 e 6, in modo tale da poterli confrontare analizzando il loro comportamento in termini di:
numero di nodi inseribili, stima del costo delle ristrutturazioni, banda totale residua e numero di
nodi in attesa al variare del parametro Pc1.
4.2.1 UTILIZZO DEL SOFTWARE IMPLEMENTATO
Sia X una variabile intera che indica il numero dell’algoritmo che si vuole eseguire. Se ad
esempio si vuole eseguire il quinto algoritmo, X varrà 5 mentre, se si vuole eseguire il sesto
algoritmo X varrà 6.
Tutti gli algoritmi di costruzione delle reti peer to peer adottati per la diffusione di contenuti
sono stati realizzati in ambiente Java. Il file sorgente che contiene l’implementazione dell’algoritmo
X è denominato “AlgoritmoX.java”; la sua compilazione avviene nel seguente modo:
Figura 71
E:\Tesi_src\AlgoritmoX>javac AlgoritmoX.java
Per poter eseguire il file .class, generato dalla compilazione del file sorgente
“AlgoritmoX.java”, è necessario che nella directory che contiene il file .class vi siano anche i file di
testo contenti le varie sequenze di nodi che vogliono accedere alla rete. Tale sequenza di file può
essere generata eseguendo il componente software NodeSeqGen1_1 (secondo quanto visto nella
sezione 3.1) nel seguente modo:
E:\Tesi_src>java NodeSeqGen1_1
Figura 72
…
Attraverso tale esecuzione si ottengono un insieme di file di testo denominati:
“NodeSequencePc1=<valore di Pc1>Pc2=<valore di Pc2>.txt”, dove l’insieme di valori che la
coppia
(<valore
di
Pc1>,
<valore
di
Pc2>)
può
assumere
è
rappresentato
da:
{( Pc1iniziale , Pc 2 iniziale ), ( Pc1iniziale + 1, Pc 2 iniziale − 1),..., (99,1)} . Per poter eseguire l’implementazione
del secondo algoritmo è sufficiente posizionare tutti questi file nella directory dell’algoritmo X ed
eseguire il seguente comando da console:
E:\Tesi_src\AlgoritmoX>java AlgoritmoX
Figura 73
…
Eseguendo tale comando, viene mandato in esecuzione il componente software, (relativo
all’algoritmo X), il quale richiede dallo standard input:
95
il valore iniziale di Pc1 e quello iniziale di Pc2 di modo da poter applicare il sesto algoritmo ad
ogni file generato dal software NodeSeqGen1_1;
e il fattore moltiplicativo (intero) k attraverso il quale si fissa l’output band fornita dal nodo
sorgente. Attraverso il parametro k si stabilisce l’output band fornita dal nodo sorgente nel
seguente modo:
[Output Band del nodo sorgente ] = k ⋅ Bc , dove Bc è la banda non
normalizzata richiesta dal contenuto.
Al termine dell’esecuzione dell’algoritmo si ottiene, sulla console, la tabella dei risultati ed in
particolare si può notare che in tale tabella sono indicati: il numero di nodi inseribili nella rete, il
costo delle eventuali ristrutturazioni locali necessarie per effettuare l’inserimento dei nuovi nodi e la
banda totale residua dell’intera rete peer to peer creata, dove tutti questi parametri sono
rappresentati in funzione del parametro Pc1, il quale varia tra il suo valore iniziale ed il 99%.
Nelle sezioni successive di questo capitolo, si spiegano su che basi e su quali parametri
vengono effettuati i confronti tra i vari algoritmi implementati.
4.2.2 NUMERO DI NODI INSERIBILI IN FUNZIONE DELLA PERCENTUALE DI
NODI CHE HANNO OUTPUT BAND < 1 NELLA SEQUENZA DI
INGRESSO
Per gli algoritmi 5 e 6 si analizza, come primo parametro prestazionale, il numero massimo di
nodi inseribili nella rete in funzione del parametro Pc1 (che rappresenta la percentuale di nodi, della
sequenza di peer che accedono alla rete, aventi output band < 1): per fare questo il componente
software (realizzato in Java), che implementa ciascun algoritmo, effettua l’inserimento dei nodi
generati dall’algoritmo specificato nella sezione 3.1 di questa tesi fino a che la rete è in grado di
accettare peer. Tale procedura di inserimento della sequenza di nodi nella rete è ripetuta per ogni
sequenza di nodi, dove tali sequenze sono caratterizzate da un valore del parametro Pc1 che varia
tra il suo valore iniziale e il 99%. In questo modo per ogni valore di Pc1 (e quindi per ogni sequenza
di nodi) viene generata una rete di diffusione del contenuto.
Quindi, per ogni algoritmo si ottiene una tabella ed un corrispondente grafico nel quale vi è
come variabile indipendente il parametro Pc1 e come variabile dipendente il numero massimo di
nodi che possono essere inseriti nella rete. Un esempio di tabella contente i valori del parametro
Pc1, con i relativi valori di “numero massimo di nodi inseribili nella rete” è la seguente:
96
Pc1 N°Nodi Algoritmo 5
75
954
76
906
77
911
78
837
79
856
80
847
81
809
82
856
83
789
84
793
85
721
86
729
87
663
88
626
89
685
90
599
91
607
92
603
93
531
94
461
95
449
96
465
97
391
98
391
99
316
Pc1 N°Nodi Algoritmo 6
75
959
76
912
77
917
78
853
79
861
80
854
81
816
82
862
83
794
84
801
85
731
86
742
87
672
88
640
89
695
90
613
91
614
92
610
93
538
94
468
95
468
96
474
97
409
98
408
99
322
Il grafico associato a tale tabella è il seguente:
Numero nodi inseribili
1200
Numero Nodi
1000
800
600
Algoritmo5
400
Algoritmo6
200
0
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
Pc1
97
Figura 74
Grafico che rappresenta la differenza tra il numero massimo di nodi inseribili nella rete,
applicando il sesto algoritmo, ed il numero massimo di nodi inseribili nella rete, applicando quinto
algoritmo:
Differenza Numero Nodi dei 2 alg.
20
18
16
Differenza numero Nodi
14
12
10
Diff.
8
6
4
2
0
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
Pc1
Figura 75
Le output band della sequenza di nodi che vogliono accedere alla rete, in questo esempio, sono
state generata dall’algoritmo di generazione della sequenza di nodi descritto nella sezione 3.1 .
Occorre notare che la rete non è più grado di accettare ulteriori nodi, specificati nella sequenza
di peer che vogliono accedere alla rete stessa, quando per i suoi vincoli di banda non è possibile
inserire un nuovo nodo in essa, e quindi tale nodo verrà messo nella lista dei nodi in attesa.
Inoltre in questa sezione si presentano una serie di esempi relativi al numero massimo di nodi
inseribili nella rete al variare del parametro Pc1. Nel primo esempio il parametro Pc1 è stato scelto
≥ 75% di modo che la rete tenda alla condizione nella quale non è più in grado di accettare nuovi
nodi, e di modo che l’eventuale inserimento di un nuovo nodo avvenga con la ristrutturazione locale
della rete stessa. Se, invece, la percentuale Pc1 è inferiore al 75% allora può capitare che la rete
accetti tutti i nodi che vogliono accedere alla rete.
98
Primo esempio, avente Pc1 che varia tra 75 e 99 e Pc2 che vari tra 25 e 1. Quindi le reti sono
state ottenute considerando 25 sequenze di nodi, dove in ogni sequenza si hanno 1000 nodi. Pc1
è stato scelto ≥ 75 di modo che la rete sia in condizione di non accettare ulteriori nodi di modo
che l’eventuale inserimento di un nuovo nodo avvenga, solo, con ristrutturazione locale della
rete. Inoltre in questo esempio l’output band fornita dal nodo sorgente è costante e pari a 4:
Numero nodi inseribili
1200
1000
Numero Nodi
800
600
Algoritmo5
Algoritmo6
400
200
0
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
Pc1
99
Figura 76
Differenza numero Nodi
Differenza Numero Nodi dei 2 alg.
20
18
16
14
12
10
8
6
4
2
0
Diff.
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
Pc1
Figura 77
Secondo esempio, avente Pc1 che varia tra 65 e 99 e Pc2 che vari tra 35 e 1. Quindi le reti sono
state ottenute considerando 35 sequenze di nodi, dove in ogni sequenza si hanno 1000 nodi.
Essendo Pc1 ≥ 65%, allora per i valori di Pc1 inferiori al 75%, circa, può accadere che la rete
accetti tutti i nodi della sequenza caratterizzata da tale valore di Pc1. Inoltre in questo esempio
l’output band fornita dal nodo sorgente è costante e pari a 4:
Numero nodi inseribili
1200
1000
Numero Nodi
800
600
Algoritmo5
Algoritmo6
400
200
0
65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99
Pc1
Figura 78
100
Differenza Numero Nodi Inseribili dei 2 alg.
40
Differenza numero Nodi
35
30
25
20
Diff.
15
10
5
0
65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99
Pc1
Figura 79
In questo esempio si può notare che per Pc1= 65% e Pc1= 67% la rete accetta tutti i nodi che
vogliono accedervi.
Terzo esempio, avente Pc1 che varia tra 50 e 99 e Pc2 che vari tra 50 e 1. Quindi le reti sono
state ottenute considerando 50 sequenze di nodi, dove in ogni sequenza si hanno 1000 nodi.
Anche in questo caso, essendo Pc1 ≥ 50%, allora per i valori di Pc1 inferiori al 75%, circa, può
accadere che la rete accetti tutti i nodi della sequenza caratterizzata da tale valore di Pc1. Inoltre
in questo esempio l’output band fornita dal nodo sorgente è costante e pari a 4:
Numero nodi inseribili
1200
Numero Nodi
1000
800
600
Algoritmo5
400
Algoritmo6
200
0
50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98
Pc1
Figura 80
101
Differenza Numero Nodi dei 2 alg.
25
Differenza numero Nodi
20
15
10
Diff.
5
0
50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98
Pc1
Figura 81
In questo esempio si può notare che per valori di Pc1 ≤ 63% , circa, la rete accetta tutti i nodi
che vogliono accedervi.
Confrontando i due algoritmi in base al numero massimo di nodi inseribili nella rete, in
funzione del parametro Pc1, si nota che: l’algoritmo che massimizza il numero di nodi inseribili
nella rete è il sesto.
4.2.3 STIMA DEL COSTO DELLE RISTRUTTURAZIONI LOCALI IN FUNZIONE
DELLA PERCENTUALE DI NODI CHE HANNO OUTPUT BAND < 1
NELLA SEQUENZA DI INGRESSO
Per gli algoritmi 5 e 6 si analizza, come secondo parametro prestazionale, la stima del costo
delle ristrutturazioni locali dovute all’inserimento della sequenza dei nodi d’ingresso, in funzione
del parametro Pc1 (che rappresenta la percentuale di nodi, della sequenza di peer che accedono alla
rete, aventi output band < 1): per fare questo il componente software (realizzato in Java), che
implementa ciascun algoritmo, effettua l’inserimento dei nodi generati dall’algoritmo specificato
nella sezione 3.1 di questa tesi fino a che la rete è in grado di accettare peer. Tale procedura di
inserimento della sequenza di nodi nella rete è ripetuta per ogni sequenza di nodi, dove tali
sequenze sono caratterizzate da un valore del parametro Pc1 che varia tra il suo valore iniziale e il
99%. In questo modo per ogni valore di Pc1 (e quindi per ogni sequenza di nodi) viene generata una
rete di diffusione del contenuto.
102
Quindi, per ogni algoritmo si ottiene una tabella ed un corrispondente grafico, nel quale vi è
come variabile indipendente il parametro Pc1 e come variabile dipendente la stima del costo delle
ristrutturazioni locali dovute all’inserimento dei nodi delle varie sequenze. Un esempio di tabella
contente i valori del parametro Pc1, con i relativi valori di “stima del costo delle ristrutturazioni
locali” è la seguente:
Costo delle ristrutturazioni locali dell’algoritmo 5 Costo delle ristrutturazioni locali dell’algoritmo 6
3142
294
2408
631
2418
796
1898
845
2004
706
1941
963
1467
996
1636
1012
1576
984
1679
802
1286
787
…
…
931
605
564
554
558
602
608
555
518
448
623
448
487
210
Il grafico associato a tale tabella è il seguente:
Costo Ristrutturazioni Locali
3500
3000
2500
Costo
Pc1
75
76
77
78
79
80
81
82
83
84
85
…
93
94
95
96
97
98
99
2000
Algoritmo5
1500
Algoritmo6
1000
500
0
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
Pc1
103
Figura 82
Le output band della sequenza di nodi che vogliono accedere alla rete, in questo esempio, sono
state generata dall’algoritmo di generazione della sequenza di nodi descritto nella sezione 3.1 .
Occorre notare che la rete non è più grado di accettare ulteriori nodi, specificati nella sequenza
di peer che vogliono accedere alla rete stessa, quando per i suoi vincoli di banda non è possibile
inserire un nuovo nodo in essa, e quindi tale nodo verrà messo nella lista dei nodi in attesa.
Inoltre in questa sezione si presentano una serie di esempi relativi ai costi di ristrutturazione
locale delle reti al variare del parametro Pc1. Nel primo esempio il parametro Pc1 è stato scelto ≥
75% di modo che la rete tenda alla condizione nella quale non è più in grado di accettare nuovi
nodi, e di modo che l’eventuale inserimento di un nuovo nodo avvenga con la ristrutturazione locale
della rete stessa. Se, invece, la percentuale Pc1 è inferiore al 75% allora può capitare che la rete
accetti tutti i nodi che vogliono accedere alla rete, e quindi per valori di Pc1 inferiori al 75% si
potrebbe verificare che il costo totale di ristrutturazione sia molto basso o tendente a 0.
Primo esempio, avente Pc1 che varia tra 75 e 99 e Pc2 che vari tra 25 e 1. Quindi le reti sono
state ottenute considerando 25 sequenze di nodi, dove in ogni sequenza si hanno 1000 nodi. Pc1
è stato scelto ≥ 75 di modo che la rete sia in condizione di non accettare ulteriori nodi e di modo
che l’eventuale inserimento di un nuovo nodo avvenga, solo, con ristrutturazione locale della
rete. Quindi, sicuramente, in questo caso i costi di ristrutturazione locale delle varie reti generate
sarà superiore a 0. Inoltre in questo esempio l’output band fornita dal nodo sorgente è costante e
pari a 4:
Costo Ristrutturazioni Locali
3500
3000
Costo
2500
2000
Algoritmo5
1500
Algoritmo6
1000
500
0
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
Pc1
104
Figura 83
Secondo esempio, avente Pc1 che varia tra 65 e 99 e Pc2 che vari tra 35 e 1. Quindi le reti sono
state ottenute considerando 35 sequenze di nodi, dove in ogni sequenza si hanno 1000 nodi.
Essendo Pc1 ≥ 65%, allora per i valori di Pc1 inferiori al 75%, circa, può accadere che la rete
accetti tutti i nodi della sequenza caratterizzata da tale valore di Pc1; quindi per valori di Pc1
inferiori al 75% può accadere che i valori dei costi di ristrutturazione siano molto bassi o
tendenti a 0. Inoltre in questo esempio l’output band fornita dal nodo sorgente è costante e pari a
4:
Costo Ristrutturazioni Locali
4000
3500
3000
Costo
2500
2000
Algoritmo5
1500
Algoritmo6
1000
500
0
65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99
Pc1
Figura 84
In questo esempio si può notare che per Pc1= 65% e Pc1= 67% la rete, generata dall’algoritmo
6, accetta tutti i nodi che vogliono accedervi senza effettuare ristrutturazioni locali della rete
stessa. Quindi per questi due punti i costi di ristrutturazione della rete locale sono nulli.
Terzo esempio, avente Pc1 che varia tra 50 e 99 e Pc2 che vari tra 50 e 1. Quindi le reti sono
state ottenute considerando 50 sequenze di nodi, dove in ogni sequenza si hanno 1000 nodi.
Anche in questo caso, essendo Pc1 ≥ 50%, allora per i valori di Pc1 inferiori al 75%, circa, può
accadere che la rete accetti tutti i nodi della sequenza caratterizzata da tale valore di Pc1; quindi
per valori di Pc1 inferiori al 75% può accadere che i valori dei costi di ristrutturazione siano
105
molto bassi o tendenti a 0. Inoltre in questo esempio l’output band fornita dal nodo sorgente è
costante e pari a 4:
Costo Ristrutturazioni Locali
3500
3000
Costo
2500
2000
Algoritmo5
1500
Algoritmo6
1000
500
0
50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98
Pc1
Figura 85
In questo esempio si può notare che per valori di Pc1 ≤ 63% , circa, la rete, generata
dall’applicazione dell’algoritmo 6, accetta tutti i nodi che vogliono accedervi senza effettuare
ristrutturazioni locali della rete stessa. Quindi per questi punti i costi di ristrutturazione della
rete locale sono nulli.
Confrontando questi due algoritmi in base alla stima del costo della ristrutturazione locale della
rete, in funzione del parametro Pc1, si nota che: in genere, il sesto algoritmo è quello che rende
minimo il costo di ristrutturazione locale della rete. Occorre però notare che per valori di Pc1
elevati (ossia superiori al 80%) il quinto ed il sesto algoritmo si equivalgono o addirittura il
quinto algoritmo ha un costo di ristrutturazione leggermente inferiore del sesto.
106
4.2.4 BANDA DISPONIBILE O RESIDUA IN FUNZIONE DELLA PERCENTUALE
DI NODI CHE HANNO OUTPUT BAND < 1 NELLA SEQUENZA DI
INGRESSO
Per gli algoritmi 5 e 6 si analizza, come terzo parametro prestazionale, la banda totale
disponibile della rete (data dalla somma delle output band residue, ossia inutilizzate, di tutti i nodi
della rete), in funzione del parametro Pc1 (che rappresenta la percentuale di nodi, della sequenza di
peer che accedono alla rete, aventi output band < 1): per fare questo il componente software
(realizzato in Java), che implementa ciascun algoritmo, effettua l’inserimento dei nodi generati
dall’algoritmo specificato nella sezione 3.1 di questa tesi, fino a che la rete è in grado di accettare
peer. Tale procedura di inserimento della sequenza di nodi nella rete è ripetuta per ogni sequenza di
nodi, dove tali sequenze sono caratterizzate da un valore del parametro Pc1 che varia tra il suo
valore iniziale e il 99%. In questo modo per ogni valore di Pc1 (e quindi per ogni sequenza di nodi)
viene generata una rete di diffusione del contenuto.
Quindi, per ogni algoritmo si ottiene una tabella ed un corrispondente grafico, nel quale vi è
come variabile indipendente il parametro Pc1 e come variabile dipendente banda totale residua della
rete. Un esempio di tabella contente i valori del parametro Pc1, con i relativi valori di “banda totale
residua della rete” è la seguente:
Pc1 Banda totale residua algoritmo 5
75
4,0625
76
4,27083333
77
4,16666667
78
5
79
3,97916667
80
3,97916667
81
4,25
82
4,10416667
83
3,125
84
4,10416667
85
4,27083333
86
5,875
87
4,72916667
88
4,04166667
89
3,54166667
90
3,91666667
91
3,75
…
…
96
3,41666667
97
4,4375
98
4,4375
99
2,39583333
Banda totale residua algoritmo 6
0,375
0,4375
0,270833333
0,25
0,604166667
0,395833333
0,270833333
0,416666667
0,291666667
0,458333333
0,25
0,458333333
0,3125
0,25
0,416666667
0,270833333
0,25
…
0,25
0,25
0,3125
0,25
107
Il grafico associato a tale tabella è il seguente:
Banda Residua
7
6
Banda Disponibile
5
4
Algoritmo5
3
Algoritmo6
2
1
0
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
Pc1
Figura 86
Le output band della sequenza di nodi che vogliono accedere alla rete, in questo esempio, sono
state generata dall’algoritmo di generazione della sequenza di nodi descritto nella sezione 3.1 .
Occorre notare che la rete non è più grado di accettare ulteriori nodi, specificati nella sequenza
di peer che vogliono accedere alla rete stessa, quando per i suoi vincoli di banda non è possibile
inserire un nuovo nodo in essa, e quindi tale nodo verrà messo nella lista dei nodi in attesa.
Inoltre in questa sezione si presentano una serie di esempi relativi alla banda totale residua
della rete al variare del parametro Pc1. Nel primo esempio il parametro Pc1 è stato scelto ≥ 75% di
modo che la rete tenda alla condizione nella quale non è più in grado di accettare nuovi nodi, e di
modo che l’eventuale inserimento di un nuovo nodo avvenga con la ristrutturazione locale della rete
stessa. Se, invece, la percentuale Pc1 è inferiore al 75% allora può capitare che la rete accetti tutti i
nodi che vogliono accedere alla rete, e quindi per valori di Pc1 inferiori al 75% si potrebbe
108
verificare che la banda totale residua della rete sia superiore all’unità ossia con tale banda si
riuscirebbe ad alimentare uno o più ulteriori nodi.
Primo esempio, avente Pc1 che varia tra 75 e 99 e Pc2 che vari tra 25 e 1. Quindi le reti sono
state ottenute considerando 25 sequenze di nodi, dove in ogni sequenza si hanno 1000 nodi. Pc1
è stato scelto ≥ 75 di modo che la rete sia in condizione di non accettare ulteriori nodi e di modo
che l’eventuale inserimento di un nuovo nodo avvenga, solo, con ristrutturazione locale della
rete. Quindi, sicuramente, in questo caso la banda totale residua delle reti generate
dall’algoritmo 6 sarà sempre inferiore a 1, al variare di Pc1, poiché tale algoritmo è derivato
dall’algoritmo 4 il quale garantisce una banda totale residua della rete < di 1. Inoltre in questo
esempio l’output band fornita dal nodo sorgente è costante e pari a 4:
Banda Residua
7
6
Banda Disponibile
5
4
Algoritmo5
3
Algoritmo6
2
1
0
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
Pc1
Figura 87
In questo esempio si può notare che la banda totale residua, delle reti generate dall’algoritmo 6,
è sempre inferiore all’unità; quindi le reti generate da tale algoritmo, al variare di Pc1, sono tali
109
per cui non sono in grado di alimentare un ulteriore nodo e sono in grado di alimentarlo
solamente se, questo è in grado di incrementare sufficientemente la banda totale residua.
Inoltre si può notare che il quinto algoritmo genera reti, al variare di Pc1, con output band
residue superiori a quelle fornite dalle reti generate dal sesto algoritmo.
Secondo esempio, avente Pc1 che varia tra 65 e 99 e Pc2 che vari tra 35 e 1. Quindi le reti sono
state ottenute considerando 35 sequenze di nodi, dove in ogni sequenza si hanno 1000 nodi.
Essendo Pc1 ≥ 65%, allora per i valori di Pc1 inferiori al 75%, circa, può accadere che la rete
accetti tutti i nodi della sequenza caratterizzata da tale valore di Pc1; quindi per valori di Pc1
inferiori al 75% può accadere che i valori delle bande totali residue, delle reti generate
dall’algoritmo 6, siano superiori all’unità poiché tali reti sarebbero in grado di alimentare
ulteriori nodi, oltre a quelli delle sequenze che sono stati inseriti nelle reti stesse. Inoltre in
questo esempio l’output band fornita dal nodo sorgente è costante e pari a 4:
Banda Residua
5
4,5
4
Banda Disponibile
3,5
3
2,5
Algoritmo5
Algoritmo6
2
1,5
1
0,5
0
65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99
Pc1
110
Figura 88
In questo esempio si può notare che per Pc1= 65% e Pc1= 67% le reti, generate dal quinto e dal
sesto algoritmo, accettano tutti i nodi che vogliono accedervi e quindi hanno una banda totale
residua superiore all’unità poiché sarebbero in grado di alimentare ulteriori nodi. In ogni modo,
anche in questo esempio si nota che il sesto algoritmo ha un migliore comportamento del quinto
algoritmo, per quanto riguarda l’andamento della banda totale residua in funzione del parametro
Pc1.
Terzo esempio, avente Pc1 che varia tra 50 e 99 e Pc2 che vari tra 50 e 1. Quindi le reti sono
state ottenute considerando 50 sequenze di nodi, dove in ogni sequenza si hanno 1000 nodi.
Anche in questo caso, essendo Pc1 ≥ 50%, allora per i valori di Pc1 inferiori al 75%, circa, può
accadere che la rete accetti tutti i nodi della sequenza caratterizzata da tale valore di Pc1; quindi
per valori di Pc1 inferiori al 75% può accadere che i valori delle bande totali residue, delle reti
generate dall’algoritmo 6, siano superiori all’unità poiché tali reti sarebbero in grado di
alimentare ulteriori nodi, oltre a quelli delle sequenze che sono stati inseriti nelle reti stesse.
Inoltre in questo esempio l’output band fornita dal nodo sorgente è costante e pari a 4:
Banda Residua
140
120
Banda Disponibile
100
80
Algoritmo5
60
Algoritmo6
40
20
0
50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98
Pc1
111
Figura 89
In questo esempio si può notare che per valori di Pc1 ≤ 63% le reti, generate dal quinto e dal
sesto algoritmo, accettano tutti i nodi che vogliono accedervi e quindi hanno una banda totale
residua superiore all’unità poiché sarebbero in grado di alimentare ulteriori nodi. In ogni modo,
anche in questo esempio si nota che il sesto algoritmo ha un migliore comportamento del quinto
algoritmo, per quanto riguarda l’andamento della banda totale residua in funzione del parametro
Pc1.
Quindi confrontando tra loro il quinto ed il sesto algoritmo rispetto alla banda totale residua, in
funzione del parametro Pc1 si nota che: l’algoritmo che minimizza la banda totale residua è il sesto.
4.2.5 NUMERO NODI IN ATTESA IN FUNZIONE DELLA PERCENTUALE DI
NODI CHE HANNO OUTPUT BAND < 1 NELLA SEQUENZA DI
INGRESSO
Per gli algoritmi 5 e 6 si analizza, come quarto parametro prestazionale, il numero dei nodi in
attesa (si vedano le sezioni 3.6 e 3.7 per avere maggiori dettagli sulla lista dei nodi in attesa), in
funzione del parametro Pc1 (che rappresenta la percentuale di nodi, della sequenza di peer che
accedono alla rete, aventi output band < 1): per fare questo il componente software (realizzato in
Java), che implementa ciascun algoritmo, effettua l’inserimento dei nodi generati dall’algoritmo
specificato nella sezione 3.1 di questa tesi, fino a che la rete è in grado di accettare peer. Tale
procedura di inserimento della sequenza di nodi nella rete è ripetuta per ogni sequenza di nodi, dove
tali sequenze sono caratterizzate da un valore del parametro Pc1 che varia tra il suo valore iniziale e
il 99%. In questo modo per ogni valore di Pc1 (e quindi per ogni sequenza di nodi) viene generata
una rete di diffusione del contenuto.
Quindi, per ogni algoritmo si ottiene una tabella ed un corrispondente grafico, nel quale vi è
come variabile indipendente il parametro Pc1 e come variabile dipendente il numero di nodi che
sono in attesa di accedere alla rete. Un esempio di tabella contente i valori del parametro Pc1, con i
relativi valori di “numero di nodi in attesa” è la seguente:
112
Pc1
75
76
77
78
79
80
81
82
83
84
…
90
91
92
93
94
95
96
97
98
99
N°Nodi In Attesa
nell’algoritmo 5
46
94
89
163
144
153
191
144
211
207
…
401
393
397
469
539
551
535
609
609
684
N°Nodi In Attesa
nell’algoritmo 5
41
88
83
147
139
146
184
138
206
199
…
387
386
390
462
532
532
526
591
592
678
Differenza del numero dei nodi
in attesa dei due algoritmi
5
6
6
16
5
7
7
6
5
8
…
14
7
7
7
7
19
9
18
17
6
Il grafico associato a tale tabella, per quanto riguarda il numero dei nodi in attesa, è il seguente:
Numero Nodi in Attesa
800
700
Numero Nodi in attesa
600
500
400
Algoritmo5
300
Algoritmo6
200
100
0
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
Pc1
113
Figura 90
Il grafico associato a tale tabella, per quanto riguarda la differenza tra il numero di nodi in
attesa dell’algoritmo 5 ed il numero dei nodi in attesa dell’algoritmo 6, è il seguente:
Numero nodi in attesa
(differenza tra l'algoritmo 5 e 6)
20
18
16
Numero Nodi
14
12
10
NodiInAttesaDiff
8
6
4
2
0
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
Pc1
Figura 91
Le output band della sequenza di nodi che vogliono accedere alla rete, in questo esempio, sono
state generata dall’algoritmo di generazione della sequenza di nodi descritto nella sezione 3.1 .
Occorre notare che la rete non è più grado di accettare ulteriori nodi, specificati nella sequenza
di peer che vogliono accedere alla rete stessa, quando per i suoi vincoli di banda non è possibile
inserire un nuovo nodo in essa, e quindi tale nodo verrà messo nella lista dei nodi in attesa.
Inoltre in questa sezione si presentano una serie di esempi relativi al numero dei nodi in attesa
al variare del parametro Pc1. Nel primo esempio il parametro Pc1 è stato scelto ≥ 75% di modo che
la rete tenda alla condizione nella quale non è più in grado di accettare nuovi nodi, e di modo che
l’eventuale inserimento di un nuovo nodo avvenga con la ristrutturazione locale della rete stessa.
Se, invece, la percentuale Pc1 è inferiore al 75% allora può capitare che la rete accetti tutti i nodi
che vogliono accedere alla rete stessa e conseguentemente non si avranno peer in attesa.
114
Primo esempio, avente Pc1 che varia tra 75 e 99 e Pc2 che vari tra 25 e 1. Quindi le reti sono
state ottenute considerando 25 sequenze di nodi, dove in ogni sequenza si hanno 1000 nodi. Pc1
è stato scelto ≥ 75 di modo che la rete sia in condizione di non accettare ulteriori nodi di modo
che l’eventuale inserimento di un nuovo nodo avvenga, solo, con ristrutturazione locale della
rete stessa. Inoltre in questo esempio l’output band fornita dal nodo sorgente è costante e pari a
4:
Numero Nodi in Attesa
800
Numero Nodi in attesa
700
600
500
400
Algoritmo5
300
Algoritmo6
200
100
0
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
Pc1
Figura 92
Numero nodi in attesa
(differenza tra l'algoritmo 5 e 6)
20
18
Numero Nodi
16
14
12
10
8
NodiInAttesaDiff
6
4
2
0
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
Pc1
Figura 93
115
Secondo esempio, avente Pc1 che varia tra 65 e 99 e Pc2 che vari tra 35 e 1. Quindi le reti sono
state ottenute considerando 35 sequenze di nodi, dove in ogni sequenza si hanno 1000 nodi.
Essendo Pc1 ≥ 65%, allora per i valori di Pc1 inferiori al 75%, circa, può accadere che la rete
accetti tutti i nodi della sequenza caratterizzata da tale valore di Pc1. Inoltre in questo esempio
l’output band fornita dal nodo sorgente è costante e pari a 4:
Numero Nodi in Attesa
800
Numero Nodi in attesa
700
600
500
400
Algoritmo5
300
Algoritmo6
200
100
0
65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99
Pc1
Figura 94
Numero nodi in attesa
(differenza tra l'algoritmo 5 e 6)
40
35
Numero Nodi
30
25
20
NodiInAttesaDiff
15
10
5
0
65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99
Pc1
Figura 95
116
In questo esempio si può notare che per Pc1= 65% e Pc1= 67% la rete accetta tutti i nodi che
vogliono accedervi e quindi non vi sono nodi in attesa.
Terzo esempio, avente Pc1 che varia tra 50 e 99 e Pc2 che vari tra 50 e 1. Quindi le reti sono
state ottenute considerando 50 sequenze di nodi, dove in ogni sequenza si hanno 1000 nodi.
Anche in questo caso, essendo Pc1 ≥ 50%, allora per i valori di Pc1 inferiori al 75%, circa, può
accadere che la rete accetti tutti i nodi della sequenza caratterizzata da tale valore di Pc1. Inoltre
in questo esempio l’output band fornita dal nodo sorgente è costante e pari a 4:
Numero Nodi in Attesa
900
Numero Nodi in attesa
800
700
600
500
400
Algoritmo5
300
Algoritmo6
200
100
0
50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98
Pc1
Figura 96
Numero nodi in attesa
(differenza tra l'algoritmo 5 e 6)
25
Numero Nodi
20
15
10
NodiInAttesaDiff
5
0
50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98
Pc1
Figura 97
117
In questo esempio si può notare che per valori di Pc1 ≤ 63% , circa, la rete accetta tutti i nodi
che vogliono accedervi, e quindi il numero dei nodi che risultano essere in attesa di essere
inseriti è nullo.
Quindi confrontando i due algoritmi in base al numero dei nodi in attesa, in funzione del
parametro Pc1, si nota che: l’algoritmo che minimizza il numero di nodi in attesa è il sesto.
118
5 CONCLUSIONI
L’obiettivo di questa tesi è rappresentato dalla creazione e realizzazione di nuovi algoritmi per
la costruzione di reti peer to peer adottate per la diffusione di contenuti; questi algoritmi sono stati
ideati basandosi su un algoritmo di peer to peer, per la diffusione di contenuti su canale
asimmetrico, sviluppato dal prof. Ing. Gianluca Mazzini e Riccardo Rovatti. Nei nuovi algoritmi
non è prevista l’ipotesi per la quale tutti i peer che vogliono accedere alla rete hanno la medesima
output band, mentre nell’algoritmo di base tale ipotesi era prevista. Inoltre nei nuovi algoritmi si ha,
come ipotesi aggiuntiva, il fatto che i peer possono avere un output band maggiore di 1 (ossia della
output band richiesta dal contenuto normalizzata all’unità).
Questi algoritmi sono applicati ad un scenario nel quale il nodo sorgente emette il contenuto
mentre i nodi utente, o anche detti peer, sono in grado di accettare stream parziali (o contenuti
parziali) provenienti da più di un nodo attraverso il loro collegamento d'ingresso e di ridistribuire
tale contenuto ad uno o più ulteriori peer attraverso il loro link di uscita. Questo crea una rete di
distribuzione del contenuto modellata attraverso un grafo diretto orientato dalla sorgente. Tale grafo
deve essere creato ed aggiornato dinamicamente quando un nuovo peer entra nella rete.
Sono stati realizzati sei algoritmi differenti per la creazione di reti adottate per la diffusione di
contenuti erogati da un unico nodo sorgente.
Negli algoritmi 1,2 e 5 la rete, che viene generata, è strutturata in tier o file dove ogni tier
alimenta quello successivo; ciò si verifica per tutti i tier tranne il primo, il quale è alimentato
solamente dal nodo sorgente. Gli algoritmi 1,2 e 5 si differenziano in base alle modalità di
inserimento di nuovi nodi nella rete.
Negli algoritmi 3,4 e 6 la rete, che viene generata, è rappresentata attraverso una lista che
contiene tutti i peer presenti nella rete stessa; inizialmente tale lista contiene solo il nodo sorgente;
inoltre, ogni nodo, presente nella rete, contiene al suo interno la lista dei suoi peer figli. Quindi in
questo caso, il nuovo nodo che vuole accedere alla rete deve racimolare un quantitativo di banda
pari a quella richiesta dal contenuto stesso richiedendola ai vari peer della rete; se il nuovo peer è in
grado di racimolare la banda richiesta allora tale nodo viene inserito nella rete.
Gli algoritmi 1,2,3 e 4 presentano un blocco all’ingresso ossia nel caso in cui la rete generata
non è più in grado di accettare un nuovo nodo, l’algoritmo non permetterà l’inserimento dei peer
successivi, anche se attraverso un’opportuna ristrutturazione locale (che si potrebbe applicare agli
algoritmi 2 e 4 essendo questi caratterizzati da un inserimento con eventuale ristrutturazione) della
rete stessa, potrebbero essere inseriti. Basandosi su questa considerazione sono nati gli algoritmi 5 e
6 nei quali si accettano nella rete solamente i nodi inseribili anche eventualmente con
119
ristrutturazione locale, mettendo in attesa quei peer che risultano essere non inseribili nella rete;
questi peer sospesi sono in attesa che venga inserito nella rete un nuovo nodo avente una output
band talmente elevata da garantire l’inserimento di uno o più peer presenti nella lista di attesa.
Il primo algoritmo per il peer to peer prova ad aggiungere il nuovo peer nel tier caratterizzato
dal ritardo minimo, ossia nel tier più vicino possibile al nodo sorgente, in modo tale da soddisfare i
vincoli sull'ampiezza di banda e quindi tale algoritmo viene terminato con insuccesso (fallisce) se
non si possono alimentare ulteriori peer da parte dei peer che vi sono nei vari tiers della rete di
diffusione del contenuto.
Questo algoritmo è sub-ottimo nel numero di peer serviti. Infatti, si potrebbe racimolare
l'output band non utilizzata dai differenti tier per alimentare un nuovo nodo o in alternativa si
potrebbe fare la seguente considerazione: data una sequenza di nodi con output band diverse, questi
nodi accedono successivamente alla rete e questa accetta nodi finché l’ultimo tier che ha banda a
disposizione è in grado di alimentare un nuovo nodo; quindi la rete non è più in grado di accettare
nodi quando l’ultimo tier disponibile non ha una banda sufficiente (ossia ≥ 1) in grado di alimentare
un nuovo nodo.
Quindi in questo caso si può nota che:
1.
Data una sequenza di nodi con le seguenti output band: B1, B2, … , Bn con
B1<B2<…<Bn≤Bc=1
allora si suppone che il numero massimo di nodi che la rete è in grado di accettare sia
pari a K;
2.
Se invece si considerano gli stessi nodi con le stesse output band ma con una sequenza
di accesso dei nodi alla rete tale per cui vengono inseriti prima i nodi con output band
maggiore, ossia se i nodi con bande di output maggiori vanno a finire nei tiers più
vicini al nodo sorgente, allora si verifica che il numero massimo di nodi che la rete
Peer to Peer è in grado di accettare risulterà essere > K o al più uguale a K.
In questo modo la situazione ideale sarebbe quella di avere un algoritmo che inserisca, di volta
in volta, il nuovo nodo nella rete determinando in che tier inserirlo in base alla sua output band. Per
tale motivo è stato ideato il secondo algoritmo.
Il secondo algoritmo ha il seguente comportamento: dato un nodo con output band pari a Bj
allora tale nodo viene inserito:
nel primo tier se Bj è superiore al output band del peer avente banda minima per tale
tier;
120
altrimenti il nodo viene inserito nel tier avente output band minima < Bj ed avente
output band minima del tier precedente ≥ Bj.
Per notazione il tier dove viene inserito il nodo considerato viene indicato come tier i-esimo.
Quindi in questa situazione se, per i requisiti di banda del i-esimo tier il nodo da inserire può essere
direttamente inserito nell’i-esimo tier stesso allora lo si inserisce senza effettuare ristrutturazioni
della rete.
Se invece nel tier i-esimo non possono essere inseriti ulteriori nodi per i requisiti di banda
(poiché la banda disponibile nel tier i-esimo è inferiore all’unità) allora si determina il nodo Nm
avente banda in output minima presente nel tier i-esimo, lo si estrae dal tier e lo si sostituisce con il
nuovo nodo.
In questo modo il nodo Nm estratto viene inserito nel tier successivo, inserendolo direttamente
pi −1
nel tier se vi è posto (ossia se ∑ Ω k ≥ ( pi +1 + 1) ), altrimenti si determina il nodo avente output band
k =0
minore, in tale tier, e questo viene sostituito con il nodo Nm. Tale procedura ricorsiva si termina se:
1.
il nodo che deve essere inserito nel tier a cui si è giunti può essere inserito
direttamente (senza ristrutturazione locale) poiché i requisiti di banda lo consentono;
2.
oppure se si giunge all’ultimo tier e si riesce ad inserire il nodo prelevato dal tier
precedente poiché per l’ultimo tier sono garantiti i requisiti di banda richiesti dal
contenuto multimediale (ossia banda totale in upload dell’ultimo tier ≥ 1);
3.
oppure se la rete non è in grado di accettare più nodi; ciò si verifica se, con la
procedura ricorsiva, si giunge all’ultimo tier e se per questo non sono garantiti i
requisiti di banda richiesti dal contenuto multimediale (ossia output band totale
dell’ultimo tier < 1). Quindi a causa di tale evento prima di effettuare l’inserimento si
controllano tutte le condizioni sui requisiti di banda che vengono considerate a causa
dell’inserimento ricorsivo dei nodi.
Questo algoritmo presenta, rispetto al primo algoritmo, un possibile aumento del numero di
nodi inseribili nella rete a scapito di un onere rappresentato dal costo delle varie ristrutturazioni
locali della rete che potenzialmente si possono verificare ad ogni inserimento.
Nelle reti generate, sia dal primo che dal secondo algoritmo, si potrebbe racimolare l'output
band non utilizzata dai differenti tier per alimentare un nuovo nodo. In base a questa considerazione
è stato introdotto e realizzato il terzo algoritmo. Un ulteriore svantaggio del secondo algoritmo è
rappresentato dal costo delle ristrutturazioni locali generate a seguito dell’inserimento dei nuovi
nodi.
121
Nell’algoritmo 3 si ha il seguente comportamento: ogni nodo che vuole accedere alla rete,
interpella i vari nodi presenti nella rete stessa al fine di racimolare un quantitativo di banda pari alla
banda necessaria per acquisire il contenuto considerato. Se il nuovo peer è in grado di ottenere, dai
nodi già presenti nella rete, l’ampiezza di banda richiesta dal contenuto allora il nuovo nodo viene
inserito nella rete stessa ed inizia ad acquisire il contenuto considerato. Se invece il nuovo peer non
è in grado di racimolare un quantitativo di banda sufficiente ad acquisire il contenuto allora la rete
non è più in grado di accettare ulteriori nodi, oltre a quelli già presenti.
Lo svantaggio che si ha nel terzo algoritmo è dovuto al fatto che: modificando,
opportunamente,
l’algoritmo 3 di modo che l’inserimento dei nodi venga effettuato con una
eventuale ristrutturazione locale della rete, si ottiene un nuovo algoritmo che consente di aumentare
il numero massimo di nodi inseribili nella rete, a scapito di un costo dovuto alle ristrutturazioni
stesse. Da questa considerazione si ottiene l’algoritmo 4.
Il quarto algoritmo è del tutto analogo a quello precedente con l’aggiunta della ristrutturazione
locale della rete nel caso in cui l’inserimento di un nuovo nodo può essere effettuato solo
sostituendo il nodo avente output band minima con il nuovo nodo e reinserendo il nodo avente
banda minima. In questo caso si ferma l’inserimento di nuovi nodi, se il nuovo nodo entrante risulta
essere non inseribile nella rete anche con la sostituzione di questo con il nodo a banda di upload
minima. Quando si verifica tale evento il sistema rifiuta l’inserimento di nuovi nodi nella rete anche
se questi potrebbero essere inseriti con ristrutturazione locale. Lo svantaggio presente nel quarto
algoritmo è rappresentato dal costo delle ristrutturazioni locali generate a seguito dell’inserimento
dei nuovi nodi.
Occorre notare che negli algoritmi 2 e 4, che presentano ristrutturazioni locali, si potrebbe
pensare che:
se la rete non accetta più nodi poiché ha una banda totale disponibile < 1 allora si può
pensare di mettere in attesa tutti i nodi successivi che tentano di accedere alla rete
aspettando che arrivi un nuovo nodo che sia in grado di aumentare la banda totale
disponibile della rete;
quando si verifica tale condizione si inserisce nella rete il nodo a banda elevata con
ristrutturazione locale e successivamente si provano ad inserire i nodi in attesa, che erano
stati sospesi poiché la banda totale disponibile della rete prima dell’ultimo inserimento
era < 1.
In base a questa considerazione sono nati gli algoritmi 5 e 6.
122
Il quinto algoritmo è derivato dal secondo algoritmo presentato, con l’ipotesi aggiuntiva di non
avere il blocco all’ingresso della rete, ossia si inseriscono tutti i nodi inseribili nella sequenza di
nodi di ingresso scartando quelli non inseribili. Per fare questo si modifica il comportamento del
secondo algoritmo, per quanto riguarda la situazione nella quale il nuovo nodo non è inseribile nella
rete, cioè:
se la rete non accetta più nodi poiché ha una banda totale disponibile < 1, in tutti i suoi
tier, allora si mettono in attesa tutti i nodi successivi che tentano di accedere alla rete,
aspettando che arrivi un nodo che sia in grado di aumentare la banda totale disponibile in
almeno un tier della rete;
quando si verifica tale condizione si inserisce nella rete il nodo a banda elevata con
ristrutturazione locale e successivamente si provano ad inserire i nodi in attesa che erano
stati sospesi.
Il sesto algoritmo è derivato dal quarto algoritmo presentato con l’ipotesi aggiuntiva di non
avere il blocco all’ingresso della rete, ossia si inseriscono tutti i nodi inseribili nella sequenza di
nodi di ingresso scartando quelli non inseribili.
Per fare questo si modifica il comportamento del quarto algoritmo, per quanto riguarda la
situazione nella quale il nuovo nodo non è inseribile nella rete, cioè:
si consideri la seguente condizione:
BtotDisp – [La banda del nodo a banda minima della rete] + Bi ≥ 1
(1)
se la rete non accetta più nodi poiché ha una banda totale disponibile < 1 allora si
mettono in attesa tutti i nodi successivi che tentano di accedere alla rete aspettando che
arrivi un nodo che garantisca il verificarsi della condizione (1), ossia di un nodo che sia
in grado di aumentare la banda totale disponibile della rete;
quando si verifica tale condizione si inserisce nella rete il nodo a banda elevata (che
verifica la condizione (1)) con ristrutturazione locale e successivamente si provano ad
inserire i nodi in attesa, che erano stati sospesi poiché la banda totale disponibile della
rete prima dell’ultimo inserimento era < 1.
Quindi sia nel quinto che nel sesto algoritmo non si giunge mai in una situazione nella quale la
rete non è in grado di accettare nuovi nodi poiché prima o poi giungerà un nodo con output band
sufficientemente elevata da consentire l’inserimento dei nodi sospesi.
Dagli esempi e dai risultati mostrati nel capitolo 5 si può concludere che gli algoritmi, descritti
in questa tesi, garantiscono un miglioramento in termini di numero massimo di nodi inseribili nella
123
rete ed in termini di banda totale residua dell’intera rete, rispetto all’algoritmo Mazzini/Rovatti
[9]
adattato alle nuove condizioni di rete:
in particolare per quanto riguarda gli algoritmi con blocco all’ingresso (rappresentati
dai primi quattro algoritmi) quello che garantisce un maggior numero di nodi inseribili
e la minimizzazione della banda totale residua della rete è il quarto; se però per la
tipologia di contenuto da diffondere la ristrutturazione locale della rete, che
potenzialmente si può verificare all’inserimento di ogni nuovo nodo, è indesiderata per
la corretta distribuzione del contenuto stesso, allora l’algoritmo che garantisce un
maggior numero di nodi inseribili, con costo di ristrutturazione locale sempre nullo, è
rappresentato dal terzo algoritmo;
mentre per quanto riguarda gli algoritmi senza blocco all’ingresso (ossia gli algoritmi 5
e 6) quello che, in genere, garantisce la massimizzazione del numero di nodi inseribili
nella rete, la minimizzazione della banda totale residua della rete, la minimizzazione
del numero dei nodi in attesa ed un minor costo di ristrutturazione locale è il sesto
algoritmo.
124
6 BIBLIOGRAFIA
[1] Appunti del corso di “Reti di Calcolatori”, docente: prof. Cesare Stefanelli, anno accademico
2004/2005
[2] Wikipedia, storia di Napster: “http://en.wikipedia.org/wiki/Napster”
[3] Wikipedia, storia di Gnutella: “http://en.wikipedia.org/wiki/Gnutella”
[4] Wikipedia, storia di KaZaA: “http://en.wikipedia.org/wiki/Kazaa”
[5] Wikipedia, storia di BitTorrent: “http://en.wikipedia.org/wiki/BitTorrent_client”
[6] Slide: Peer-to-Peer Applications Reading: 9.4, COS 461: Computer Networks, Spring 2007
MW 1:30-2:50 in Friend 004), Jennifer Rexford Teaching Assistant: Ioannis Avramopoulos
[7] Reti di Telecomunicazioni, Gianluca Mazzini, Pitagora editrice Bologna; il multicast, da pagina
252 a pagina 265
[8] Peer to Peer File Download and Streaming, Gang Wu and Tzi-cker Chiueh, Department of
Computer Science, Stony Brook University, pagine 1 e 2
[9] Peer-to-Peer Distribution on Asymmetric Channels, Gianluca Mazzini, Riccardo Rovatti
125
126
7 RINGRAZIAMENTI
La vita riserva tante sorprese, tante emozioni che certe volte risultano essere inaspettate e tanto
desiderate.. Quando mi sono iscritto
iscritto all’università non pensavo, ma ci speravo, di potermi laureare
con una carriera così impressionate.
impressionate. Per questo motivo devo ringraziare tutti i docenti della
specialistica che mi hanno permesso, attraverso le loro capacità oratorie e la loro disponibilità,
disponibilità di
superare tutti gli esami con ottimi voti.
voti In particolare devo ringraziare il professore Gianluca
Gianluc
Mazzini per avermi dato la possibilità di fare la tesi con lui, per tutta la sua disponibilità e pazienza.
Devo ringraziare anche una persona, mia nonna Triestina, che mi pensava e amava tanto e non è
riuscita a vedermi laureato nella specialistica perché, purtroppo,, è venuta a mancare nel
ne mese di
settembre di quest’anno.
Inoltre devo ringraziare i miei genitori che mi hanno sostenuto sia moralmente che
economicamente durante tutto il percorso universitario.
Infine, ma non per ultima, devo ringraziare con
con tutto il cuore il mio amore, la gioia dei miei
occhi che mi ha dato la forza di poter superare gli ultimi due esami in un brevissimo periodo e con
voti veramente ottimi. Cara Barbara sei solamente tu,
tu che vedendoti e stando insieme a te, mi dai la
forza di vivere e superare tutte le avversità della mia esistenza,
esistenza, senza di te non saprei come fare,
grazie. Non so come ringraziarti per tutte le serate che abbiamo passato assieme e che passiamo
insieme perché, forse tu non te ne rendi conto completamente, ma il tuo amore mi fa sentire una
persona migliore e mi permette di fare qualunque cosa per il nostro bene, grazie.
grazie Per questo motivo
dedico questa tesi a te amore mio.
Danilo Merlanti
127