# Gnutella

Gnutella is een gedecentraliseerd P2P-netwerk. Een P2P-netwerk is een netwerk waarbij verschillende computers van over de hele wereld met elkaar verbonden zijn. Door speciale P2P-programma’s te gebruiken kunnen via die verbinding bestanden gedownload en verstuurd worden. Op deze manier wordt veel muziek uitgewisseld.
Gnutella was het eerste totaal gedecentraliseerde protocol voor P2P-applicaties. Met gedecentraliseerd wordt bedoeld dat er geen servers, maar enkel clients aanwezig zijn in het netwerk. Het netwerk werd gelanceerd op 14 maart 2000 en had meer dan 3 miljoen hosts op zijn hoogtepunt. In 2007 was dit het meest gebruikte protocol, met een marktaandeel van 40%. Gnutella is open source.

## Geschiedenis

Na het grote succes van Napster was het logisch dat andere bedrijven ook een product zouden ontwikkelen om bestanden (voornamelijk muziek) online te delen. Napster was echter niet volledig gedecentraliseerd en maakte gebruik van een centrale server die de namen van de nummers bevatte. Hierdoor was het makkelijk om Napster stop te zetten na een rechtszaak. Gnutella daarentegen werkt zonder centrale server en werkt dus volledig peer-to-peer.
De eerste client van Gnutella is ontwikkeld door Justin Frankel en Tom Pepper van Nullsoft, begin 2000 kort na de overname door AOL. Op 14 maart 2000 is het programma online gezet op de Nullsoft server, met een aankondiging op Slashdot. Al op de eerste dag werd dit door duizenden gedownload, en later was ook de broncode beschikbaar onder de GNU General Public License. Wegens onwettigheid haalde AOL de volgende dag het programma van de server en verbood het Nullsoft hier nog verder aan te werken. Het was echter te laat om Gnutella tegen te houden en al snel verschenen er compatibele vrije en open source versies en dit is hoe de ontwikkeling van verschillende clients voor Gnutella is ontstaan.
Bij de afsluiting van Napster begin 2001 zijn veel van deze gebruikers overgestapt op Gnutella-clients, en kreeg men variaties op het protocol die het mogelijk maakten in plaats van elke gebruiker als client en server te gebruiken, sommige gebruikers als een soort ‘super-peers’ te zien. Deze kunnen de vragen en antwoorden beter leiden voor de aangesloten gebruikers. Bijgevolg kreeg men een groei in populariteit. Eind 2001 werd de Gnutella-client Limewire Basic vrij en open source, en ook Morpheus verliet zijn FastTrack-gebaseerde peer-to-peersoftware en bracht in februari 2002 een client uit gebaseerd op het Gnutella-protocol. Zodoende staat Gnutella tegenwoordig niet meer voor bepaalde projecten of software, maar voor het protocol dat hier wordt gebruikt voor het delen van bestanden.

## Architectuur

Gnutella is volledig gedecentraliseerd en werkt dus zonder centrale server. Elke computer heeft namelijk een functie als client en server, en op deze manier wordt de vraag naar een bestand in 6 à 7 stappen doorgestuurd naar duizenden andere clients. Het eerste dat een client moet doen bij het opstarten van de software is een verbinding zoeken met een of enkele andere clients om een vraag aan door te geven en dit gebeurt door middel van een bijgeleverde adreslijst of een geüpdatete webcache van bekende nodes, UDP-hostcaches en heel zelden zelfs IRC. Op deze manier verkrijgt de client een lijst van werkende nodes. Wanneer er een vraag (query) wordt doorgestuurd zullen de aangesloten computers controleren of ze dit nummer op hun lokale harde schijf hebben staan en is dit het geval, stuurt deze de bestandsnaam en het IP-adres naar de vrager. Tegelijkertijd sturen al deze machines dezelfde vraag door naar de computers aan welke zij zijn verbonden en dit herhaalt zich. Elke vraag heeft ook een ‘TTL’ (Time To Live) waarmee de vraag wordt gelimiteerd. Een vraag kan zo 6 of 7 stappen ver gaan, dus als elke computer verbonden is met 4 andere betekent dit dat de vraag tot ongeveer 8000 machines kan gaan wanneer deze 7 stappen diep gaat.
In praktijk kan dit overbelast raken en ziet men ‘bottlenecks’ ontstaan bij gebruikers met tragere verbindingen, maar hiervoor zijn al meerdere oplossingen ontwikkeld. Zo heeft men al snel het gebruik van ‘ultrapeers’ en ‘leaves’ ingevoerd, zodat machines die in staat zijn om berichten te routen hiervoor worden gebruikt en nodes die het netwerk betreden opzij worden gehouden als ‘leaves’. Op deze manier kunnen zoekopdrachten verder vooruitgang maken in het netwerk en heeft men de mogelijkheid om allerlei veranderingen in de topologie te maken die de effectiviteit en schaal van het systeem verbeteren.
Bovendien heeft Gnutella enkele technieken opgenomen om het verkeer te verminderen en zoekopdrachten efficiënter te maken. Opvallende vernieuwingen zijn de Query Routing Protocol (QRP) en Dynamic Querying (DQ). QRP zorgt ervoor dat een zoekopdracht enkel deze machines bereikt die waarschijnlijk het bestand bezitten, terwijl DQ ervoor zorgt dat de zoekopdracht wordt stopgezet als het programma genoeg antwoorden heeft gekregen. Dit laatste vermindert vooral het verkeer bij populaire zoekopdrachten.
Dit is een heel simpele, maar zeer doordachte strategie om snel vele machines te bereiken, met als grote voordeel dat het altijd werkt, zolang men maar verbinding heeft met 1 machine die Gnutella-software draait. Dit heeft ook nadelen:
* Het kan een tijd duren voor een vraag door de 7 stappen is en een antwoord wordt teruggestuurd.
* Men heeft geen garantie dat het bestand dat men zoekt zich op een van deze 8000 machines bevindt.
* Men is zelf ook deel van het netwerk en jouw eigen computer zal dus ook zelf vragen beantwoorden en doorsturen, met de nodige daling in bandbreedte als gevolg.
Door de gedecentraliseerde structuur is het enorm moeilijk om het netwerk af te sluiten, want er is geen enkele machine die alles controleert, of te controleren welke bestanden er worden uitgewisseld, wat ook een gevolg is van de vele Gnutella-clients die het netwerk delen. Dit is het grootste verschil met Napster waarin de bestandsnamen wel op een centrale server stonden waardoor deze dienst veel eenvoudiger kon worden stopgezet.

## Functies

Toen Gnutella werd gelanceerd, werkte dit volledig op een zogenaamd ‘query flooding’-gebaseerd protocol. Dit is nog duidelijk te zien in versie 0.4 (verouderd) waarin men werkte met 5 verschillende types pakketten:
* Ping: zoeken/ontdekken van hosts in het netwerk
* Pong: antwoord op ping
* Query: zoekopdracht voor bestand
* Query hit: antwoord op query
* Push: download de vraag voor een bepaalde machine
Deze pakketten dienen vooral voor het zoeken in het Gnutella-netwerk. De daadwerkelijke bestandsoverdracht gebeurt via HTTP. De ontwikkeling van het Gnutella-protocol wordt geleid door het Gnutella Developers Forum, en men heeft al vele nieuwe uitbreidingen ontwikkeld waardoor men aan versie 0.6 zou zijn maar vermits dit door allemaal onafhankelijke ontwikkelaars wordt gerealiseerd, is men er nog niet in geslaagd een gefinaliseerde versie 0.6 samen te stellen.

## Vergelijking met Napster

Zowel Napster als Gnutella zijn systemen voor het delen van bestanden in een peer-to-peernetwerk, met 2 grote gelijkenissen:
* Gebruikers plaatsen hun bestanden die ze willen delen op hun harde schijf en maken deze beschikbaar voor iedereen om te downloaden op een peer-to-peermethode.
* Gebruikers gebruiken Gnutella-software (zie ‘Clients’) om te verbinden met het Gnutella-netwerk.
Er zijn echter ook verschillen tussen het oudere Napster en Gnutella:
* Er is geen centrale database die weet welke bestanden er allemaal beschikbaar zijn, in plaats daarvan zeggen alle machines aan elkaar welke bestanden beschikbaar zijn via een verdeling van de vraag.
* Er bestaan veel verschillende clientprogramma’s om toegang te krijgen tot het Gnutella-netwerk, terwijl bij Napster hiervoor maar een enkele applicatie bestond.

## Clients

Programma’s die met Gnutella werken zijn onder andere:
* Acquisition
* BearShare
* Cabos
* GnucDNA
* gift-gnutella (plugin)
* Gnucleus
* gtk-gnutella
* KCeasy
* LimeWire (is niet meer operationeel na versie 5.5.10)
* MLDonkey
* Morpheus
* Phex
* Shareaza
* Swapper
* Symella
* XoloX

## Trivia

De naam Gnutella is een samentrekking van GNU en Nutella. Vermoedelijk aten de ontwikkelaars, Justin Frankel en Tom Pepper, veel Nutella tijdens de ontwikkeling van het originele protocol, dat uitgebracht werd onder de GNU General Public License (GPL). Nutella is de merknaam van een populaire chocolade-hazelnootpasta van het Italiaanse bedrijf Ferrero. In veel talen worden beide namen identiek uitgesproken.

## Misvattingen

Nadat LimeWire gesloten is, zijn er veel misvattingen geweest. zoals ‘LimeWire is illegaal’: dat klopt, LimeWire is verboden, maar het Gnutella-netwerk niet. Slechts 1 client van het Gnutella-netwerk is geblokkeerd, niet het gehele netwerk. Dit wil zeggen dat het gebruik van een client die het Gnutella-netwerk gebruikt nog steeds mogelijk, en op een bepaalde hoogte ook nog legaal is.