Your browser doesn't support the features required by impress.js, so you are presented with a simplified version of this presentation.

For the best experience please use the latest Chrome, Safari or Firefox browser.

Reti p2p
Linux Day Torino 2014
Mail/Jabber: giulio@anche.no
Cos'è il p2p?
In generale una rete peer-to-peer è una
architettura logica nella quale invece
del tradizionale rapporto client-server
ogni macchina può svolgere entrambe
le funzioni contribuendo effettivamente
alla rete.

Fasi fondamentali
1. Bootstrap
2. Routing
3. Data sharing
E' la fase nella quale un nodo entra a far
parte del network

Consiste nell'inoltro di una query (per
esempio di ricerca) al resto del network

E' l'effettivo invio della risorsa desiderata
agli altri nodi (files, cicli CPU, traffico)

Tre tipi di architetture p2p
Reti centralizzate
I nodi si affidano ad un server principale
per il bootstrap ed il routing mentre lo
scambio files avviene tra peers.

Pro e contro
Vantaggi
· Efficienza
· Precisione delle query
Svantaggi
· Singolo punto di fallimento
· Costi
· Scarsa scalabilità
Esempi
Tre tipi di architetture p2p
Reti ibride
I nodi non sono tutti uguali ma c'è
distinzione tra nodi e supernodi,
caratterizzati da particolari requisiti
tecnici.

I supernodi svolgono funzioni simili a quelle dei server centrali in network centralizzati ma hanno in carico solo un sottoinsieme di peers.
Pro e contro
Vantaggi
· Efficienza
· Precisione delle query
Svantaggi
· Resilienza
· Scalabilità
· Decentralizazzione limitata
Esempi
BestPeer
Tre tipi di architetture p2p
Reti decentralizzate
I nodi svolgono tutti le stesse funzionalità
e comunicano direttamente tra loro.

Pro e contro
Vantaggi
Svantaggi
· Resilienza
· Scalabilità
· Scarsa efficienza
· Decentralizzezione completa
· Scarsa precisione
Esempi
FreeNet
Gnutella
Network non strutturati
Nelle reti non strutturate i nodi sono
completamente autonomi e l'intera rete
ha una distribuzione casuale, senza
topologie definite.
Dal punto di vista dell'amministrazione
questo è vantaggioso in quanto non richiede
particolare manutenzione ed è in grado di
autorganizzarsi.
Questo approccio tuttavia porta ad un
grande spreco di risorse dato che, non
esistendo indici, registri o organizzazioni,
una query deve essere inviata a tutto il
network per ottenere risultati diretti dai
singoli nodi.
Network non strutturati
Network strutturati
Nelle reti strutturate i dati sono organizzati
in base a definizioni precise o probabilistiche
facilitandone la reperibilità.
Network di questo tipo sono più difficili
da organizzare, ma presentano vantaggi
sul lato della scalabilità e dell'ottimizzazione
nonchè su quello della precisione.
Network strutturati
· Distributed Hash Table
· Skip List
· Tree Based
Bootstrap
La fase di bootstrap è la più complicata
per quanto riguarda le possibilità di
decentralizzazione.
I metodi di bootstrap più utilizzati
impiegano o l'utilizzo di server centrali o
forniscono direttamente un elenco di
nodi stabili conosciuti.

Metodi di bootstrap
Bitcoin
bitcoin / src / chainparams.cpp
Fallback:
· Nodi semi permanenti inclusi nel codice
· Database precedenti connessioni
· Canale IRC (non più supportato)
Metodi di bootstrap
Tor
Nove* "Directory Authority"
* Tonga fa da directory solo per i bridge
Metodi di bootstrap
E senza server?
Sulla rete ipv4 l'unico modo completamente
decentralizzato per trovare peers è
fare uno scan finchè non se ne trova uno.
Questo è un approccio non sostenibile, sia per
la banda che per il tempo richiesto, oltre che
ad essere relativamente dannoso per internet.
Routing
Il routing consiste nell'inoltro di pacchetti ad
una rete p2p. Tali pacchetti possono essere
comandi, query o altro.
A seconda del tipo di pacchetto e del tipo di rete
può essere necessario che venga distribuito
a tutti i nodi o solo ad una parte di essi.
Metodi di routing
Ricerca in ampiezza
Questo metodo (Breadth-First search), tipico
delle reti non strutturate, è semplice ma
inefficiente.
Il nodo sorgente invia una query (di ricerca
per esempio) ai suoi vicini con un determinato
numero "di profondità" (TTL).
I nodi che ricevono la richiesta controllano se
possono soddisfarla, altrimenti inoltrano la
query ai loro vicini, fino alla scadenza del TTL.
Metodi di routing
Ricerca Intelligente
Data una base di dati precedente è possibile
affinare notovolmente l'efficenza delle query.
La sorgente può cercare di inviare la propria
query prima ai nodi più promettenti:
- Nodi che hanno risposto con più risultati
- Nodi che hanno inoltrato ai vicini più query
- Nodi che hanno meno coda
Metodi di routing
Distributed Hash Table
- Ad ogni nodo viene assegnato un id univoco
- Viene usato un algoritmo per la "distanza"
- I nodi mantengono informazioni sui "vicini"
- Minore è la distanza più le info sono dettagliate
Protocolli
Napster
Napster è stata la prima rete di filesharing p2p
a raggiungere in grande pubblico.
Venne inizialmente sviluppato da Shawn
Fanning, che si focalizzò su tre funzioni
principali:
- La ricerca
- La condivisione
- La possibilità di chattare
Napster aveva più di 38 milioni di peers.
Napster
1. Un utente avvia il client
2. Il client controlla la connettività e accede
      al server centrale
3. L'utente invia una ricerca al server, che in
     caso di successo risponde con una lista di IP
4. Il client sceglie un nodo e stabilisce una
     connessione diretta
5. Avviene il trasferimento del file desiderato
Napster
Il client si interfaccia con il server con
messaggi così strutturati:   
Una volta trovata la fonte richiesta ci sono due
possibilità:
Senza firewall
Con firewall
Protocolli
Gnutella
Gnutella è uno dei primi sistemi p2p "puri".
La comunicazione tra peers utilizza HTTP.
Ogni messaggio ha un header di 23 bytes:
< identifier > ID univoco del messaggio (16 bytes)
< function > azione che il nodo deve compiere con il messaggio (1 byte)
< TTL > numero di volte che il messaggio deve essere inoltrato ( 1 byte) 
< hops length > numeri di nodi che hanno già ricevuto il messaggio ( 1 byte)
< payload length > lughezza del messaggio che segue (4 bytes)
Gnutella
Tre categorie di messaggi
Goup Membership Messages
Search Messages
File Transfer messages
Ping   messaggio utilizzato per verificare l'attività degli altri nodi
Pong   messaggio di risposta ad un ping, contiene anche altre info
Query   messaggio per cercare i contenuti desiderati
QueryHit   messaggio di risposta quando un nodo soddisfa la query
Get   semplice download di files
Push   permette di scaricare a chi è dietro firewall
Gnutella
Problemi e svantaggi
Scalabilità
Nonostante l'assenza di un server centrale, la scalabilità
rimane un problema, per due fattori principali:
     - Le query si propagano esponenzialmente
     - Ogni nodo che riceve un ping risponde con
        la stessa quantità di dati

Sicurezza
Nello sviluppo del protocollo, non sono state pensate misure
di sicurezza e come conseguenza tutti i messaggi sono
plaintext e quindi possono essere letti o modificati da qualsiasi
peer.
Protocolli
Freenet
Freenet, il cui paper originale risale al 1999,
è una rete p2p "pura", sviluppata con l'intento
di essere completamente libera e non
censurabile, e perciò fornire privacy e sicurezza.
Freenet per la ricerca, la gestione e
l'identificazione dei dati utilizza tre tipi di
chiavi diverse.
Freenet
Tipi di chiavi
Keyword-signed key (KSK)   un coppia di chiavi viene generata
partendo dalla descrizione scritta da chi inserisce il file.
La chiave pubblica viene usata per generare il KSK, mentre
quella privata viene usata per firmare il file.
Signed-subspace key (SSK)   un utente genera casualmente una
coppia di chiavi e inserisce un testo descrittivo per il file.
Sia la chiave pubblica che la descrizione vengono hashati
indipendentemente e viene calcolato lo XOR tra le due.
Il risultato viene hashato e corrisponde all'SSK del file.
Content-hash key (CHK)   corrisponde direttamente all'hash
del file. Inoltre viene generata una chiave casuale per
criptare il file. Entrambi i dati vengono pubblicati.
Freenet
Accedere ad un file
Quando un utente richiede un file, invia semplicemente
un messaggio contenente la chiave del file con anche
specificato un campo TTL.
Ogni nodo controlla la propria disponibilità, e in caso
affermativo invia la risposta al richiedente, mentre
tutti i peers nel percorso salvano il file.
In caso negativo il nodo controlla la propria tabella
di routing e inoltra la richiesta ai nodi con chiavi più
vicine.
Domande?
Fine

Use a spacebar or arrow keys to navigate