Peer-to-Peer

Transcrição

Peer-to-Peer
Telekooperation
Kompaktpraktikum Telekooperation III
Prof. Dr. Max Mühlhäuser
Fachbereich 20 - Informatik
Aufgabenzettel 2
[email protected]
Peer-to-Peer
Implementieren Sie ein Subset des Gnutella 0.4 Protokolls (Revision 1.2). Die Spezifikation des
Protokolls können Sie auf http://www9.limewire.com/developer/gnutella_protocol_0.4.pdf oder
auf der Praktikumshomepage nachlesen, alternativ können Sie bei den Lehrveranstaltungsleitern
eine gedruckte Version anfordern.
Nicht implementieren müssen Sie:
•
Push-Messages: Push-Messages können behandelt werden wie unbekannte Messages – sie
werden verworfen und nicht weitergeroutet
•
Gnutella Protocol Exensions: Wie in Appendix 1 beschrieben
Beachten Sie:
•
Im Gegensatz zur allgemeinen „Network Byte Order“ liegen die meisten Zahlen im LittleEndian Format vor
•
Einzige Ausnahme: Die IP-Adresse wird als Big-Endian übertragen
•
Strings sind nicht wie in Java üblich Unicode, sondern ASCII-Strings. Sie können JavaStrings mit String.getBytes() in die entsprechenden ASCII-Strings umwandeln
•
Messages mit nicht bekannten Payload Descriptors können Sie verwerfen, ebenso
fehlerhafte Pakete
Interoperabilität mit Standard-Clients ist nicht nötig. Ist sie dennoch vorhanden und wird dies in
der Dokumentation erwähnt, so gibt es einen Bonus. Auch bei interoperablen Clients müssen Sie
Push-Messages nicht implementieren.
Vorsicht: Testen Sie Ihr Programm nicht mit dem „echten“ Gnutella-Netzwerk. Ein Bug in Ihrem
Programm könnte folgenschwere Auswirkungen haben.
Milestone 1.1: Join und Ping
Implementieren Sie die Grundfunktionalität, um sich mit dem Netzwerk zu verbinden und das
Netzwerk zu verwalten. Zu implementieren sind:
•
Mit dem Netzwerk verbinden: Verbinden zum anderen Clients mittels Connect-Strings,
Annehmen von Verbindungen anderer Clients
•
Ping-Messages
•
Pong-Messages: Pong-Messages müssen nur für den eigenen Client gesandt werden, die
Erweiterung „multiple Pongs“ muss nicht implementiert werden
Milestone 1.2: Query
Ihr Programm ist bereits Bestandteil des Netzwerks. Allerdings können Sie sonst noch nicht viel
damit machen. Implementieren Sie als nächsten Milestone deshalb die Suche nach „virtuellen“
Dateien. Queries müssen unserer Syntax folgend beantwortet werden, die Dateien müssen aber
nicht wirklich existieren und sie können Phantasienamen verwenden.
Implementieren Sie folgende Pakete:
•
Query
•
QueryHit
Der Syntax der Query ist nicht im Protokoll spezifiziert, verwenden Sie folgende Syntax:
•
Die Query enthält durch Leerzeichen separierte Kriterien
•
Der vollständige Dateiname muss jeden der Kriterien als Teilstring enthalten
•
Gross- und Kleinschreibung werden nicht unterschieden
Beispiel:
•
Freigegeben sind: My
another.cool.thing.mp3
Cool
•
Die Suche nach: „my
another.cool.thing.mp3“
mp3“
•
Die Suche nach: „my o“ gibt zurück: „My Cool Song.mp3, this_is_my_diploma_thesis.tex“
Song.mp3,
gibt
this_is_my_diploma_thesis.tex,
zurück:
„My
Cool
Song.mp3,
01-me.&.my01-me.&.my-
In QueryHit-Messages ist ein Node-Identifier für Push-Messages vorgesehen. Da Push nicht
unterstützt wird, soll dieses Feld mit Nullen ausgefüllt werden.
Milestone 1.3: Instant-Messaging-Erweiterung
Erweitern Sie Gnutella um ein IM-Feature. Nehmen Sie dazu folgende Erweiterungen am
Protokoll vor:
Protokoll-Änderung
Die Chat-Funktionalität soll eine abwärtskompatible Erweiterung des Protokolls sein. Um das zu
erreichen, ändern Sie die Versionsnummer des „protocol version string“ von 0.4 auf 0.4-TK .
Versuchen Sie beim Verbindungsaufbau, zuerst eine Verbindung aufzubauen, die die Version 0.4TK hat. Scheitert dies, versuchen Sie, eine „normale“ 0.4-Verbindung aufzubauen. Speichern Sie,
welche Clients das 0.4-TK Protokoll beherrschen.
Extended Pong
In der Version 0.4-TK hat Pong eine neue Semantik: Es enthält nicht nur die IP-Adresse und die
Menge an geteilten Dateien. Zusätzlich wird auch noch eine frei wählbare User-ID mitgesendet.
Die User-ID Das neue Format der Pong-Message ist also:
Port
Byte offset
0—1
IP Address
Number of Files Shared
Number of Kilobytes Shared
2—5
6—9
10—13
User-ID
14—…
Die User-ID ist wie in Gnutella üblich, ein nul (0x00) terminierter String. Beachten Sie, dass Sie die
Payload-Length dieser extended Pong-Message an die Länge der User-ID anpassen müssen.
Um die Abwärtskompatibilität zu gewährleisten, dürfen diese Extended Pong-Messages nur an
Clients gesendet werden, die auch das 0.4-TK Protokoll beherrschen. Alle anderen Clients dürfen
nur das einfache Pong erhalten.
Buddy-List
Extrahieren Sie aus den Extended Pong-Messages die User-IDs im Netz.
Chat-Message
Um Chat-Botschaften zu übermitteln, definieren Sie eine neue Message. Die Message soll folgende
Eigenschaften haben:
•
Payload-Descriptor: 0x60 = Chat
•
Format:
User-ID from
Byte offset
0—n
User-ID to
n+1—m
Message
m+1—…
•
Im Feld User-ID from steht die User-ID des Senders der Nachricht
•
Im Feld User-ID from steht die User-ID des Empfängers der Nachricht
•
Die Message ist die an das Gegenüber gesendete Botschaft
•
Alle Elemente der Message sind nul terminierte Strings
•
Chat-Messages werden nicht über das Gnutella-Netzwerk geroutet. Stattdessen baut der
Sender eine direkte Verbindung zum Empfänger auf. Er verwendet dazu die im Extended
Pong spezifizierten IP-Adresse und Port des Empfängers
•
Erhält ein Client eine Chat-Message, deren User-ID to nicht seiner eigenen User-ID
entspricht, verwirft er diese
Erweitern Sie auch das Userinterface Ihrer Anwendung derart, dass Sie folgende Möglichkeiten
bietet:
•
Setzen der eigenen User-ID
•
Auswählen eines Gesprächspartners aus einer Buddy-List auszuwählen
•
Senden einer Botschaft an diesen Gesprächspartner
•
Darstellen von eingehenden Botschaften mit der User-ID des Senders und der Botschaft

Documentos relacionados