# Gnutella2

Gnutella2 (G2) è un protocollo peer-to-peer principalmente sviluppato da Michael Stokes. Ispirato dal protocollo Gnutella, G2 condivide un po' del suo design con l'eccezione del suo metodo di connessione, e adotta un algoritmo di ricerca interamente nuovo.

## Storia

Nel novembre 2002, Michael Stokes ha annunciato il protocollo Gnutella2 nel Gnutella Developers Forum, che ha immediatamente causato uno scisma tra gli sviluppatori. Alcuni pensavano che l'obiettivo del nuovo protocollo fosse quello di staccarsi nettamente dal protocollo Gnutella 0.6 e ripartire in modo che il kludge assumesse una buona organizzazione, per essere di grande effetto e desiderabile. Altri sviluppatori, principalmente quelli di LimeWire e BearShare, pensarono invece ad un'abile ed economica mossa pubblicitaria e negarono alcun merito tecnico. Molte persone di questi gruppi rifiutano tuttora di riferirsi a tale protocollo come "Gnutella2" e lo chiamano invece come "Mike's Protocol" (Protocollo di Mike).
Curiosamente il protocollo Gnutella2 utilizza tuttora la vecchia stringa di handshake "GNUTELLA CONNECT/0.6" per instaurare le sue connessioni come definito nelle specifiche di Gnutella 0.6 che sono state criticate dal GDF come un tentativo di utilizzare la rete Gnutella per il bootstrapping delle nuove, non correlate, reti mentre i propositori della nuova rete sostenevano che il loro intento fosse quello di mantenere una retro-compatibilità con Gnutella per permettere agli attuali client Gnutella di aggiungere Gnutella2 a loro piacimento.
Con gli sviluppatori trincerati nelle loro posizioni, una guerra sui forum si scatenò presto attorno allo sviluppatore di BearShare, Vincent Falco, che perse la calma e cominciò a insultare chiunque non fosse d'accordo con lui.
I progetti furono pubblicati il 26 marzo 2003 seguiti poco dopo da una specifica dettagliata. Gnutella2 (G2) non è supportato da molti dei vecchi clients Gnutella, comunque molti clients Gnutella2 possono anche connettersi a Gnutella. Molti sostenitori di Gnutella2 asseriscono che dietro c'è una motivazione "politica" dietro questa scelta, mentre i sostenitori di Gnutella affermano che ci sono ragioni tecniche che non permetto l'utilizzo del nuovo protocollo.

## Design

Gnutella2 divide i nodi in due gruppi, chiamati leaf e hubs. I leaf mantengono una o due connessioni ad un hubs, mentre gli hubs accettano milioni di leaf contemporaneamente, e diverse connessioni da altri hubs. Quando viene avviata una ricerca, il nodo ottiene una lista di hubs e contatta gli hubs nella lista, notificando quello che si sta cercando, finché la lista non viene terminata, o il limite di ricerca predefinito viene soddisfatto. Questo permette agli utilizzatori di trovare un file popolare facilmente, senza caricare ogni volta il network, che teoricamente mantiene la capacità per un utente di trovare un singolo file localizzato ovunque nel network.
Gli hubs indicizzano i file posseduti da una leaf grazie ad una tabella di routing di ricerca chiamata "Query Routing Table", la quale viene riempita da record contenenti gli hash delle parole chiave e viene inviata dai leaf agli hub, l'hub poi unisce tutte le tabelle ricevute dai suoi leaf in modo da crearne una globale da inviare ai suoi hubs vicini. Questo permette agli hubs di ridurre enormemente l'utilizzo di banda semplicemente non inoltrando le ricerche a leaf e hub vicini se i parametri della ricerca non vengono trovati nelle tabelle di routing.
Gnutella2 si appoggia prevalentemente sul protocollo UDP, anziché sul protocollo TCP, per le ricerche. Il sovraccarico necessario per una connessione TCP renderebbe il sistema di ricerca a Percorso casuale dovendo contattare un grande numero di nodi per piccole quantità di dati; impraticabile. Anche UDP, in ogni caso, ha i suoi difetti. Siccome UDP è un Protocollo connectionless, non c'è modo di notificare ai client che un messaggio è stato ricevuto, quindi non si può sapere se un pacchetto viene perso. Per questo motivo, i pacchetti UDP inviati da client Gnutella2 hanno un flag che aumenta l'affidabilità del pacchetto. Quando un pacchetto UDP con il flag di affidabilità abilitato viene ricevuto, il client risponderà con un pacchetto di acknowledge per informare il client mittente che il pacchetto è arrivato a destinazione. Se il pacchetto di acknowledge non viene inviato, il pacchetto verrà ritrasmesso nel tentativo di assicurarne la consegna. I pacchetti a bassa priorità che non hanno il flag abilitato non richiedono un pacchetto di risposta, riducendone l'affidabilità, ma riducendo anche il sovraccarico poiché non richiedono la trasmissione di nessun pacchetto di acknowledge.

## Caratteristiche del protocollo

Gnutella2 ha un formato estensibile del pacchetto binario, comparabile all'albero di un documento XML, che fu concepito come risposta ai molti Kludges utilizzati in Gnutella. Il formato era stato progettato in modo che futuri miglioramenti della rete e nuove caratteristiche potessero essere aggiunte senza la preoccupazione che questo potessero generare errori in altri client sulla rete.. Mentre gli sviluppatori arrivati dopo la flame war hanno detto che questa caratteristica rende più facile realizzare il codice di un client per Gnutella2 piuttosto che per Gnutella, gli sviluppatori di Gnutella sostengono che il Generic Gnutella Extension Protocol (GGEP) garantisce flessibilità per la realizzazione di estensioni per il protocollo Gnutella 0.6.
Gnutella2 utilizza SHA-1 hashes per l'identificazione dei file e per la verifica sicura dell'integrità dei file stessi. Per permettere ad un file di essere scaricato correttamente da sorgenti multiple, così come per permettere l'upload delle parti di file di cui è già stato effettuato il download (swarming), vengono utilizzati hash Tiger tree.
Per creare un sistema di ricerca completo e robusto, Gnutella2 ha anche un sistema di metadata per una migliore etichettatura, rating e qualità dell'informazione in modo da fornire risultati della ricerca che dovrebbero essere semplicemente raccolti per nome. I nodi possono condividere queste informazioni anche dopo la cancellazioine del file, permettendo agli utenti di segnalare viruses e worm sulla rete senza doverne scaricare una copia.
Gnutella2 utilizza anche la compression nelle sue connessioni di rete per ridurre la banda utilizzata. Shareaza ha caratteristiche aggiuntive per richiedere anteprime di immagini e video, caratteristica che attualmente nessun altro client può vantare.

## Differenze tra Gnutella2 e Gnutella

I due networks sono simili, con una differenza primaria nel formato dei pacchetti e nella metodologia di ricerca.

### Protocollo

Il formato dei pacchetti di Gnutella è stato spesso criticato perché non è stato originariamente realizzato in modo espandibile, ed ha avuto diverse modifiche durante il passare degli anni, lasciando la struttura del pacchetto sempre inefficiente. Gnutella2 ha imparato molto da questo caso, ed oltre ad aver portato molte delle caratteristiche degli standard Gnutella in Gnutella2, è stato adattato per l'espandibilità futura sin dalla nascita.

### Algoritmo di ricerca

Quando Gnutella usa il metodo di ricerca del query flooding, Gnutella2 usa un sistema in cui un nodo di ricerca raccoglie una lista di Hub e li contatta direttamente, uno alla volta. Questo ha molti vantaggi sul sistema di query flooding di Gnutella. È più efficiente, visto che continuare una ricerca non aumenta il traffico di rete, i query non sono indirizzati attraverso molti nodi, ed aumenta la granularità della ricerca, permettendo a un client di fermarsi quando un numero di risultati predefinito è stato ottenuto più efficacemente che in Gnutella. questo incrementa anche la complessità della rete e la sua manutenzione richiesta, così come la richiesta di salvaguardie per prevenire a un virus di usare la rete per un attacco DoS.

### Terminologia

C'è anche una differenza nella terminologia, con i nodi più capaci per condensare la rete che è assegnata come Ultrapeers in Gnutella e come Hub in Gnutella2, e sono anche usati in modi leggermente differenti in topologia. In Gnutella, gli Ultrapeers mantengono un numero relativamente piccolo di leaves e un alto numero di connessioni peer, quando gli Hub di Gnutella2 mantengono molti più leaves, e meno connessioni peer. La ragione di questo è che i metodi di ricerca delle varie reti hanno differenti topologie ottimali.

## Clients

I client Gnutella2 pubblicati come software libero sono:
* Sharelin (GNU/Linux), realizzato in C++, sotto Licenza GPL
* Adagio (Cross Platform), realizzato in Ada, sotto Licenza GPL
* FileScope (Cross Platform), realizzato in C#, sotto Licenza GPL
* Gnucleus (Windows), realizzato in C/C++, sotto Licenza LGPL
* Shareaza (Windows), realizzato in C++, sotto Licenza GPL
* MLDonkey (Cross Platform), realizzato in Ocaml, sotto Licenza GPL
Sono pubblicati, invece, come software proprietario:
* Dianlei
* Kiwi Alpha (Windows)
* Morpheus (Windows)
* Pocket G2 (Windows Pocket PC)
* TrustyFiles (Windows)