Gnutella 0.4

From
Revision as of 10:20, 17 May 2006 by Jeschke (talk | contribs) (Reverted edit of 1147727832, changed back to last version by Theodorescu)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Allgemein

Das Gnutella Protokoll basiert auf TCP/IP Struktur, dabei ist es aber kein Übertragungsprotokoll.
Es ist eine Art Nachrichtensystem mit 5 Nachrichtentypen.
Dabei agiert Gnutella komplett dezentral, ist also ein echtes Peer-2-Peer System. Die einzelnen Clients sind gleichzeitig auch Server, daher werden sie meist als Servents, oder einfach nur Peers, bezeichnet.
Die Verbindung zum Gnutella-Netzwerk wird über Bootstrapping hergestellt.

Zurück zum Index

Bootstrapping

Da Gnutella ein dezentrales Netzwerk ist, braucht man für den ersten Kontakt mindestens eine IP eines Rechners, dabei sollte dieser bereits mit dem Netzwerk verbunden sein. Ursprünglich war der Gnutella-Webserver dieser erste Kontakt. Später wurden dann Listen von IPs veröffentlicht. Wenn man bereits einmal Kontakt hatte, kann man beim zweiten Mal die bereits gesammelten Kontakte durchprobieren um sich mit dem Netzwerk zu verbinden.

Eingliederung in das Netzwerk

Wenn die Verbindung zum Netzwerk steht, macht sich ein Peer bei seinen Nachbarn mittels Ping-Paketen bekannt. Diese werden per Broadcast über alle Verbindungen geschickt und werden durch Pong-Pakete beantwortet. Was diese Pakete genau beinhalten wird weiter unten erklärt.

Zurück zum Index

Message-Pakete

Gnutella ist ein komplett dezentrales Netzwerk. Die einzelnen Peers kommunizieren über Message-Pakete. Diese werden allerdings nicht direkt von Peer zu Peer verschickt, sondern wandern über andere Peers im Netz bis zu ihrem Ziel, dh jeder Peer ist unter anderem mit dem ständigen Weiterleiten von zB Suchanfragen anderer beschäftigt.

Allgemeiner Paket-Aufbau

Die Gnutella-Pakete bestehen aus Header (22 Byte) und einem optinalen Body.
Der Header sieht wie folgt aus:

BytesSegmentBeschreibung
16GUIDEindeutige ID des Peers auch Globally Unique ID
1PayloadPaketart: Ping, Pong, Query, Query-Hit oder Push
1TTLTime To Live, Anzahl der max. Weiterleitungen
1HopsAnzahl bereits erfolgter Weiterleitungen
3Payload LengthGesamtlänge des Pakets inkl. Body

Dabei ist die GUID eine zufällige Zahlenkombination die einen Peer im Gnutella-Netzwerk eindeutig identifiziert. Es ist aber nicht die IP des Peers.
Die TTL soll im Normalfall nicht höher als 7 sein. Mit jeder Weiterleitung eines Pakets wird die Hop-Anzahl inkrementiert und die TTL dekrementiert bis die TTL=0 ist, dann wird das Paket verworfen. Durch die Kombination aus TTL und Hop-Anzahl soll sichergestellt werden, dass Peers ihre TTL nicht netzwerkschädigend hoch wählen.
Um das Ende des einen Pakets und den Anfang des nächsten zu erkennen, muss der Client wissen wieviel Metadaten dem Header folgen, dazu dient die Payload Length.

Das Ping Paket

Das Ping Paket wird nach dem Bootstrapping über alle offenen Verbindungen gesendet. Es dient dem Auffinden neuer Peers zu denen man dann eine direkte Verbindung aufbauen kann, solang man nicht schon über genug Verbindungen zum Netzwerk verfügt. Das Paket enthält keinen Body sondern nur den Header. Es wird durch ein Pong-Paket beantwortet.

Das Pong Paket

Das Pong Paket beantwortet ein Ping, dabei geht es wieder über alle Peers im Netzwerk zum Peer der den Ping losgeschickt hat. Jeder Hop muss also die GUID vergleichen um das Pong Paket passend zum Ping zurückzuleiten. Der Body enthält IP, Port, Anzahl und Gesamtgröße der Dateien des antwortenden Peers.

Das Query Paket

Das Query Paket wird zum Durchsuchen des Gnutella-Netzwerks benutzt. In der ursprünglichen Gnutella-Version konnte man nur nach Strings suchen. Dabei ist die empfohlene maximale Paketgröße 256 Byte und ab einer Größe von 4 KB wird das Paket verworfen. Die ersten 2 Byte des Body beinhalten die gewünschte Downloadgeschwindigkeit, die man bei der Suchanfrage angeben kann. Die restlichen Bytes enthalten den Suchtext. Einige Clients verbesserten diese Suche durch Angabe von XML-Metabeschreibungen für verschiedene Musikrichtungen oder Filmgenres. Das Paket wird per Broadcast losgeschickt und durchs Netz weitergeleitet. Der Suchende bleibt dabei anonym, da nur die GUID als Identifikation mitgeschickt wird. Eine erfolgreiche Suchanfrage wird durch ein Query-Hit Paket gemeldet.

Das Query-Hit Paket

Dieses Paket liefert die Antwort auf eine Suchanfrage. Dabei enthalten die ersten 11 Byte des Body die Anzahl der Ergebnisse, IP, Port und Geschwindigkeit des Peers. Die darauf folgenden Byte enthalten die Ergnisse. Die letzten 16 Byte stellen die GUID des antwortenden Peers dar, diese wird benötigt falls sich der antwortende Peer hinter einer Firewall befindet.

Das Push Paket

Bei Peer-2-Peer kann es immer wieder vorkommen, dass Peers hinter einer Firewall sitzen oder aus anderen Gründen keine direkte Verbindung zu ihnen aufgebaut werden kann. Falls nun der Peer mit der gewünschtn Datei in diese Kategorie fällt, wird das Push Paket vom anfragenden Peer losgeschickt. Dieses enthält die GUID des anbietenden Peers, Datei-Index, IP und Port des anfragenden Peers. Somit kann dann der anbietende Peer die Datei schicken bzw von sich aus die Verbindung aufbauen. Natürlich funktioniert das nur wenn der anfragende Peer direkte Verbindungsanfragen annehmen kann. Für den Fall dass beide Peers hinter Firewalls sitzen hat nur die neue Protokoll-Version eine Lösung.


Zurück zum Index

Dateitransfer

Der Dateitransfer erfolgt nach erfolgreicher Anfrage per "get"-Befehl oder Push-Paket. Es handelt sich dabei um einen normalen HTTP-Dateitransfer zwischen den beiden Servents. Dabei wird die Anonymität aufgegeben, da dies der erste direkte Kontakt der Servents über IP-Adressen ist. Ein Download über einen Webbrowser ist dabei auch möglich, in Kombination mit einer Metasuchmaschine benötigte man also nicht mal einen Gnutella-Softwareclient.

Zurück zum Index