# Gnutella2

Gnutella2 (kurz G2) ist ein dezentrales Peer-to-Peer-Netzwerkprotokoll das unter anderem zum Filesharing genutzt wird. Es wurde 2002 von Michael Stokes veröffentlicht und ist der Nachfolger von gnutella. Alles bis auf das alte Handshake des gnutella-Protokolls wurde neu entwickelt. Somit ist ein neues System entstanden, welches über andere Paketformate, einen anderen Suchalgorithmus und ein stark verbessertes Metadatensystem verfügt. Gnutella2 hatte 2009 zwischen 250.000 und 300.000 Nutzer je nach Tageszeit und war durch den Client Shareaza bekannt.

## Geschichte

Im November 2002 gab Michael Stokes das Gnutella2-Protokoll im Gnutella Developers Forum bekannt. Darauf gab es einen langen Diskurs unter den Entwicklern und Einige vertraten die Meinung, dass das eigentliche Ziel von Gnutella2 sei, mit dem gnutella-0.6-Protokoll zu brechen und Behelfslösungen zu überwinden. Andere (hauptsächlich Angehörige der LimeWire- und BearShare-Lager) vertraten die Meinung, das sei ein Publicity-Gag und versagten ihre technische Unterstützung. Diese Gruppe weigerte sich, den Namen Gnutella2 zu nennen und sprach nur von „Mike's Protocol“. Ein weiteres Argument sei, dass die angehängte 2 eine Nachfolgeversion des gnutella-Protokolls andeute, was durch die Andersartigkeit nicht stimme.
Das Gnutella2-Protokoll benutzt die alte Handshake-Kennung zum Verbindungsaufbau, wie in der gnutella-0.6-Spezifikation dokumentiert. Während einige dies als Rückwärtskompatibilität sahen, kritisierten andere aus dem GDF dies als Versuch, einen neuen Standard zu etablieren.
So entstand ein Flamewar, hauptsächlich um den führenden BearShare-Entwickler Vincent Falco.
Der Entwurf mit den Spezifikationen wurde am 26. März 2003 veröffentlicht, danach folgten noch ein paar genauere und konkretere Spezifikationen. Gnutella2 (G2) wird von den meisten „alten“ gnutella-Clients nicht unterstützt. Im Gegensatz dazu gibt es eine große Unterstützung der neuen Gnutella2-Clients für das alte Gnutella-Netzwerk. Viele Gnutella2-Fürsprecher behaupten, dass dies aus politischen Gründen so sei, gnutella(1)-Leute entgegnen dagegen, dass es technische Gründe dafür gebe.

## Funktionsweise

Gnutella2 teilt die Nodes in zwei Gruppen ein. Blätter (engl. original leaves) und Hubs. Die Blätter halten nur ein oder zwei Verbindungen zu den Hubs aufrecht, während die Hubs Hunderte von Verbindungen zu den Blättern und anderen Hubs halten. Wenn nun eine Suchanfrage erfolgt, versucht – sofern noch nicht vorhanden – der Node zunächst einmal eine Liste von Hubs zu bekommen und kontaktiert dann die Hubs in dieser Liste. Dabei merkt er sich, welche Hubs schon besucht wurden. Dies wird solange fortgesetzt, bis die Liste abgearbeitet worden ist oder aber eine vordefinierte Suchschranke überschritten wurde. Somit wird sichergestellt, dass ein Benutzer eine weit verbreitete Datei einfach und ohne das Netz zu überlasten finden kann. Theoretisch wäre er sogar in der Lage eine einzelne (einmalige) Datei irgendwo im Netzwerk aufzuspüren.
Die Hubs führen einen Index und wissen so, welche Dateien jedes Blatt anbietet. Der Index, genannt Query Routing Table, ist eine Hashtabelle der Suchbegriffe. Diese Liste der Suchbegriffe lädt das Blatt zum Hub hoch, der Hub generiert daraus eine kombinierte Version mit allen Schlüsselwortlisten der Blätter, die er betreut. Diese kombinierte Liste sendet er nun zu seinen Nachbarhubs, um so die Anzahl der weitergeleiteten Suchanfragen zu reduzieren. Somit kann der Hub die benötigte Bandbreite reduzieren, da Suchanfragen nun nur noch an bestimmte Hubs oder Blätter weitergeleitet werden müssen.
Gnutella2 benutzt ausführlich das User Datagram Protocol (UDP), statt des Transmission Control Protocols (TCP), für seine Suchanfragenpakete. Der Datenoverhead, der durch TCP vorhanden wäre, würde ein Zufallsbewegungssuchsystem unmöglich machen, obwohl selbstverständlich auch UDP Nachteile hat, wie zum Beispiel, dass der Sender keine Informationen darüber erhält, dass der Empfänger seine Nachricht auch erhalten hat. Dies kann jedoch durch das Senden von Antwortpaketen umgangen werden.

## Protokoll-Merkmale

Gnutella2 benutzt ein erweiterbares binär-XML-ähnliches Paketformat. Dieses ist als Antwort auf die vielen Behelfslösungen in gnutella gedacht und soll ermöglichen, dass zukünftige Verbesserungen des Netzwerkes oder Erweiterungen von einzelnen Clients hinzugefügt werden können, ohne dass dadurch Funktionsstörungen in den anderen oder alten Clients entstehen. Viele Entwickler behaupten, dass es somit einfacher wäre, ein Gnutella2-Client zu entwickeln, als einen gnutella-Client. Allerdings sehen andere Entwickler das Generic Gnutella Extension Protocol (GGEP) als schon vorhandene adäquate Lösung für das oben adressierte Problem an.
Gnutella2 setzt SHA1-Hashsummen zur Datei-Identifikation ein. Des Weiteren kommen auch Tiger-Tree-Hashes zum Einsatz, so dass damit eine einzelne Datei zuverlässig parallel von mehreren Quellen (Multi-source-downloading/swarming) heruntergeladen werden kann. Auch wird so das zuverlässige Hochladen von Dateiteilen während des Dateiladens ermöglicht.
Um darüber hinaus ein robustes, vollständiges Suchsystem anbieten zu können, werden in Gnutella2 Metadaten zur verbesserten Benennung und Bewertung des Inhaltes eingesetzt. Damit können vielfältigere Qualitätsinformationen in den Suchergebnissen aufgeführt werden, als dies durch den bloßen Dateinamen möglich wäre. Nodes können diese Informationen sogar weitergeben, wenn sie die bewertete Datei nicht mehr besitzen. Somit können die Benutzer Viren oder Würmer markieren und diese Information den anderen Benutzern zur Verfügung stellen, ohne eine Kopie dieser Viren oder Würmer auf dem Computer behalten müssten.
Zusätzlich nutzt Gnutella2 Datenkompression, um so die für die Verbindungen benötigte Bandbreite zu reduzieren.

## Clients

Einige Gnutella2-Clients:
* Shareaza (Windows), Open Source C++ unter der GPL, meistgenutzter G2-Client mit etwa 93 % Marktanteil.
* Sharelin (Unix), Open Source C++ unter der GPL
* Morpheus (Windows), proprietär.
* Gnucleus (Windows), Open source Kern in C/C++ unter der LGPL.
* Adagio (plattformunabhängig), Open source Ada unter der GPL, Entwicklung Juli 2004 eingestellt
* FileScope (plattformunabhängig), Open source C# unter der GPL
* MLDonkey bis Version 2.8.7 (plattformunabhängig), Open source OCaml unter der GPL

## Fußnoten und Referenzen

* ↑ Shareazas Anteil am Overlay-Netzwerk von G2. Trillinux crawler (G2paranha), abgerufen am 18. September 2008.