# Gnutella

Gnutella è un network e un protocollo di rete Peer to Peer dedicato alla condivisione di file aperta e che dà vita all'omonima rete.
L'approccio è di tipo Peer to Peer puro, ovvero quello in cui non esiste il ruolo di directory da parte dei server (presente invece in programmi quali Napster o eMule); ogni peer (o nodo equivalente) "conosce" alcuni vicini, facendo sì che le richieste vengano propagate all'interno della comunità sfruttando la relazione di vicinanza. Per ovviare al problema che le richieste continuino a girare in circolo, viene normalmente indicato il numero massimo di "salti" (hop), che una richiesta può fare sui peer contigui a partire dal nodo che l'ha generata prima di essere terminata.

## Storia

Nonostante il nome contenga la parola GNU, essa non è parte del progetto GNU e per questo motivo la FSF, custode del progetto GNU, ha chiesto il cambiamento del nome. La seconda parte del nome deriva da Nutella, nome di una crema gianduia prodotta dall'azienda dolciaria italiana Ferrero, presumibilmente molto apprezzata dagli sviluppatori di questa rete.
La prima implementazione del protocollo è stato il programma Gnutella scritto da Justin Frankel e Tom Pepper per la Nullsoft all'inizio del 2000. Il programma fu distribuito un giorno solo, il 14 marzo 2000 e fu scaricato da migliaia di persone, grazie all'annuncio apparso su Slashdot. Il codice sarebbe stato rilasciato in seguito probabilmente sotto licenza GNU GPL. Il giorno dopo AOL, che aveva da poco acquisito la Nullsoft, bloccò la distribuzione del programma per motivi legali e diffidò la Nullsoft dal continuarne lo sviluppo. Nonostante questo, la rete Gnutella sopravvisse sostenuta dalle migliaia di copie scaricate il primo giorno, che continuavano a distribuire il programma. In pochi giorni poi il protocollo fu reingegnerizzato e nacquero nuovi programmi liberi in grado di accedere a questa rete.

## Descrizione

Gnutella è una rete completamente serverless, distribuita. I nodi sono trattati allo stesso modo, indipendentemente dalla banda e dal numero di file condivisi. Ogni nodo si occupa sia di fornire i file che di inviare e rispondere alle richieste di routing degli altri nodi, compito riservato ai server in una rete centralizzata. Ogni nodo, quindi, è sia un client sia un server: è definito a proposito servent.
Ciò consente una forte stabilità della rete, nella quale possono entrare e uscire continuamente nodi senza modificare le prestazioni.
Reti come Emule hanno invece dei server che contengono una tavola hash, ossia un elenco dei file e degli indirizzi IP dove sono scaricabili; in mancanza di questo diviene difficoltosa l'identificazione dei nodi di rete e particolarmente onerosa la fase di ricerca dei file. Gnutella invia messaggi a un elevato numero di nodi, a fronte di ogni ricerca effettuata, con un impegno di banda e di CPU nei vari nodi.
Il protocollo Gnutella attualmente implementato differenzia tra nodi "foglia" (leaf) e "ultranodi" (ultrapeer), al fine di concentrare la maggior parte del traffico di rete verso gli ultranodi, che dedicano alla rete maggiore capacità di banda e di calcolo, risparmiando traffico ai nodi foglia.
I protocolli di cui è composta sono pubblici ed aperti. La sua funzione principale è la ricerca di file all'interno dei nodi della rete stessa, e il successivo trasferimento degli stessi al richiedente.
Gnutella è un tipico esempio di overlay network.

## Applicazioni

Esistono numerose applicazioni che si connettono a questa rete; le più popolari sono (in ordine alfabetico):
* Acquisition (solo per macOS)
* Bearshare
* Cabos
* Envy (eccellente multi-network, attivamente sviluppato)
* FrostWire (solo fino alla versione 4.x)
* Gnucleus
* gtk-gnutella (attivamente sviluppato)
* LimeWire
* MLDonkey
* Morpheus
* PeerProject (multi-network, similare ad "Envy")
* Phex
* Qtella
* QTraxMax
* Shareaza (multi-network ,attivamente sviluppato)
* XoloX