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