Algorithmen für Peer-to-Peer-Netzwerke Vorlesungsskript 1.-13. Vorlesung Version 4.4.1 Sommersemester 2004 Christian Schindelhauer Peter Mahlmann Heinz Nixdorf Institut Fakultät EIM, Institut für Informatik Universität Paderborn 1. Oktober 2004 Inhaltsverzeichnis Abbildungsverzeichnis VII Tabellenverzeichnis 1 2 3 Organisation 1.1 Inhalte der Veranstaltung . 1.2 Organisation . . . . . . . . 1.2.1 Termine . . . . . . 1.2.2 Vorlesungsmaterial 1.2.3 Prüfung . . . . . . 1.2.4 Übungen . . . . . 1.3 Literatur und Links . . . . 1.4 Prüfungsfragen . . . . . . IX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 1 1 1 2 2 3 4 Peer-to-Peer-Netzwerke der ersten Generation 2.1 Was ist ein Peer-to-Peer-Netzwerk? . . . . 2.2 Napster . . . . . . . . . . . . . . . . . . . 2.2.1 Geschichte . . . . . . . . . . . . . 2.2.2 Aufbau . . . . . . . . . . . . . . . 2.2.3 Diskussion . . . . . . . . . . . . . 2.3 Gnutella in der Originalversion . . . . . . . 2.3.1 Aufbau . . . . . . . . . . . . . . . 2.3.2 Diskussion . . . . . . . . . . . . . 2.4 Kazaa, Gnutella (II), Morpheus . . . . . . . 2.5 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 7 8 8 8 9 9 9 10 12 13 Skalierende Peer-to-Peer-Netzwerke 3.1 Warum manche Netzwerke nicht skalieren . . . . . . . 3.2 Distributed Hash-Table . . . . . . . . . . . . . . . . . 3.3 CAN — Content Addressable Network . . . . . . . . 3.3.1 Aufbau . . . . . . . . . . . . . . . . . . . . . 3.3.2 Die Balancierung der Zonen nach dem Aufbau 3.3.3 Die Join-Operation . . . . . . . . . . . . . . . 3.3.4 Entfernen eines Peers . . . . . . . . . . . . . . 3.3.5 Defragmentierung . . . . . . . . . . . . . . . 3.3.6 Ungleichungen der Wahrscheinlichkeitstheorie 3.3.7 Realitäten . . . . . . . . . . . . . . . . . . . . 3.4 CHORD: Konsistentes Hashing für P2P-Netzwerke . . 3.4.1 Die Datenstruktur von Chord . . . . . . . . . . 3.4.2 Suche in Chord . . . . . . . . . . . . . . . . . 3.4.3 Aufnehmen von Peers . . . . . . . . . . . . . 3.5 Koorde . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 15 16 18 18 18 21 21 21 22 26 26 26 29 29 30 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I 3.6 3.7 3.8 3.9 4 5 3.5.1 Der DeBrujin-Graph . . . . . . . . . . . . . . . . . . . . . . . 3.5.2 Die Topologie von Koorde . . . . . . . . . . . . . . . . . . . . 3.5.3 Eigenschaften von Koorde . . . . . . . . . . . . . . . . . . . . Tapestry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.6.1 Grundlegende Terminologie . . . . . . . . . . . . . . . . . . . 3.6.2 Nachbarschaftsmengen . . . . . . . . . . . . . . . . . . . . . . 3.6.3 Eigenschaften der Nachbarschaftsmengen und Routing . . . . . 3.6.4 Objekte und Routing . . . . . . . . . . . . . . . . . . . . . . . 3.6.5 Surrogate-Routing . . . . . . . . . . . . . . . . . . . . . . . . 3.6.6 Einfügen neuer Peers . . . . . . . . . . . . . . . . . . . . . . . Pastry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.7.1 Die Zeigerstruktur . . . . . . . . . . . . . . . . . . . . . . . . 3.7.2 Einfügen von Peers . . . . . . . . . . . . . . . . . . . . . . . . 3.7.3 Routing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.7.4 Experimentelle Resultate . . . . . . . . . . . . . . . . . . . . . 3.7.5 Pastry versus Tapestry . . . . . . . . . . . . . . . . . . . . . . Viceroy — Ein Butterfly basiertes Peer-to-Peer-Netzwerk . . . . . . . . 3.8.1 Der Butterfly-Graph . . . . . . . . . . . . . . . . . . . . . . . 3.8.2 Übersicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.8.3 Einfügen eines Peers . . . . . . . . . . . . . . . . . . . . . . . 3.8.4 Lookup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.8.5 Eigenschaften von ViceRoy . . . . . . . . . . . . . . . . . . . 3.8.6 Das Prinzip der mehrfachen Auswahl (principle multiple choice) 3.8.7 Resumee . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Distance Halving . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.9.1 Kontinuierliche Graphen . . . . . . . . . . . . . . . . . . . . . 3.9.2 Einfügen von Peers in Distance-Halving . . . . . . . . . . . . . 3.9.3 Lookup in Distance-Halving . . . . . . . . . . . . . . . . . . . 3.9.4 Resumee Distance-Halving . . . . . . . . . . . . . . . . . . . . Epidemische Algorithmen und Datenaggregation 4.1 Epidemische Algorithmen . . . . . . . . . . . . . . 4.1.1 Replizierte Datenbanken . . . . . . . . . . . 4.1.2 Mathematische Modellierung von Epidemien 4.1.3 Epicast . . . . . . . . . . . . . . . . . . . . 4.1.4 Anruf-Model (Random Call) . . . . . . . . . 4.1.5 Ausbreitungsverhalten im Push-Modell . . . 4.1.6 Eine einfache Terminierungsstrategie . . . . 4.1.7 Shenkers Min-Counter-Algorithmus . . . . . 4.2 Datenaggregation . . . . . . . . . . . . . . . . . . . 4.2.1 Zählen . . . . . . . . . . . . . . . . . . . . 4.2.2 Der Average-Algorithmus . . . . . . . . . . 4.2.3 Experimentelle Resultate . . . . . . . . . . . 4.2.4 Weitere Aggregations-Funktionen . . . . . . 4.2.5 Resumee . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 32 33 35 35 35 35 36 38 38 41 41 43 44 48 50 50 51 52 53 53 54 55 56 56 56 57 58 59 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 61 61 62 63 63 65 73 73 75 75 76 77 79 79 Routing und Sicherheit 5.1 Sicherheit in Peer-to-Peer-Netzwerken . . . . . . . . . . . . . 5.1.1 Methoden der Kryptographie . . . . . . . . . . . . . . 5.1.2 Sicherheitsanforderungen in Peer-to-Peer-Netzwerken 5.1.3 Die Sybil Attacke . . . . . . . . . . . . . . . . . . . . 5.1.4 Der Sybil-Abwehransatz John Douceur . . . . . . . . 5.1.5 Das Problem der byzantinischen Generäle . . . . . . . 5.1.6 Ein Zensor-Resistentes Peer-to-Peer-Netzwerk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 81 81 82 83 84 84 87 II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Routing in Peer-to-Peer-Netzwerken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.1 Techniken für CAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.2 Routing-Techniken für CHORD: DHash++ . . . . . . . . . . . . . . . . . . . . . Literaturverzeichnis 88 88 89 96 III IV Abbildungsverzeichnis 2.1 2.2 2.3 2.4 2.5 Funktionsweise von Napster . . . . . . . . . . . . . Anbindung von neuen Knoten in Gnutella . . . . . . Dateisuche in Gnutella . . . . . . . . . . . . . . . . Das Gnutella-Netzerk (Schnappschuss 2000) [JAB01] Eine hybride Netzwerkstruktur . . . . . . . . . . . . 3.1 3.2 3.3 3.4 Die Client-Server-Struktur von Napster entspricht einem Stern-Graph [JAB01] . . . . . . 15 Ein zufälliger Graph, der die Struktur von Gnutella symbolisieren soll . . . . . . . . . . . 16 Der Standardansatz einer Hash-Tabelle ist nicht geeignet als Peer-to-Peer-Netzwerk . . . 17 Bei der verteilten Hash-Tabelle wird jedem Peer (farbiger Kreis) ein Bereich zu geordnet. Alle Daten (Rechtecke) die auf diesen Bereich abgebildet werden, werden entsprechen den Peers zugeordnet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Nach dem Einfügen eines Peers sind nur die Zuordnungen der benachhbarten betroffen . . 18 Das Löschen eines Peers in der DHT betrifft nur die Bereiche der direkten Nachbarn . . . 18 Der Aufbau der Zonen in CAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Iterierte Join-Operationen als Random Tree . . . . . . . . . . . . . . . . . . . . . . . . . 21 Verläßt ein Knoten das CAN-Netzwerk, übernimmt sein Nachbar das Gebiet . . . . . . . 22 Der einfache Fall der Defragmentierung in CAN . . . . . . . . . . . . . . . . . . . . . . 23 Der schwierige Fall der Defragmentierung in CAN . . . . . . . . . . . . . . . . . . . . . 23 Konsistentes Hashing in der Chord-Datenstruktur . . . . . . . . . . . . . . . . . . . . . . 27 Die Zeigerstruktur von Chord. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 Der Suchalgorithmus für die Chord-Datenstruktur . . . . . . . . . . . . . . . . . . . . . 29 Schlüsselsuche im Chord P2P-Netzwerk . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Die Shuffle-Operation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Die Exchange-Operation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Die Shuffle-Exchange-Operation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Jeder String lässt sich durch m Shuffle- oder Shuffle-Exchange-Operationen in jeden beliebigen anderen überführen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Der DeBrujin-Graph für 8 Knoten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 Der selbe DeBrujin-Graph. Die Knoten sind sortiert auf dem Ring aufgetragen. . . . . . . 32 Die Verbindungsstruktur der DeBrujin-Kanten auf dem Ring. . . . . . . . . . . . . . . . . 33 Der Eingrad der Knoten in Koorde ist mit hoher Wahrscheinlichkeit O(log n) . . . . . . . 34 Ein Grad-3-DeBrujin-Graph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Nachbarschaft des Peers 4227. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 Publikation von Objekten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Routing im Tapestry Netzwerk. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Beispiel einer Pastry-Routing-Tabelle [Aus einem Web-Dokument von Druschel und Rowstron, das nicht zitiert werden soll] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 Die Pastry-Zeigerstruktur im Knoten 001 für b = 2 und ` = 2 . . . . . . . . . . . . . . . 42 Pastry-insert.pdf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Nach dem Einfügen von Peer 11 werden nicht alle notwendigen Einträge aktualisiert . . . 44 Der Reparatur-Mechanismus für Pastry . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Pastry-Routing-Alg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16 3.17 3.18 3.19 3.20 3.21 3.22 3.23 3.24 3.25 3.26 3.27 3.28 3.29 3.30 3.31 3.32 3.33 V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 11 11 12 13 3.34 Beim Einfügen eines Peers in Pastry, kann man die Latenzzeiten des Routing klein halten, indem man latenznahe Knoten eines Levels bevorzugt [DR01b] . . . . . . . . . . . . . . . 3.35 Die Latenzzeiten der Level i-Sprünge steigen bei Pastry expontiell in i an [DR01b] . . . . 3.36 Durchschnittliche Anzahl von Hops beim Routing von Pastry mit steigender Knotenanzahl (b = 4, ` = 16 und |M | = 32) [DR01b] . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.37 Verteilung der Hops beim Routing von Pastry mit steigender Knotenanzahl (b = 4, ` = 16, |M | = 32 und n = 106 ) [DR01b] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.38 Pastry-latency.pdf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.39 Güte der Routing-Table von Pastry vor und nach dem Ausfall von 500 von 5.000 Peers und nach Abschluss der Repeartur-Routine [DR01b] . . . . . . . . . . . . . . . . . . . . . . . 3.40 Der Butterfly-Graph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.41 Die Viceroy-Umsetzung eines Butterfly-Graphen aus [MNR02] . . . . . . . . . . . . . . 3.42 Der Suchalgorithmus für die Viceroy-Datenstruktur . . . . . . . . . . . . . . . . . . . . . 3.43 Links- und Rechts-Kanten des kontinuierlichen Graphen des Distance-Halving-Peer-toPeer-Netzwerks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.44 Durch die Diskretisierung eine kontinuierlichen Graphen ensteht das Distance-HalvingNetzwerkt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.45 Der Suchalgorithmus für das Distance-Halving-Netzwerk . . . . . . . . . . . . . . . . . 3.46 Rekursiver Lookup-Aufruf von Distance-Halving falls der Start-Peer sich links vom ZielPeer befindet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.47 Rekursiver Lookup-Aufruf von Distance-Halving falls der Start-Peer sich rechts vom ZielPeer befindet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.48 Congestion-optimierter Suchalgorithmus für das Distance-Halving-Netzwerk . . . . . . . 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 4.12 4.13 4.14 Replizierte Datenbanken sollen den gleichen Datenbestand verteilt unterhalten ohne dass Knoten und Kantenausfälle dies beeinträchtigen . . . . . . . . . . . . . . . . . . . . . . . Informationsverbreitung im Push-Modell . . . . . . . . . . . . . . . . . . . . . . . . . . Informationsverbreitung im Pull-Modell . . . . . . . . . . . . . . . . . . . . . . . . . . . Informationsverbreitung im Push&Pull-Modell . . . . . . . . . . . . . . . . . . . . . . . Beispielhafte Informationsverbreitung im Push-Modell . . . . . . . . . . . . . . . . . . . Wachstumsphasen im Push-Modell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Beispielhafte Informationsverbreitung im Pull-Modell . . . . . . . . . . . . . . . . . . . Wachstumsphasen im Pull-Modell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Beispielhafte Informationsverbreitung im Push&Pull-Modell . . . . . . . . . . . . . . . . Wachstumsphasen im Push&Pull-Modell . . . . . . . . . . . . . . . . . . . . . . . . . . Häufigkeit der einzelnen Zustände des Min-Counter-Algorithmus . . . . . . . . . . . . . Der Average-Algorithmus zur Daten-Aggregation . . . . . . . . . . . . . . . . . . . . . . Experimentell Verifikation des Average-Aggregations-Algorithmus [JM04] . . . . . . . . Zählen der Peers durch Datenaggregation in einem dynamischen Netzwerk [JM04] . . . . Der übergelaufene General X gibt widersprüchliche Anweisungen . . . . . . . . . . . . . Unauflösbare Verwirrung unter den Generälen . . . . . . . . . . . . . . . . . . . . . . . . Der loyale General gibt konsistente Befehle . . . . . . . . . . . . . . . . . . . . . . . . . Eine Mehrheitsentscheidung unter den drei Offizieren kann von dem Überläufer nicht gestört werden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.5 byz-loes-3.pdf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.6 Struktur des Peer-to-Peer-Netzwerks von [FS02] . . . . . . . . . . . . . . . . . . . . . . . 5.7 Zwei Realitäten eines (zwei-dimensionalen) CAN-Peer-to-Peer-Netzwerks . . . . . . . . 5.8 Hop-Distanz-Verringerung durch Erhöhung der Dimension und der Anzahl der Realitäten in CAN [RFH+ 01] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.9 Iterativer Lookup in Chord . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.10 Rekursiver Lookup in Chord . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.11 Vergleich von iterativen und rekursiven Lookup in Chord [DLS+ 04] . . . . . . . . . . . . 5.12 Wahl der Finger in Chord durch Proximity Neighbor Selection (PNS) [DLS+ 04] . . . . . 5.1 5.2 5.3 5.4 VI 47 47 48 49 49 50 51 53 54 56 57 58 58 58 59 62 63 64 64 66 68 69 71 71 72 74 76 78 78 85 85 86 86 86 87 89 90 91 91 92 93 5.13 5.14 5.15 5.16 5.17 Vergleich von PNS, PRS und deren Kombination in Chord [DLS+ 04] . . . . . . . . (0, 1; 0, 5; 0, 9)-Perzentile eines solchen PNS-samples verschiedener Größ[DLS+ 04] Routing Zeit eines PNS-16-samples im Vergleich zu PNS in Chord [DLS+ 04] . . . . Kumulativer Performanz-Gewinn in DHash++ [DLS+ 04] . . . . . . . . . . . . . . . Vergleich von STP und TCP in DHash++ [DLS+ 04] . . . . . . . . . . . . . . . . . VII . . . . . . . . . . . . . . . 93 94 94 96 97 VIII Tabellenverzeichnis 2.1 Nachrichtentypen in Gnutella . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.1 Notation des Routing-Algorithmus von Pastry in Abbildung 3.33 . . . . . . . . . . . . . . 45 IX X Kapitel 1 Organisation 1.1 Inhalte der Veranstaltung 1. Vorlesung Ein Peer-to-Peer-Netzwerk (P2P-Netzwerk) ist ein Kommunikationsnetzwerk, in dem die Teilnehmer so- 23.04.2004 wohl Client als auch Server-Aufgaben wahrnehmen. Hierfür stehen den Teilnehmer nur bidirektionale Verbindungen zur Verfügung, wobei zentrale Strukturen absichtlich vermieden werden. Bekannt und beliebt sind solche Kommunikationsnetzwerke durch die Dateitauschbörsen im Internet geworden wie (seiner Zeit) Napster und Gnutella. Im Rahmen dieser Veranstaltung werden algorithmische Ansätze zur effizienten Realisierung solcher Netzwerke vorgestellt und diskutiert. Nach einem kurzen Überblick über die Einsatzmöglichkeiten von P2P-Netzwerken in der Praxis wenden wir uns ihm Hauptteil der Veranstaltung den algorithmischen Problemstellungen zu. Wir stellen hier unter anderem die P2P-Netzwerke CAN, Chord, Pastry und Tapestry vor, die vollständig ohne zentrale Strukturen auskommenund werden ihre Effizienz mathematisch untersuchen. Danach wenden wir uns der Zuverlässigkeit und Sicherheit von P2P-Netzerken zu. Als Ausblick wird der Zusammenhang von P2PNetzwerken und mobilen Ad-Hoc-Netzerken diskutiert. 1.2 Organisation Aktuelle Informationen zu dieser Veranstaltung befinden sich auf der Web-Seite: http://wwwcs.upb.de/cs/ag-madh/WWW/Teaching/2004SS/AlgoP2P/ Für weitere organisatorische Fragen stehen Christian Schindelhauer ([email protected]) und Peter Mahlmann ([email protected]) immer gerne zur Verfügung. 1.2.1 Termine Die Vorlesung findet vom 23.04.2004 - 30.07.2004 jeden Freitag von 9-11 Uhr in Raum F0.530 statt. Die Übungen vom 26.04.2004 - 26.07.2004 sind in drei Gruppen unterteilt. • Übungsgruppe A, montags von 10-11 Uhr in Raum F0.530 • Übungsgruppe B, montags von 11-12 Uhr in Raum F0.530 • Übungsgruppe C, montags von 16-17 Uhr in Raum F0.530 1.2.2 Vorlesungsmaterial Zu dieser Veranstaltung wird das folgende Material zur Verfügung gestellt. 1 • Die Webseite der Veranstaltung: http://wwwcs.upb.de/cs/ag-madh/WWW/Teaching/2004SS/AlgoP2P/ mit allen Informationen und insbesondere diesem Skript • Vorlesungsfolien im Powerpoint und PDF-Format • Skript als PDF-Dokument Neben den Übungsaufgaben ist das Skript die Grundlage zur Prüfung. Das Skript wird gegen Ende der Vorlesung auf der Web-Seite zur Verfügung gestellt. • Literaturhinweise werden hier im Skript auf Seite 3 aufgeführt. • Übungsaufgaben Die Übungsaufgaben werden am Mittwoch jeder Woche auf der Web-Site zur Verfügung gestellt. Die Übungsaufgaben sind ausdrücklich Bestandteil der Prüfung. Die Lösungen zur Übungsaufgabe werden vom Veranstalter nicht zur Verfügung gestellt. • Mögliche Prüfungsfragen werden im Skript veröffentlicht auf Seite 4. • Übungsanmeldung und Anmeldung zum Vorrechnen geschieht durch das StudInfo{flex}-System (entwickelt von der Fachgruppe Kastens). Es ist verfügbar über die URL: https://studinfo.upb.de/cgi-bin/go?c=p2p_2004ss&m=account • Anmeldung zur mündlichen Prüfung per EMail an Christian Schindelhauer ([email protected]) 1.2.3 Prüfung Wer nach der DPO 4 oder der neuen Lehramtsstudienordnung studiert, kann im Anschluss an dieser Veranstaltung eine benotete, mündliche, ca. 30-minütige Prüfung bei Christian Schindelhauer ablegen. Eine Stunde vor dieser mündlichen Prüfung wird dem Teilnehmer eine der Aufgaben aus der Übung vorgelegt, die er alleine ohne Hilfsmittel schriftlich bearbeiten muss und deren Lösung er in der mündlichen Prüfung vorstellt. Zusätzlich werden (natürlich) Fragen zur Vorlesung gestellt. Ein Katalog möglicher Fragen findet sich in diesem Skript. Der schriftliche Teil der Prüfung kann durch erfolgreiche Teilnahme in der Übung ersetzt werden. Die Teilnahme an der Übung war erfolgreich, wenn mindestens eine Aufgabe vor den Teilnehmern richtig vorgerechnet wurde und diese Aufgabe mustergültig schriftlich bearbeitet wurde. Die Teilnahme an der Übung wird dann entsprechend der Leistung benotet und diese Note fließt in die Notengebung der mündlichen Prüfung ein. Die Prüfungen finden in den beiden folgenden Woche statt. • I. Prüfungszeitraum: 13.-17.09.2004 (10-17 Uhr) • II. Prüfungszeitraum: 04.-08.10.2004 (10-17 Uhr). Das ist die Woche vor Vorlesungsbeginn des Wintersemesters. Zusätzlich wird eine öffentliche mündliche Prüfung im Rahmen der letzten Vorlesung am Freitag, den 30.07, 9-11 Uhr in F0.530 durchgeführt. Die Prüfungsanmeldung ist bis zum 30.07. per EMail an Peter Mahlmann ([email protected]) möglich. Weitere Prüfungen sind in Ausnahmefällen nach Vereinbarung möglich. 1.2.4 Übungen Wie bereits beschrieben werden die Übungsaufgaben auf den Web-Seiten jeden Mittwoch zur Verfügung gestellt. Die Besprechung der Lösung geschieht (in der Regel) am darauf folgenden Montag. Die Aufgabenstellungen werden gemäß der Ausrichtung dieser Veranstaltung hauptsächlich aus dem Gebiet der verteilten Algorithmen und Wahrscheinlichkeitstheorie gewählt. 2 Die Gruppeneinteilung geschieht online über das StudInfo{flex}-System. Es gibt drei Übungsgruppen mit einer maximalen Teilnehmerzahl von jeweils 30 Studenten1 . 1.3 Literatur und Links Folgende Bücher, Artikel und Web-Seiten können zur vertiefenden Lektüre besonders empfohlen werden. • O’Reilly Network: OpenP2P http://www.openp2p.com/ Diese praktisch orientierte Web-Site ist eine Fundgrupe für die aktuelle Entwicklung im Bereich von Peer-to-Peer-Netzwerken. Diese Web-Site richtet sich and die breitere Öffentlichkeit und hat daher wenig wissenschaftliches zu berichten . . . . • CAN: A Scalable Content-Addressable Network von Sylvia Ratnasamy, Paul Francis, Mark Handley, Richard Karp und Scott Shenker [RFH+ 01] beschreibt einen der ersten Ansätze den Peer-toPeer-Netzwerke mit effizienten Datenstrukturen zu Leibe zu rücken. Dieser Artikel ist (fast vollständig) Bestandteil der Vorlesung und eignet sich hervorragen zu vertiefendem Studium. • Chord: A Scalable Peer-to-peer Lookup Service for Internet Applications von Ion Stoica, Robert Morris, David Karger, M. Frans Kaashoek und Hari Balakrishnan [SMK+ 01] beschreibt erstmals ein Peer-to-Peer-Netzwerk mit logarithmischen Zeitverhalten. Auch dieser Artikel wird fast vollständig im Rahmen dieser Veranstaltung behandelt. Eine Lektüre kann nur empfohlen werden. • Koorde: A simple degree-optimal distributed hash table, von David R. Karger und M. Frans Kaashoek [KK03]. Das Peer-to-Peer-Netzwerk Koorde besticht durch seine einfache elegante Struktur. Auch der Artikel ist lesenswert. • Tapestry: An Infrastructure for Fault-tolerant Wide-area Location and Routing von Ben Y. Zhao, John Kubiatowicz, und Anthony D. Joseph [JZK02] gibt eine ausführliche Beschreibung des Tapestry-Peer-to-Peer-Netzwerks wieder. • Pastry: Scalable, distributed object location and routing for large-scale peer-to-peer systems von Peter Druschel und Antony Rowstron [DR01b] beschreibt ein Peer-to-Peer-Netzwerk, das wie Tapestry auf Plaxtons Routing-Algorithmus aufbaut. Dennoch gehen hier die Leute von Microsoft Research andere Wege als die von der UC Berkeley. • Viceroy [MNR02] Dieses Peer-to-Peer-Netzwerk basiert auf dem Butterfly-Graphen und wird im Rahmen dieser Vorlesung vorgestellt. Es war das erste Peer-to-Peer-Netzwerk mit konstanten Einund Ausgrad. • Distance Halving [NW03] Dieser Ansatz von denselben Autoren konzentriert sich auf den Übergang von kontinuierlichen Graph zu diskreten (Peer-to-Peer-) Netzwerken. • Epidemic Algorithms [DGH+ 87] In diesem wichtigen Artikel wird der Begrich der epidemischen Algorithmen zur Informationsverbreitung in replizierten Datenbanken eingeführt. Ein wegweisender Artikel besonders für den Bereich der verteilten Datenbanken. • Randomized Rumor Spreading [KSSV00] Dieser Artikel analysiert das Ausbreitungsverhalen im Anrufmodell (random call model) von Gerüchten (epidemischen Algorithmen). Insbesondere wird hier ein sehr effizienter Terminierungsmechanismus vorgestellt. • Fortsetzung folgt . . . 1 Am 04.05.2004 waren 90 Studenten zu dieser Veranstaltung angemeldet 3 1.4 Prüfungsfragen Die folgenden Fragen können in der Prüfung vorkommen. Daneben kommen Fragen zur Übung vor. 1. Vorlesung, 23.04.2004, P2P-Netzwerke der 1. Generation • Was ist ein Peer-to-Peer-Netzwerk? • Was ist Napster und wie funktioniert es? • Was ist Gnutella und wie funktioniert es? • Diskutieren Sie die Vorteile und Nachteile von Gnutella im Vergleich zu Napster. • Was sind hybride Peer-to-Peer-Netzwerke und in wie fern sind sie besser als die dezentrale Peer-to-Peer-Netzwerke? • Vergleichen Sie die Netzwerkstrukturen der Peer-to-Peer-Netzwerke der ersten Generation 2. Vorlesung, 23.04.2004, DHT, CAN • Warum skaliert Naster nicht? • Warum skaliert Gnutella nicht? • Warum eignen sich eine Hash-Tabelle nicht direkt als geeignetes Peer-to-Peer-Netzwerk? • Was ist eine Distributed Hash-Table (DHT)? • Wie werden Peers und Daten in CAN eingefügt? 3. Vorlesung, 07.05. 2004, CAN • Wie werden Peers in CAN eingefügt? • Erläutern Sie das Probelm der Fragmentierung. • Welchen Einfluß hat die Anzahl der Dimensionen auf CAN? • Was versteht man unter Realtitäten in CAN? • Vergleichen Sie die Vor- und Nachteil von Realitäten und Dimensionen in CAN. • Wie kann man die Latenzzeit in CAN optimieren? 4. Vorlesung, 17.05. 2004, Chord, Chernoff • Was besagt die Markoff-Ungleichung? • Was besagt die Chebyshev-Ungleichung? • Warum ist die Chernoff-Schranke so ein nützliches Werkzeug? • Beweisen Sie die Gültigkeit der Chernoff-Schranke. 5. Vorlesung, 21.05.2004, Chernoff, Chord • Was ist Chord? • Wieviele Finger hat Chord? Wozu dienen Sie? • Wie effizient ist der Lookup in Chord? • Wie hoch ist der Eingrad und der Ausgrad in Chord? • Wie nimmt man Peers in Chord auf? • Wie lange dauert die Peer-Aufnahme in Chrod? 6. Vorlesung, 28.05.2004, Koorde • Beschreiben Sie die Struktur von Koorde. • Welche Eigenschaften hat Koorde? 4 • Was ist ein DeBrujin-Graph? • Welche Eigenschaften hat ein DeBrujin-Graph? • Erläutern Sie den k-DeBrujin-Graphen. 7. Vorlesung, 04.06.2004, Tapestry • Was versteht man unter Nachbarschaftsmengen und welche Eigenschaften besitzen diese? • Wie funktioniert Routing im Tapestry Netzwerk? • Wie können neue Peers in ein Tapestry Netzwerk eingefügt werden? • Welchen Zweck erfüllt der Acknowledged Multicast Algorithmus? • Wie kann ein neuer Peer seine Routing-Tabelle aufbauen, damit diese die Lokalitäts-Eigenschaft erfüllt? • Was sind die Aufgaben von Root-Sets und Storage-Servern? 8. Vorlesung, 11.06.2004, Pastry • Erläutern Sie die Unterschiede zwischen Pastry und Tapestry. • Welche Zeiger hat Pastry? • Was bedeuten die Einträge in der Routing-Tabelle? • Wie fügt man Peers in Pastry ein? • Wann müssen die Routing-Einträge repariert werde und wie geschieht dies? • Erläutern Sie das Routing in Pastry. • Welche Formen der Lokalität kennt Pastry? • Diskutieren Sie die experimentellen Resultate im Zusammenhang mit Pastry. 9. Vorlesung, 14.06.2004, ViceRoy, Distance-Halving • Erläutern Sie die Motivation für das Viceroy-Netzwerk. • Wie ist Viceroy aufgebaut? • Warum ist das Butterfly-Netzwerk besonders gut für Routing geeignet? • Wie kann man log n berechnen, wenn n die Anzahl der Knoten in Viceroy bezeichnet? • Wie fügt man einen neuen Peer in Viceroy ein? • Wie funktioniert der Lookup in Viceroy? • Wie effizient sind diese Operationen? • Beschreiben Sie das Prinzip der mehrfachen Auswahl. • Zeigen Sie, dass mit dem Prinzip der mehrfachen Auswahl der Eingrad in Peer-to-Peer-Netzwerken erheblich reduziert werden kann. • Was sind kontinuierliche Graphen? • Erläutern Sie Distance-Halving! • Wie funktioniert der Lookup in Distance-Halving? • Welcher Mechanismus kann Congestion Distance-Halving reduzieren? 10. Vorlesung, 21.06.2004, Epidemische Informationsverbreitung • Was sind Replizierte Datenbanken? Wie kann man sie unterhalten? • Erläutern Sie das Anruf-Modell. Was ist Push und Pull und Push&Pull? • Beschreiben Sie das Ausbreitungsverhalten von Push, Pull und Push&Pull. 5 • Beschreiben Sie Terminierungsstrategien für epidemische Algorithmen. Wie kann man die Nachrichtenanzahl klein halten? 11. Vorlesung, 02.07.2004, Epidemische Informationsverbreitung • Wie kann man die Anzahl der Teilnehmer eines Peer-to-Peer-Netzwerks bestimmen? • Welche Funktionen kann man durch Datenaggregation bestimmen? 12. Vorlesung, 09.07.2004, Sicherheit in Peer-to-Peer-Netzwerken • Nennen Sie allgemeine Methoden der Kryptographie. • Welche Sicherheitsanforderungen haben Peer-to-Peer-Netzwerke? • Beschreiben Sie eine Sybil-Attacke. • Kann man Sybil-Attacken abwehren? • Erklären Sie das Problem der Byzantinischen Generäle. • Wie kann man das Problem der Byzantinischen Generäle lösen? • Wie kann man ein Zensur-resistentes Peer-to-Peer-Netzwerk aufbauen? 13. Vorlesung, 12.07.2004, DHash++ • Welche Techniken verwendet CAN zur Latenz-Optimierung eingesetzt? • Welche speziellen Techniken werden bei DHash++ zur Optimierung des Routing eingesetzt? • Was versteht man unter Datenlayout? • Erklären Sie den rekursiven und iterativen Lookup in DHash++. • Wie kann man die nächste Nachbarwahl in DHash++ organisieren? • Was sind Erasure Resilient Codes? 6 Kapitel 2 Peer-to-Peer-Netzwerke der ersten Generation 2.1 Was ist ein Peer-to-Peer-Netzwerk? Das englische Wort Peer (sprich „Pier“) bezeichnet einen Ebenbürtigen, Gleichrangigen (aber auch ein Mitglied des Hochadels) 1 . Laut dem Online-Wörterbuch von Merriam-Webster geht diese Word über das Mittelenglisch ethymologisch zurück auf das lateinische Wort par, welches auch im Deutschen als gleich verwendet wird. Demnach ist ein Peer-to-Peer-Netzwerk wortwörtlich ein Netzwerk, das Gleichrangige mit anderen Gleichrangigen direkt verbindet. Diese Umschreibung würde aber allgemein für Rechner des Internets gelten. Schließlich unterscheiden die Internet Protocol (IP) Adressen nicht zwischen besonder bevorrechteten und weniger bevorrechteten Adressen, so dass man mit Fug und Recht das Internet selbst aus Peer-to-Peer-Netzwerk bezeichnen könnte. Ursprünglich mag das Internet auch so funktioniert haben. Aber mit der Zeit haben sich bestimmte Dienste, wie zum Beispiel Web-Server oder Mail-Server, immer weiter zu zentralisierten Client-Server-Strukturen herausgebildet. Bei einer Client-Server-Netzwerk-Struktur kontrolliert ein besonders bevorrechtigteter Knoten, genannt der Server, die anderen Teilnehmer, die Clients genannt werden. Ein gutes Beispiel ist ein Web-Server, dieser speichert Web-Seiten, die von den Web-Clients abgerufen werden können. Hierzu melden sich diese mittels einer TCP (Transmission Control Protocol) bei dem Web-Server an, wonach dieser die Web-Seiten diesen Client zusendet. Verweigert der Server einen Web-Client den Zugriff, so ist dieser machtlos. Andererseits sind die Web-Seiten auch nicht mehr abrufbar, falls der Web-Server ausgefallen ist. Wenn man also die funktionale Beschreibung eines Netzwerks betrachtet, so gilt die folgende Definition: Ein Peer-to-Peer-Netzwerk ist ein Kommunikationsnetzwerk zwischen Rechnern, in dem jeder Teilnehmer sowohl Client als auch Server-Aufgaben durchführt. Obgleich diese Definition eine gute Intuition gibt, werden wir sehen, dass es tatsächlich Peer-to-PeerNetzwerke gibt (z.B. Napster), die nicht unter diese Definition fallen. Daher ist die Peer-to-Peer-WorkingGroup (http://p2p.internet2.edu/index.html) mit ihrer Definition etwas allgemeiner: In einem Peer-to-Peer-Netzwerk werden verteilte Rechenresourcen durch direkte Kommunikation gemeinsam genutzt. Mit dieser Definition ist man sicher zu allgemein. Das Einzige was man mit Sicherheit über Peer-toPeer-Netzwerke sagen kann, ist dass Peer-to-Peer-Netzwerke nicht Client-Server-Netzwerke sind. Ein besseres Verständnis, was Peer-to-Peer-Netzwerke sind, erhält man, indem man sich die noch junge Geschichte der Peer-to-Peer-Netzwerke betrachtet. 1 laut dem Wörterbuch von LEO: http://dict.leo.org 7 Client Client Datei Client Client Server Client Client Reply Client File Download Query Client Abbildung 2.1: Funktionsweise von Napster 2.2 Napster Napster ist ein geschichtlich wichtiges Netzwerk. Wir werden es hier hauptsächlich aus diesem Grund vorstellen. Algorithmisch hat es wenig zu bieten und ob es wirklich ein echtes Peer-to-Peer-Netzwerk ist, gelinde gesagt, umstritten. 2.2.1 Geschichte Shawn (Napster) Fanning (Jahrgang 1980) brachte im Juni 1999 eine Beta-Version seines mittlerweile legendären Peer-to-Peer-Netzwerks heraus. Die ursprüngliche Aufgabe dieser Software war ein File-SharingSystem mit dem man Dateien auf Rechnern, die sich an diesem Rechnern anmelden, lokalisieren kann und dann direkt von diesen Rechnern herunterladen kann. Erst durch das Engagement eines Freundes von ihm wurde aus dem File-Sharing-System ein Musik-Portal, das hauptsächlich zur Verbreitung von Musikdateien diente. Dadurch wurde aus Napster schon im Herbst 1999 der Download des Jahres. Wegen der systembedingten Missachtung von Urheberschutzrechten der Musikautoren klagten Musikverlage gegen Fanning und drohten mit einer Stillegung des Systems. Tatsächlich geschah einige Zeit nichts und durch die durch den Rechtsfall gesteigerte Publizität nahm die Anzahl der Teilnehmer sogar zu. In einer überaschenden Wendung ging Fanning Ende 2000 einen Kooperationsvertrag mit Bertelsmann Ecommerce ein und wandelte seine bislang kostenloses System in eine kommerzielle File-Sharing-Plattform um. 2.2.2 Aufbau Der Aufbau und Funktionsweise von Napster ist weitaus weniger aufregend als die Geschichte von Napster. Napster folgt im wesentlich einer Client-Server-Struktur, siehe Abbildung 2.1. Ein Server unterhält einen Index mit Meta-Datein über den Dateinamen, das Dateidatum und ähnlichen Informationen. Neben dieser Datenbank hat der Server eine Tabelle über die Verbindungen der teilnehmenden Clients. Aus dieser Tabelle aller öffentlich gemachten Dateien der teilnehmenden Clients werden jetzt die Anfragen bedient. Bei einer Anfrage (Query) fragt ein Client nach dem Dateinamen und der Server sucht in seiner Datenbank nach dem passenden Teilnehmer. Der Server teilt dann dem Client mit welcher andere Client die gewünschte Datei besitzt. Der Anfrage-Client lädt dann die Datei direkt vom dateibesitzenden Client herunter. Dieser letzte Schritt im File-Sharing ist der einzig Schritt der unserer eingangs formulierten Definition eines Peer-to-Peer-Netzwerks entspricht. Man kann sich vorstellen, dass diese Lösung genau dann Sinn 8 macht, wenn der Server nicht in der Lage ist alle Dateien zu speichern. Auch wird so unnötiger Datenverkehr zwischen Server und Clients vermieden. Und genau dieser Aspekt regte die Fantasie vieler Entwickler an, diesen Mechanismus weiter auszubauen. 2.2.3 Diskussion Die Vorteile von Napster sind seine Einfachheit und die Möglichkeit schnell und effizient auf Dateiverweise zu finden. Die Nachteile sind vor allen in der Client-Server-Struktur begründet. Diese zentrale Struktur erleichtert feindliche Eingriffe in das System. Dies muss nicht unbedingt eine richterliche Verfügung im Auftrag eines Muskverlags sein, es kann sich auch die represssive Verfolgung in einem Unrechtsstaat handeln. Des weiteren sind auch Denial-of-Service-Angriffe eine einfache Methode solche zentralen offenen Strukturen zu torbpedieren. Viel einfacher kann das Versagen eines solchen zentrierten Systems durch einen Systemausfall der zentralen Kompononente (Programmabsturz, Hardware-Ausfall, etc.) geschehen. Ein weiter Nachteil ist, dass Napster nicht skaliert. Wenn die Teilnehmerzahl zunimmt, kann der zentrale Server die Anfragen nicht mehr schnell genug bearbeiten. Ausserdem kann schon die Speicherung der Meta-Daten leicht überhand nehmen. Als Resumee bleibt festzuhalten, dass Napster keine akzeptable Peer-to-Peer-Netzwerklösung darstellt. Bis auf den direkten Download ist Napster gar kein Peer-to-Peer-Netzwerk im eigentlichen Sinne. 2.3 Gnutella in der Originalversion Ein echtes Peer-to-Peer-Netzwerk ist dagegen Gnutella. 2.3.1 Aufbau Gnutella wurde im März 2000 von Justin Frankel und Tom Pepper (Nullsoft) herausgegeben. Wie Napster handelt es sich bei Gnutella um ein File-Sharing-System. Im Gegensatz zu Napster handelt es sich um ein echtes Peer-to-Peer-Netzwerk ohne jegliche zentrale Strukturen und zentrale Kontrolle. Wie kann man aber ereichen, dass ein Netzwerk entsteht ohne zentrale Kontrolle. Das Problem fängt schon beim Download der Software an. Da die Benutzer einander anfangs nicht kennen, müssen bestimmte Adressen im Programm voreingestellt werden. Wie kann man aber verhindern, dass diese nicht als Server dienen. Nun Gnutella wird mit einer Liste von Adresse ausgeliefert, die bei Programmstart von den Gnutella-Peers durchprobiert werden. Wird nun ein aktiver Peer aus dieser Liste gefunden, so wird eine k-hop-Nachbarschaft des Peers angefragt und daraus eine eigene Nachbarschaftsliste aufgebaut. Hat ein Peer erste eine eigene Nachbarschaftsliste gewonnen, so speichert er diese und startet beim nächsten Mal mit dieser und erweitert sie wie eben beschrieben. Auf diese Weise erhält jeder Peer sein eigenes Umfeld und kann auf eine robuste (eigene) Liste von Peers zurückgreifen, sollte einmal kein Peer auf der originären Liste verfügbar sein. Gnutella baut auf dem IP (Internet Protocol) auf und das Gnutella-Protocol benutzt nur vier verschiede Nachrichtentypen, wie in Tabelle 2.1 gezeigt. Deer Standard-Header einer Nachricht besteht nach der Gnutella Spezifikation [Gnu] aus • Message identifier: Das ist eine 2-Byte-ID, welche anzeigt ob diese Nachricht bereits empfangen wurde. • Function identifier: Hier wird der Typ der Nachricht beschrieben (Ping, Pong, Push Request, Query, Query Hits) • TTL: Das ist das Time-to-Live-Feld. Analog zum TTL-Feld im IP-Protokoll wird hier die maximale Anzahl von Übertragungen (Hops) der Nachricht festgelegt • Hops: Anzahl der bereitszurückgelegten Strecke der Nachricht • Payload length: Länge der Nachricht 9 Typ Ping Pong Beschreibung Anfrage an Peer, sich anzukündigen Antwort auf Ping Query Suchanfrage Query-Hits Antwort auf Query Inhalt — IP und Port-Adresse des Antwortgebers, Anzahl und Größe veröffentlichter Dateien minimale Geschwindigkeitsanforderung des Antwortgebers, Suchstring IP und Port-Adress, Geschwindigkeit des Antwortgebers, Anzahl passender Datein und ihre indizierte Ergebnismenge Tabelle 2.1: Nachrichtentypen in Gnutella Mit dem eingangs beschriebenen Prozess erhält so jeder Peer eine Nachbarschaftsliste, die immer weiter verlängert und gespeichert werden. Dabei ist die Anzahl aktiver Nachbarn beschränkt (typischer Wert wäre fünf). Man beachte insbesondere, dass die Antworten auf die Ping-Anfragen (die Pongs) auf dem Anfragepfad zurückgeschickt werden (und nicht etwa auf dem kürzesten Weg). Der Informationsprozess folgt immer dem Prinzip eines beschränkten Broadcast. Das bedeutet, dass der Erzeuger einer Nachricht eine Sprungweite, TTL genannt, der ersten Nachricht mitgibt und dieser Wert wird mit jeder Weitergabe um eins verringert. Jeder Peer, der eine Ping- oder Query-Nachricht erhält, reicht diese an alle Nachbarn, weiter. Diese Art der Informationsweitergabe ähnelt damit gewissermaßen der Verbreitung einer Epidemie oder eines Virus. Die resultierende Graphstruktur ensteht also durch einen zufälligen Prozess, da sie allein durch die Menge der (zufällig) aktiven Prozessoren und deren gerade aktiven Nachbarn bestimmt wird. Man sieht, dass es keine zentrale Instanz oder verteilte Kontrollmechanismen gibt (außer dem TTL-Feld), welche die Struktur des Verbindungsgraph kontrollieren. Gewisse statistische Gesetzmäßigkeiten lassen sich dennoch entdecken. So unterliegen wichtige Parameter der Graphstruktur, wie die Verteilung des Grades der Knoten, der Pareto-Verteilung [JAB01]. Ein Schnappschuss eines solchen Verbindungsnetzwerks aus diesem Artikel wird in Abbildung 2.4 gezeigt. Die Dateianfrage geschieht völlig analog zum Ping-Pong-Prozess. Eine Query wird durch beschänkten Broadcast an alle Nachbarn im Graph in Entfernung TTL weitergeleitet und in entgegengesetzter Richtung werden die Antworten (Typ: Query-Hits) auf denselben Pfaden zurückgeleitet. Wenn der Anfrager die gewünschte Datei identifiziert hat, kann er sie direkt von dem Knoten herunterladen. Siehe auch Abbildung2.3. Wir sehen also, dass im Gegensatz zu Napster hier zum ersten Mal ein echtes Peer-to-Peer-Netzwerk vorliegt, welches vollständig ohne zentrale Kontrollmechanismen auskommt. 2.3.2 Diskussion Die Vorteile von Gnutella rühren von dieser verteilten Netzwerkstruktur. Dadurch ist Gnutella extrem robust und praktisch unangreifbar. Diese Netzwerkstruktur skaliert auch sehr gut, was hier heisst, dass beliebig viele Knoten ohne Performanzverlust aufgenommen werden können. Dennoch hat Gnutella eine Reihe von Nachteilen. Das Hauptproblem ist, dass durch die tiefenbeschränkte Suche nur in einem Teilnetzwerk nach der Zieldatei gesucht wird. Hat nun die Zieldatei eine große Verbreitung, wie zum Beispiel die Kassenschlager der Musik (top ten), dann werden sie dennoch gefunden. Selten vorhandene Dateien können dagegen nicht gefunden werden. Dieses Problem könnte man durch Erhöhung des TTL-Eintrags erhöhen, wenn nicht der zweite Nachteil von Gnutella dadurch nicht noch verschärft würde. Dies ist das Nachrichtenaufkommen. Da es völlig unklar ist, wo die Zieldatei sich befindet, werden eine Reihe von Zielanfragen (sinnlos) von Knoten weitergeleitet. Daneben ist der Netzwerkdurchmesser eines Gnutella-Netzwerks verglichen mit einer Baumstruktur relativ hoch und dadurch 10 pong ping ping pong ping pong neue Verbindungen ping pong TTL = 3 pong ping ping Abbildung 2.2: Anbindung von neuen Knoten in Gnutella Datei query query-hits query Download query query-hits query TTL = 3 query-hits query query Abbildung 2.3: Dateisuche in Gnutella 11 Abbildung 2.4: Das Gnutella-Netzerk (Schnappschuss 2000) [JAB01] muss man zusätlich mit großen Latenzzeiten (Verzögerungszeiten) rechnen. Es gibt eine Reihe von Verbesserungvorschläge, um das Nachrichtenaufkommen zu verringern. Einer sieht zum Beispiel die Verwendung von Random Walks statt Broadcasting vor. In einem Random Walk wird eine Nachricht nicht an alle Nachfolger sondern nur an einem zufälligen weitergereicht. Auf diese Weise wird die Suchanfrage weiter in das Netzwerk hineingereicht ohne das Nachrichtenaufkommen stark zu erhöhen. Andere schlagen die passive Replikation von Information entlang eines Pfads vor. Hierbei werden Ergebnislisten gespeichert und neue Anfragen nach den selben Dokument können dann sofort ohne weitere Suchnachrichten beantwortet werden. 2.4 Kazaa, Gnutella (II), Morpheus Die Schwächen von Gnutella blieben ihren Vätern nicht verborgen und so verbesserten diese die Struktur zu einem sogenannten hybriden Netzwerk. Eine ähnliche Struktur liegt auch Kazaa und Morpheus zu Grunde. Wir werden das Prinzip hier kurz vorstellen. Besonders geeignete Knoten (z.B. mit hoher Bandbreite) werden zu sogenannten Super-Knoten (SuperNodes) ernannt. Zwischen diesen relativ wenigen Super-Nodes wird nun das ursprüngliche Gnutella-Peerto-Peer-Netzwerk etabliert. Normale Knoten werden an diese Super-Knoten als Clients angebunden, siehe Abbildung2.5. Die Vorteile einer solchen Netzwerkstruktur sind die verbesserte Skalierbarkeit und geringere Latenzzeiten. Dagegen spricht die Abkehr vom reinen Prinzip, dass jeder Teilnehmer die selben Aufgaben und Funktionen erhält. So könnte sich zum Beispiel ein Client der Super-Node-Aufgabe verweigern. Außerdem ist dieses Netzwerk immer noch unzuverlässig und langsam, da es nicht klar ist, ob das TTLFeld nun ausreicht das Netzwerk zu durchqueren und die Wege immer noch lang sein können. Daneben verringern sich die Nachrichtenmenge innerhalb der Super-Nodes nicht. Hier werden nun praktische alle (oder zumindestens ein großer Anteil) mit allen Anfragen konfrontiert. 12 Super-Nodes Client-Nodes Abbildung 2.5: Eine hybride Netzwerkstruktur 2.5 Zusammenfassung Wir haben in diesem Abschnitt die Frühphase der Peer-to-Peer-Netzwerke kurz gestreift. Das klassische Peer-to-Peer-Netzwerk ist sicherlich Gnutella, während Napster obgleich seiner Client-Server-nahen Struktur, durch siene Publizität die Aufmerksamkeit und Fantasie einer größeren Öffentlichkeit erregt hat. Es gibt eine Reihe von Fragestellungen im Bereich der Datenbanken, die Ontologie und Autnomie von Daten betreffen, die von hohen Interesse liegen, die im Rahmen dieser Vorlesung (aufgrund der algorithmischen Ausrichtung) nicht erwähnt werden, siehe hierzu [DGMY02]. Daneben gibt es auch eine Reihe von praktischen Fragestellungen, die wir hier nur am Rande streifen werden. Dies sind zum Beispiel nach Nelson Minar [Min01]: • Die Handhabbarkeit eines Peer-to-Peer-Netzwerks Sind die Kontrollmechanismen zu kompliziert, dass eine Implementation praktisch nicht durchführbar wird? • Die Informationskohärenz Also wie gut wird die Information verteilt, wie gut ist sie verfügbar. • Erweiterbarkeit oder Skalierbarkeit Wie gut kann das Netzwerk wachsen und dabei noch schnell Anfragen verarbeiten? • Fehlertoleranz Wie gut können Ausfälle von Peers oder fehlerhafte und veraltete Information im Netzwerk verkraftet werden. • Sicherheit Wie leicht kann es mutwillig zerstört werden? • Schutz gegen politische Verfolgung Kann eine Regierungsbehörde das Netzwerk einfach ausschalten? Wir werden uns beginnen mit dem nächsten Kapitel hauptsichlich um das Problem der Erweiterbarkeit oder Skalierbarkeit kümmern. Die anderen Problemstellungen sind sicherlich für die praktische Umsetzung oder für die Verbreitung eines Peer-to-Peer-Netzwerk von entscheidender Kontrolle, wird aber im Rahmen dieser Veranstaltung nicht tiefer besprochen. Kommen wir zurück zu der eingangs gestellten Frage, was ein Peer-to-Peer-Netzwerk ausmacht. Ein Lackmustest für Peer-to-Peer-Netzwerke [Shi01] kann sein: 13 • Sind variable Verbindungen und temporäre Netzwerkverbindungen die Norm? • Sind die Kanten des Netzwerks autonom? 14 Kapitel 3 Skalierende Peer-to-Peer-Netzwerke Die Frage der Skalierbarkeit eines Peer-to-Peer-Netzwerks ist eines der zentralen Problemstellungen in dieser Veranstaltung. 2.Vorlesung 30.04.2004 3.1 Warum manche Netzwerke nicht skalieren Bei Napster haben wir vor dem Download es nur mit einer Client-Server-Struktur zu tun. Der Schwachpunkt ist nun der Server der alle Anfragen der Clients zu bedienen hat. Wenn nun diese Anzahl steigt (und man kann sich bei Millionen von Teilnehmern sich das leicht vorstellen), dann wird er zum Flaschenhals der Kommunikation. Graphtheoretische entspricht die Client-Server-Struktur einem Stern-Graph, siehe Abbildung 3.1. Der Server steht mit dem Grad n − 1 im Mittelpunkt und ist auch hinsichtlich des Graphzusammenhangs ein Schwachpunkt, da der Stern-Graph nur 1-zusammenhängend ist. Definition 1 Ein Graph ist k-zusammenhängend, wenn nach Entfernen von k − 1 beliebigen Knoten der Graph noch zusammenhängend ist und wenn nach dem Entfernen von k Knoten der Graph nicht mehr zusammenhängend ist. Der Zusammenhang bei Gnutella ist höher. Genaue Werte lassen sich hier nicht angeben, da der Graph durch die Verbindungsaufnahme am Anfang eine zufällige Struktur erhält, wie in Abbildung 3.2 angedeutet. Statistische Untersuchungen in [JAB01] zeigen aber, dass sich bezüglich Durchmesser und Verteilung des Grads doch ein gesetzmäßiges Verhalten nachweisen lässt. So ist der Durchmesser nur logarithmisch in der Anzahl der Teilnehmer und der Grad ist Pareto-verteilt, d.h. Knoten mit dem Grad d kommen in einer Häufigkeit propotional zu dα für eine Konstante α < 0 vor. Die Ausnahmestellung der Pareto-Verteilung zur Beschreibung von Netzwerken, die durch menschliches Wirken enstehen zeigt sich hier wie bereits bei Abbildung 3.1: Die Client-Server-Struktur von Napster entspricht einem Stern-Graph [JAB01] 15 Abbildung 3.2: Ein zufälliger Graph, der die Struktur von Gnutella symbolisieren soll der Anzahl von Links auf Web-Seiten. Es ist schon länger bekannt, dass die Verteilung der Bevölkerung in Städten, der Wortlängen in Sprachen, des Vermögens in der Bevölkerungs, der Dateinamenlängen im Unix-Betriebssystem und vieles mehr dieser Verteilung gehorcht. Eine weitere Beobachtung ist, dass der durchschnittliche Grad im Gnutella-Netzwerk nur konstant ist (also α < −1). Trotz dieser positiven Grapheigenschaften skaliert Gnutella sehr schlecht1 . Das Hauptproblem ist, dass eine Anfrage an alle Nachbarn einer gewissen Umgebung weiter gegeben wird. Dadurch werden Peers in einer Umgebung mit einer Reihe von Fragen belästigt, während es dieses Nachrichtenaufkommen nicht garantiert nicht, dass die Anfrage korrekt beantwortet wird, da weiter entfernte Information nicht abgegriffen werden können. Bei den hybriden Netzwerkstrukturen verbessert sich die Anfrageverarbeitung. Dennoch müssen dann alle Super-Knoten die Anfrage bearbeiten. Damit skalieren dieses Netzwerke immer noch schlecht, da diese wie bei Napstern dann unter Umständen Millionen von Anfragen zu bearbeiten haben. Halten wir fest, dass die Skalierbarkeit eines Netzwerks von der schnellen Bearbeitung von zwei Fragen abhöngt: • Wo befindet sich die Information? Bei Napster wird diese Frage einfach und effizient beantwortet, während bei Gnutella nur durch eine ausufernde Suche gelöst werden kann. • Wie kommt man dorthin? Bei Napster ist dies das Problem, da der Zugang zum Server durch andere Anfragen blockiert werden kann. Bei Gnutella ist dieses Problem auch nur unzufriedenstellend gelöst durch das Fluten des Netzwerks mit Nachrichten. 3.2 Distributed Hash-Table Die Verwendung einer effizienten Datenstruktur wie man sie in der Grundlagen-Veranstaltung Datenstrukturen und Algorithmen gelernt hat, könnte diese Problem leicht lösen. Verwendet man ein Wörterbuch zum Speicher der Metaeinträge, dann kann man diese sehr effizient (in logarithmischer Zeit) wiederfinden. Die beiden wichtigsten Datenstrukturen hierzu sind Bäume und Hash-Tabellen und wir werden beide Typen in diesem Zusammenhang wiederfinden. Wir beginnen unsere Überlegungen mit Hash-Tabellen. Hashing bedeutet wortwörtlich zerhacken (vgl. Haschee) und tatsächlich wird der Schlüsseleintrag durch eine Funktion, die diesen geeignet verkürzt zerkleinert und diese dementsprechend in den Speicherbereich geschrieben. Eine einfache Hash-Funktion ist zum Beispiel die Modulo-Funktion a mod p, die den Rest der Zahl a nach Division durch p bezeichnet. 1 Genauer gesagt, Gnutella skaliert hinsichtlich sehr gut, wenn es darum geht neue Knoten aufzunehmen. Leider gestaltet sich dann die Suche in dieser entweder als äußerst nachrichtenintensiv oder sie ist erfolglos (je nach der Wahl der Sprungweite der Suche) 16 Abbildung 3.3: Der Standardansatz einer Hash-Tabelle ist nicht geeignet als Peer-to-Peer-Netzwerk Werden dann die Zahlen 10, 20, 30 in ein Feld der Größe p = 7 gespeichert, so wird 10 in den Speicherplatz 10 mod 7 = 3 geschrieben; 20 in den Speicherplatz 20 mod 7 = 6 und 30 mod 7 = 2. Natürlich wird es irgendwann nicht zu vermeiden sein, dass mehrere Elemente in einen Speicherplatz abgebildet werden. Diese Situation nennt man Kollision. Um diese Kollisionen zu beheben, wurden im den Grundstudiumsveranstaltung verschiedene Techniken vorgestellt. Wir verwenden hier nur einfache Verkettung, das heisst wir speichern alle kollidierten Einträge mit einer doppelt verketteten Liste. Eine einfache Übertragung dieses Konzepts als Peer-to-Peer-Netzwerk ist in Abbildung 3.3 dargestellt. Man identifiziert die Peers mit den Speicherplätzen der Hash-Tabelle. Die Peers sind verbunden durch eine Kette. Für eine Suche würde man zuerst die Hashfunktion f (x) des Elements x berechnen und dann je nach der eigenen Nummer die Anfrage in die Richtung leiten. Zwar sind jetzt die Index-Dateien des Peer-to-Peer-Netzwerk leicht aufzufinden, jedoch erkennt man sofort eine Reihe von Nachteilen in dieser Umsetzung. • Die Suchzeit steigt mit der Anzahl der teilnehmenden Peers linear an. • Die Zeit, um neue Peers (auf der rechten Seite) einzufügen ist ebenfalls lienar. Genauso lange braucht es auch, um alleine die Nummerieruung der Peers zu verändern, wenn ein Peer das Netzwerk verläßt. • Gravierender wiegt aber, dass wenn ein Peer das Netzwerk betritt, die Hash-Funktion angepasst werden muss und dass dann (bei unglücklicher Wahl dieser neuen Funktion) fast alle gespeicherten Einträge neu zugeordnet werden müssen. Genauso verhält es sich, wenn ein Peer das Netzwerk verlässt. Diesen letzten Punkt lösen Distributed Hash-Tables (verteilte Hash-Tabellen). Diese Technik wurde ursprünglich zur Auflösung von sogenannten Hot-Spots2 im Internet eingeführt zur verteilten Speicherung von HTML-Seiten oder Bilddateiten [KLL+ 97]. Hierzu werden nicht jedem Peer eine einzige Zahl zugeordnet, sondern ein zusammenhängender Bereich des Hash-Funktionsbildbereichs. Dieser Bildbereich muss nicht mehr klein gehalten werden, da die Angabe der Bereichsgrenzen genügt. Man sorgt dafür, dass nur wenige Bereiche aneinander stoßen. Die Daten werden gemäß der Schlüssel ebenfalls auf diesen HashFunktionsbildbereich abgebildet und gemäß der den Peers zugeordneten Bereich auf diese abgebildet, siehe Abbildung 3.4. Kommt nun ein neuer Peer hinzu, wird der Bereich zweier benachbarter Peers neu aufgeteilt. Der neue Peer, siehe Abbildung 3.5 (schwarzer Kreis), erhält einen Teilbereich der vormals benachbarten Peers (roter und weißer Kreis). Dadurch müssen nur die Daten-Elemente weniger Peers neu umgelagert werden. Genauso verhält es sich, wenn ein Peer das Netzwerk verlässt, siehe Abbildung 3.6. Der Peer (grüner Kreis), der das Netzwerk verlässt, übergibt seine Bereiche den direkten Nachbarn. Wiederum sind nur wenige Peers und Datenelemente betroffen. Diese Operation hat nur lokale Auswirkungen. Damit lässt sich also das Problem des Einfügen und Entfernen von Knoten lösen.Tatsächlich beruhen fast alle modernen Peer-to-Peer-Netzwerke auf diesen verteilten Hash-Tabellen (außer Skipnet [HJS+ 03], die in dieser Vorlesung nicht behandelt werden). Es bleibt aber noch offen, welches Netzwerk diese Peers verbinden sollen, um die Datensuche zu optimieren. 2 Unter Hot Spots versteht man Überlastungen von Web-Server durch eine Anhäufung von Seitenanfragen. Hierfür hat sich mittler- weile eine ganze Industrie von Dienstleistern entwickelt, die verteilte Web-Services anbieten, wobei die Web-Seiten oder Seiteninhalte auf verschiedene über das Internet verstreute Ersatzserver verteilt wird. 17 Abbildung 3.4: Bei der verteilten Hash-Tabelle wird jedem Peer (farbiger Kreis) ein Bereich zu geordnet. Alle Daten (Rechtecke) die auf diesen Bereich abgebildet werden, werden entsprechen den Peers zugeordnet. Abbildung 3.5: Nach dem Einfügen eines Peers sind nur die Zuordnungen der benachhbarten betroffen 3.3 CAN — Content Addressable Network Das Peer-to-Peer-Netzwerk CAN von Sylvia Ratnasamy, Paul Francis, Mark Handley, Richard Karp und Scott Shenker [RFH+ 01] baut auf diesem Konzept der Hash-Tabellen auf und verwendet wie wir gleich sehen werden sowohl ein geometrisches gitterbasiertes Konzept als auch Zufallsbäume (Random Trees). 3.3.1 Aufbau Der Bildbereich der Hash-Funktion bildet auf den kontinuierlichen zwei-dimensionalen Raum [0, 1]2 ab. Ist anfangs nur ein Peer im Netzwerk, so erhält dieser den gesamten Bildbreich. Kommt nun ein neuer hinzu wird der Bildbreich quer zur x-Achse geteilt und die Einträge entsprechend aufgeteilt. Jeder Besitzer eines Berechs speichert also alle Einträge in seiner Zone. Kommt nun wieder ein Peer hinzu, so wählt der Peer einen zufälligen Punkt im Quadrat aus. Dann wird der zuständige Peer kontaktiert und die Zone aufgeteilt (in x oder y-Richtung, in der umgekehrten Richtung in welcher der Besitzer der Zone zuvor geteilt hat). In Abbildung 3.7 ist eine solche Folge dargestellt. 3.3.2 Die Balancierung der Zonen nach dem Aufbau Sei nun R(p) das Rechteck eines Peers p und A(p) die Fläche dieses Rechtecks des Peers p. Ferner bezeichnen wir mit n die Anzahl der Peers. Dann läßt sich für diese Parameter nach dem Einfügen von n Peers von der Startsituation eines Peers folgendes nachweisen. Lemma 1 1. Für alle Peers p gilt E[A(p)] = 1 n. Abbildung 3.6: Das Löschen eines Peers in der DHT betrifft nur die Bereiche der direkten Nachbarn 18 Abbildung 3.7: Der Aufbau der Zonen in CAN 19 2. Sei PR,n die Wahrscheinlichkeit, dass keines der n Peers in das Rechteck R mit Fläche V (R) fällt. Dann gilt PR,n ≤ e−nV (R) . Beweis: 1. Wir nehmen an, dass die Peers in irgendeiner unbestimmten Reihenfolge eintreffen. Dennach gilt wegen Symmetrie für zwei beliebige Peers i, j: E[A(i)] = E[A(j)]. Ferner gilt für die Summe der Flächen n X A(i) = 1 . i=1 Daraus folgt 1= n X i=1 " A(i) = E n X # A(i) = i=1 n X E[A(i)] = nE[A(1)] . i=1 Diese Gleichung gilt, da der Erwartungswert einer Summe von zwei Zufallsvariablen der Summe der Erwartungswerte der Zufallsvariablen entsprich. Daraus folgt die Behauptung. 2. Für den Beweis der zweiten Aussage betrachten wir ein Rechteck R mit Fläche x = V (R). Die Wahrscheinlichkeit, dass ein bestimmter Peer nicht in dieses Fläche hineinabgebildet wird, ist 1−x. Das geschieht unabhängig von dem Verhalten anderern Peers. Somit ist die Wahrscheinlichkeit, dass n Peers nicht R hineinfallen, ist daher (1 − x)n . Nun gilt für alle m > 0: 1 1− m m ≤ 1 . e Daraus folgt für diese Wahrscheinlichkeit nx 1 ≤ e−nx (1 − x)n = (1 − x) x und damit das Lemma. Die erste Aussage hat nur geringe Bedeutung, da aufgrund der Symmetrieannahme auch eine beliebig schlechte Gewichtung diese durchschnittlen Flächengröße ergeben hätte. Die zweite Aussage ist schon wesentlich aussagekräftiger. So ist es zum Beispiel extrem unwahrscheinlich, dass eine Fläche der Größe 21 das Eintreten von n Peers ungeteilt überlebt, nämlich e−n/2 . Aus diesem Lemma kann man die Größe eines noch ungeteilten Rechtecks aber noch genauer abschätzen. Theorem 1 Keine Zone eines Peers der Größe 2c lnnn bleibt nach Einfügen von n Peers mit hoher Wahrscheinlickeit ungeteilt, d.h. mit Wahrscheinlichkeit nk für eine Konstante k > 0. Beweis: Aus dem obigen Lemma folgt für ein Rechteck Ri der Größe 2−i und c2i ln n Peers eine Wahrscheinlichkeit von i PRi ,c2i ln n ≤ e−c2 ln nV (Ri ) = e−c ln n = n−c , Es genügen also c2i ln n Peers um Ri mit Wahrscheinlichkeit 1 − n−c zu teilen. Diese kommen jetzt hintereinander und so können nun nach log 2c nln n solchen Staffeln von Peer mit dieser Wahrscheinlichkeit auch ein Rechteck der Größe 2c lnnn geteilt werden, da ln n 2c ln n X i=1 ln i c2 ln n = c(ln n) n 2c ln n X i=1 20 n 2i ≤ c(ln n)2 2c ln n = n . Abbildung 3.8: Iterierte Join-Operationen als Random Tree Damit wird dieses Rechteck mit Wahrscheinlichkeit n−c log n nicht geteilt. Von diesen Rechtecken gibt es höchstens n viele, damit ist die Wahrscheinlichkeit, dass eines dieser ungeteilt bleibt n·n−c log n ≤ n−c+2 . Wählt man also c groß genug, so wird jede gewünschte polynomiell kleine Fehlerwahrscheinlichkeit unterschritten. Nun ist die erwartete Anzahl gespeicherten Daten proportional zur Fläche der Peerzonen. Im Durchschnitt ist diese Fläche n1 , und mit hoher Wahrscheinlichkeit ist dies höchstens 2c lnnn . Somit speichert jeder Peer höchstens 2c(ln n) mal mehr Daten als der Durchnittspeer. 3.Vorlesung 07.05.2004 3.3.3 Die Join-Operation Die iterative Anwendung von Join-Operationen entspricht von der Aufteilung genau dem Aufbau eines randomisierten Binärbaums, für den an jedem Knoten zufällig entschieden wird, wo das Blatt eingefügt wird (Eine entsprechende Analyse in solchen Bäumen war schon Bestandteil einer Übungsaufgabe). In Abbildung 3.8 ist dieser Zusammenhang bildlich dargestellt. Von randomisierten Zufallsbäumen weiss man, dass die erwartete Tiefe 2 log n + O(1) ist und dass hoher Wahrscheinlichkeit, d.h. 1 − n−O(1) , die Tiefe O(1) nicht überschritten wird. 3.3.4 Entfernen eines Peers Gemäß der CAN-Datenstruktur ist es erlaubt, dass ein Peer für mehr als ein Rechteck notwendig ist. Dieser Umstand ergibt sich aus dem Fall, wenn Knoten das Netzwerk verlassen. Geschieht dies, so kann man nicht davon ausgehen, dass diese ihre Nachbarn rechtzeitig davon unterrichten. Daher fragen die Peers regelmäßig ihre Nachbarn ab, ob sie noch leben. Meldet sich einer nicht zurück, so übernimmt der erste der dies merkt (nach Ablauf eines Wartezeitraums) das Gebiet des abwesenden Peers, siehe Abbildung 3.9. Man kann sich vorstellen, dass sich das fortlaufende Einfügen und Löschen eines Knotens zu einer immer weitergehenden Fragmentierung des Netzwerks führen wird. Das Entfernen eines Peers kann nun mittels dieser Darstelluns als Binärbaum leicht interpretiert werden. Der Peer muss dann einen geeigneten Nachbarn finden, der sein Gebiet übernehmen kann. Dazu ist eine Umbalancierung notwendig, die wir nun skizzieren werden. 3.3.5 Defragmentierung Auf Dauer ist es nicht hinnehmbar, dass ein Peer ein Konglomerat aus benachbarten Flächen verwaltet (wobei wir gleich sehen können, dass wenn diese Flächen nicht benachbart sind, widerum Vorteile daraus erwachsen). Daher wird von Zeit zu Zeit eine Defragmentierung im CAN-Baum vorgenommen. 21 Peer A Peer B Peer E Peer C Peer D Abbildung 3.9: Verläßt ein Knoten das CAN-Netzwerk, übernimmt sein Nachbar das Gebiet Dieser Prozess kann von jedem Peer angestoßen werden, der mehr als ein Gebiet zu verwalten hat. Hierbei geschieht folgendes. Der Peer wählt die kleinste Zone A und betrachtet gemäß der oben beschriebenen Binärbaumbeschreibung den Bruderbaum. Besteht dieser nur aus einem Blatt, was einer ungeteilten Zone entspricht, so kann er in diesem einfachen Fall dem Nachbarn sein Gebiet übergeben. Damit vergößert sich das Gebiet des Nachbarn um das Doppelte ohne das eine weitere Fragmentierung stattfindet, siehe Abbildung 3.10 4. und Vorlesung 17.05.2004 21.05.2004 Ist aber die Nachbarzone weiter unterteilt, so muss erst ein geeigneter Kandidat zur übernahme dieser Zone A gefunden werden. Hierfür wird im Bruderbaum eine Tiefensuche durchgeführt nach zwei benachbarten Blättern. Sind diese gefunden, wird einem das Gebiet seines Nachbarn übertragen. Dem nun 5. freigeworden Blatt (Peer) wird die Zone A übertragen. 3.3.6 Ungleichungen der Wahrscheinlichkeitstheorie Der Erwartungswert E[X] einer Zufallsvariable gibt ein Indiz, wie der Wert einer Durchschnittsvariable bei häufiger Wiederholung im Mittel sein wird. Er ist für diskrete Zufallsvariablen definiert durch E[X] = X P[X = x]x . x∈R Aus dieser Definition lässt sich schon eine grobe Abschätzung für die Wahrscheinlichkeit ableiten, wie stark man von dieser Schranke abweicht. Betrachtet man alle Summenterme, für die das Ereignis mindes22 Peer B Peer B Tiefensuche Peer E Peer C Peer D Peer E Peer C Abbildung 3.10: Der einfache Fall der Defragmentierung in CAN Peer D Abbildung 3.11: Der schwierige Fall der Defragmentierung in CAN 23 tens kE[X] ist, so bezeichnet P[X > kE[X]] die Wahrscheinlichkeit dafür. Nun ist E[X] = X P[X = x]x x∈R ≥ X P[X = x]x x≥kE[X] ≥ X P[X = x] · k · E[X] x≥kE[X] = k · E[X] · X P[X = x] x≥k·E[X] = k · E[X] · P[x ≥ k · E[X]] . Hieraus folgt nun die Markoff-Ungleichung, indem man für positiven Erwartungswert beide Seiten durch den E[X] teilt. Theorem 2 Markoff-Ungleichung Für eine Zufallsvariable X mit E[X] > 0 gilt P[x ≥ k · E[X]] < 1 . k Eine bessere Abschätzung ergibt sich durch Chebyshevs Ungleichung welche besagt, dass P[|X − E[X]| ≥ k] ≤ V [X] , k2 wobei V [X] := E[(X − E[X])2 ] die Varianz von X bezeichnet. Besteht aber die Zufallsvariable aus einer Reihe von unabhängigen 0/1 Experimenten, genannt BernuolliExperimente, so ergibt sich mit der nun folgenden Chernoff-Schranke ein wesentlich mächtigeres Hilfsmittel zur Beschränkung der Abweichung. Theorem 3 Chernoff-Schranke Seien P x1 , . . . , xn unabhängige Bernoulli-Experimente mit P[xi = 1] = p und P[xi = 0] = 1 − p. Sei n Sn = i=1 xi . 1. Dann gilt für jedes c > 0 P[Sn ≥ (1 + c)E[Sn ]] ≤ e− min{c,c2 } pn 3 . 2. Für c ∈ [0, 1] : P[Sn ≤ (1 − c)E[Sn ]] ≤ e− c2 2 pn . Beweis: 1. Es gilt für jedes t > 0: P[Sn ≥ (1 + c)pn] = P[etSn ≥ et(1+c)pn ] . Die Markov-Ungleichung liefert nun 1 P etSn ≥ kE etSn ≤ . k 24 E[etSn ] h Pn i = E et i=1 xi " n # Y txi = E e i=1 = = n Y i=1 n Y E etxi (e0 (1 − p) + et p) i=1 = (1 − p + et p)n = (1 + (et − 1)p)n Hierbei haben wir die Voraussetzung benutzt, dass die Zufallsvariablen xi unabhängig sind (und damit auch die Zufallsvariablen etxi ). Für die erste Schranke wählen wir nun k = et(1+c)pn /E[et·Sn ] und t = ln(1 + c) > 0. Damit ist nun P[Sn ≥ (1 + c)pn] ≤ e−t(1+c)pn · (1 + p(et − 1))n −t(1+c)pn ≤ e pn(et −1) ·e (3.1) (3.2) −t(1+c)pn+pn(et −1) = e = e−(1+c) ln(1+c)pn+cpn = e(c−(1+c) ln(1+c))pn (3.3) Dabei folgt (3.1) durch Einsetzen von k. Dann folgt (3.2) weil für alle a gilt (1 + a) ≤ ea und damit insbesondere für a = p(et − 1). Nun ist 1 d ln(1 + x) = = 1 − x + x2 − x3 + x4 − . . . dx 1+x und daraus folgt, dass 1 1 1 ln(1 + x) = x − x2 + x3 − x4 + . . . 2 3 4 Damit ist (1 + c) ln(1 + c) 1 1 3 1 1 4 1 1 5 1 2 = c+ 1− c − − c + − c − − c + ... 2 2 3 3 4 4 5 1 1 1 1 = c + c2 − c3 − c4 + c5 − . . . 2 6 12 20 Daraus folgt die Ungleichung (1 + c) ln(1 + c) ≥ c + 12 c2 − 61 c3 ≥ c + 13 c2 für c ∈ [0, 1]. Das setzen wir in die Ungleichung (3.3) ein und erhalten P[Sn ≥ (1 + c)pn] ≤ e(c−(1+c) ln(1+c))pn 2. Nun sei t < 0. Dann gilt P[Sn ≤ (1 − c)pn] = P[etSn ≥ et(1−c)pn ] . Die Markov-Ungleichung kann nun ebenfalls angewendet werden 1 P etSn ≥ kE etSn ≤ . k 25 1 2 ≤ e− 3 pnc Analog wie im ersten Fall erhalten wir E[etSn ] = (1 + (et − 1)p)n Wir wählen nun k = et(1−c)pn /E[et·Sn ] und t = ln(1 − c) < 0. Damit ist nun P[Sn ≤ (1 − c)pn] ≤ e−t(1−c)pn · (1 + p(et − 1))n −t(1−c)pn ≤ e pn(et −1) ·e (3.4) (3.5) −t(1−c)pn+pn(et −1) = e = e−(1−c) ln(1−c)pn−cpn = e−c−(1−c) ln(1−c))pn (3.6) (3.7) Dabei folgt (3.4) durch Einsetzen von k, (3.6) durch Einsetzen von t. Dann folgt (3.5) weil für alle a ∈ R 1 + a ≤ ea gilt (und insbesondere für a = p(et − 1)). Nun zeigen wir noch für c ∈ (0, 1), dass 1 −c − (1 − c) ln(1 − c) ≤ − c2 . 2 Für c = 0 erhält man sowohl auf der linken als auch auf der rechten Seite 0. Die Ableitung nach c der linken Seite ist ln(1 − c), die der rechten Seite ist −c. Nun ist für c ≤ 1: 1 1 ln(1 − c) = −c − c2 − c3 − . . . < −c . 2 3 Daraus folgt, dass wie gewünscht −c − (1 − c) ln(1 − c) ≤ − 21 c2 und das impliziert nun 1 2 P[Sn ≤ (1 − c)pn] ≤ e− 2 c pn . 3.3.7 Realitäten Hier fehlt noch was . . . 3.4 CHORD: Konsistentes Hashing für P2P-Netzwerke Dieses System benutzt eine Zeigerstruktur aus O(log n) Zeigern für jeden Knoten. Es wurde in [SMK+ 01] von Stoica, Karger, Kaashoek und Balakrishnan im Jahr 2001 vorgestellt und benutzt konsistentes Hashing. 3.4.1 Die Datenstruktur von Chord Wir bezeichnen mit V die Knotenmenge, (d.h. n = |V |) und mit K die Schlüsselmenge (d.h. k = |K|). Eine relativ unwesentliche Veränderung gegenüber dem oben vorgestellten konsistenten Hashing ist dass wir nicht mehr auf das kontinuierliche Intervall [0, 1] sondern auf die Zahlen Z2m = {0, 1, 2, . . . , 2m − 1} abbilden. Die Zahl m muss groß genug gewählt werden, so dass eine Kollision mit vernachlässigbarer Wahrscheinlichkeit geschieht (Eine Wahl m ≥ max{2 log n, 2 log k} ist hierfür ausreichend). Andererseits sollte m auch nicht zu groß sein, damit sie im Darstellungsbereich der Zahlen der Rechner verbleibt. Es werden wiederum zwei Hashfunktionen rV : V × Z2m und rK : K × Z2m verwendet. • rV (b) bildet den Knoten b zufällig auf das Intervall {0, . . . , 2m − 1} ab. • rK (i) bildet den Schlüssel i zufällig auf das selbe Intervall {0, . . . , 2m − 1} ab. 26 HEINZ NIXDORF INS TITUT Chord als DHT Universität Paderborn Algorithmen und Komplexität Christian Schindelhauer rV( b) = b+1 mod 8 !n: Knotenanzahl, Knotenmenge V 5 !k: Anzahl Schlüssel, Schlüsselmenge K 6 !m: Hashwertlänge: m >> log max{K,N} 5 !Zwei Hash-Funktionen bilden auf {0,..,2m-1} ab – rV(b): bildet Peer b zufällig auf {0,..,2m-1} ab – rK(i): bildet Index i zufällig auf {0,..,2m-1} ab !Abbildung von i auf einen Peer b = fv(i) – 7 3 rK( i) = 3i-2 mod 8 2 4 2 3 0 6 Index 2 1 0 fV(i) := arg minb!V (rB(b)-rK(i)) mod 2m Abbildung 3.12: Konsistentes Hashing in der Chord-Datenstruktur Algorithmen für Peer-to-PeerNetzw erke 19 Die Zuordnung der Schlüssel auf die Knoten wird nun durch die Funktion fV : K → V beschrieben. fV (i) := arg min(rV (b) − rK (i)) mod 2m . b∈V In Abbildung 3.12 wird diese Abbildung beschrieben. Als Hilfsfunktionen definieren wir nun p : Z2m → V als den Knoten der dem Hashwert vorangeht (p wie predecessor): p(x) := min{b ∈ V | rV (b) < z} . Für die andere Richtung definieren wir s : Z2m → V als den Knoten der dem Hashwert nachfolgt (s wie successor): s(x) := min{b ∈ V | rV (b) > z} . Wir setzen im Folgenden immer voraus, dass weder bei den Schlüsseln noch bei den Knoten jemals eine Kollision auftritt. Nun werden für jeden Knoten folgende Zeiger auf andere Knoten angelegt (Abbildung 3.13). • Successor: b.succ := s(rV (b)) Der Nachfolgerzeiger zeigt auf den im Bildintervall folgenden Knoten. Mit diesen Zeiger kann jeder Knoten auf dem Ring erreicht werden, wenn auch im worst-case und im Durchschnitt linearer Zeit. • Predecessor: b.pred := p(rV (b)) Der Vorgängerzeiger entspricht der umgekehrten Version des Nachfolgerzeigers. Zusammen mit diesen erhalten wir so einen doppelt verketteten Ring als Grunddatenstruktur. • Finger: b.finger[i] := s(rV (b) + 2i − 1) für i ∈ {0, . . . , m − 1} Diese m Finger implementieren die effiziente Datenstruktur. Hiermit kann man sich sehr effizient durch den Ring bewegen, wie wir gleich sehen werden. Jeder dieser Finger ist im Prinzip ein Nachfolgerzeiger, der in der Lage ist die Hälfte, ein Viertel oder ein Achtel, etc. der Knoten zu überspringen. Für kleine i werden nur wenig unterschiedliche Fingereinträge vorkommen. Daher werden wir nur unterschiedliche Fingereinträge speichern, um den Speicheraufwand zu minimieren. Um die Anzahl der Fingereinträge abzuschätzen, benötigen wir folgendes Lemma. Lemma 2 Der Abstand (rV (b.succ) − rV (b)) mod 2m ist 27 successor predecessor finger[m-3] finger[m-2] finger[m-1] Abbildung 3.13: Die Zeigerstruktur von Chord. 1. im Erwartungswert 2m /n. 2. mit polynomieller Wahrscheinlichkeit höchstens O( 2 m log n ) n m 3. und mit polynomieller Wahrscheinlichkeit mindestens O( 2nc ). m 4. In einem Intervall der Länge w 2n sind mit polynomieller Wahrscheinlichkeit (a) höchstens O(w) Knoten, falls w = Ω(log n); (b) höchstens O(w log n) Knoten, falls w = O(log n). Beweis: Die Aussage über den Erwartungswert folgt daraus, dass die Summe aller n Intervalllängen 2m ergibt. Die Aussage über die Mindestlänge des Intervalls ergibt sich daraus, dass die Wahrscheinlichkeit, dass ein Knoten in ein solch kleines Intervall fällt, höchstens n−c ist. Damit hat jeder Knoten, der neu hinzukommt nur mit Wahrscheinlichkeit 2nc−1 die Möglichkeit so dicht neben einen vorhandenen Knoten zu liegen zu kommen. Da dass höchstens n mal passiert, ist die Gesamtwahrscheinlichkeit beschränkt durch 2n−c+2 . Die anderen Aussagen leiten sich durch Anwenden der Chernoff-Schranke an (Der Beweis dieser Aussage eignet sich hervorragend, um den Umgang mit Chernoff-Schranken einzuüben). Aus diesem Lemma ergibt sich nun. Lemma 3 Die Anzahl der verschiedenen Fingerzeiger eines Knotens ist mit polynomieller Wahrscheinlichkeit O(log n) Diese Aussage folgt aus der unteren Schranke der Mindestlänge eines Intervalls. Damit ist mit hoher Wahrscheinlichkeit die Chord-Datenstruktur eine sehr kompakte Datenstruktur. Auch der Ingrad eines Knotens ist polylogarithmisch beschränkt. Lemma 4 Die Anzahl der Knoten, die einen Fingerzeiger auf einen Knoten b besitzen, ist • im Erwartungswert höchstens O(log n) 28 Chord-Suche(b,i) begin x ← rK (i) while x 6∈ [rV (b), rV (b.succ)) do for i ← m − 1 downto 0 do if x ∈ [rV (b.finger[i]), rV (b.finger[i + 1])) then b ← b.finger[i] fi od return(b) end. Abbildung 3.14: Der Suchalgorithmus für die Chord-Datenstruktur • und mit polynomieller Wahrscheinlichkeit beschränkt durch O(log2 n). Beweis: Die Aussage über den Erwartungswert ergibt sich daraus, dass die Anzahl der eingehenden Kanten gleich der Anzahl der ausgehenden Kanten ist. Damit ist für einen zufälligen Knoten b der erwartete Eingrad gleich dem erwarteten Ausgrad. Wir gehen also davon aus, dass mit polynomieller Wahrscheinlichkeit, der Abstand zweier benachbarter Knoten auf dem Ring beschränkt ist durch c2m n−1 log n. Wir betrachten jetzt einen der maximal O(log n) Werte für i, für die Fingerzeiger vom Nachfolger verschieden sind. Alle Bilder von Knoten, die auf b zeigen müssen im Intervall [rV (b.pred) − 2i + 1, rV (b) − 2i + 1] liegen. Auch dieses Intervall hat die Maximallänge c2m n−1 log n. Damit ist die erwartete Anzahl von Knoten in diesem Intervall c log n. Durch Anwenden der Chernoff-Schranke erhalten wir für δ > 1 also 2 2 Anzahl der Knoten b0 mit b0 .pred = b ist P ≤ e−δ c log n/3 ≤ n−cδ /3 . größer als (1 + δ)c log n Diese logarithmische Anzahl von Fingerzeigen im Abstand 2i müssen wir noch mit der logarithmischen Anzahl von Zeigerebenen multiplizieren. 3.4.2 Suche in Chord Die Suche nach einem Schlüssel erfolgt mit dem Suchalgorithmus, der in Abbildung 3.14 dargestellt wird. Die Effizienz eines solchen Algorithmus wird in der Anzahl von Nachrichten gemessen. Als Eingabe erhält der Algorithmus irgendeinen Knoten des Rings und den Schlüssel. Als Ausgabe erhält man den Knoten, der für die Verwaltung des Schlüssels verantwortlich ist. Zwei Iterationen dieses Suchalgorithmus sind in Abbildung 3.15 dargestellt. Dieser Algorithmus arbeitet tatsächlich sehr effizient: Theorem 4 Die Schlüsselsuche in Chord kann mit O(log n) Anfrage mit polynomieller Wahrscheinlichkeiit erfolgen, d.h. O(log n) Nachrichten genügen für das Einfügen und Löschen von Schlüsseln. Beweis: Die Anzahl der Nachrichten, um einen Durchlauf der For-Schleife durchzuführen ist konstant. In jedem Durchlauf dieser For-Schleife verkleinert sich das nächste Suchintervall um die Hälfte, da der Mindestabstand zweiter Knoten auf dem Ring polynomiell ist (mit polynomieller Wahrscheinlichkeit) folgt hieraus das Theorem. 3.4.3 Aufnehmen von Peers Der Aufwand um Knoten aufzunehmen und zu Entfernen ist geringfügig höher. Schließlich kann der Eingrad in bis zu O(log2 n) betragen und diese Zeiger müssen aktualisiert werden. 29 Abbildung 3.15: Schlüsselsuche im Chord P2P-Netzwerk Theorem 5 Es genügen O(log2 n) Nachrichten mit polynomieller Wahrscheinlichkeit, um einen Knoten in die Chord-Datenstruktur aufzunehmen oder aus ihr zu entfernen. Beweis: Wir geben hier eine Beweisskizze für den Fall an, dass ein Knoten aufgenommen wird. Entsprechende Überlegungen gelten für den Fall, dass ein Knoten entfert wird. Der Aufwand, um die Stelle zu finden, in der ein Knoten eingefügt werden soll, ist wie oben beschrieben O(log n). Um ihn in den doppelt verketteten Ring einzufügen müssen nur konstant viele Zeiger umgehängt werden. Wir werden jetzt zeigen, dass für jeden Level i die O(log n) Nachrichten für das Anpassen der Zeigerstruktur genügen. Wir wissen bereits, dass in so einem Level nur O(log n) Knoten betroffen sind. Diese sind im Ring zusammenhängend. Um den ersten zu finden sind wieder O(log n) Interaktionen notwendig. Danach kann man die Ringnachfolgerzeiger verwenden um in O(log n) nachfolgenden Schritten jeden dieser Knoten zu besuchen. Der Aufwand, um den entsprechenden Fingerzeiger anzupassen ist entsprechend konstant. Hieraus folgt die gewünschte Schranke für die Anzahl der Nachrichten 3.5 Koorde 6. Vorlesung 28.05.2004 Das Peer-to-Peer-Netzwerk von Karger und Kaashoek [KK03] verbessert den Ansatz von Chord hinsichtlich des Grads der Knoten und der Zeitdauer für die Einfüge-Operationen. Wir haben bei Chord einen Grad von O(log n) (mit hoher Wahrscheinlichkeit) beobacht. Dabei hat CHORD einen Durchmesser von O(log n). Einen wesentlich kleineren Grad kann bei diesem Grad nicht erwarten. Denn bei Grad g kann man in d Schritten höchstens g d Knoten erreichen. Akzeptiert man als sinnvollen Ausgrad für ein Peer-to-Peer-Netzwerk den Grad g = log n dann kann man bestenfalls nach d Schritten für (log n)d = n einen beliebigen anderen Peer erreichen. Löst man diese Gleichung nach d auf, erhält man d = logloglogn n . Das ist zwar asymptotisch kleiner als log n, jedoch nur um den Term log log n, der für alle sinnvollen Netzwerkgrößen höchstens 6 wird (Tatsächlich gibt es Netzwerke mit solch guten Eigenschaften. Diese Eigenschaft wird insbesondere vom log n-dimensionalen Hyperwürfel erfüllt). Da nun hinsichtlich der Weglänge in Peer-to-Peer-Netzwerke sehr wenig Spielraum zur Verbesserung vorhanden sind, untersuchen wir jetzt die Frage, ob bei logarithmischen Durchmesser sich der Grad reduzieren kann. Dann wenn man den Ausgrad des Graphen auf zum Beispiel 4 reduziert, dann ist nach obiger Überlegung immer noch ein Durchmesser von O(log n) möglich. Tatsächlich erreicht dies Koorde [KK03] durch eine sehr elegante Kombination durch einen Ring-Graph und einen DeBrujin-Graphen, die wir hier vorstellen werden. 3.5.1 Der DeBrujin-Graph Doch wollen wir zuerst den DeBrujin-Graph vorstellen. Wir definieren hierfür einige einfache PermutationsFunktionen auf Binär-Zeichenketten der Länge m. 30 0 1 1 1 0 1 1 0 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 0 1 1 0 1 1 1 0 Abbildung 3.16: Die Shuffle-Operation. 1 0 1 1 1 0 0 0 1 1 1 0 1 1 0 1 1 1 0 0 1 0 1 1 1 0 1 0 1 1 1 0 0 1 1 Abbildung 3.17: Die Exchange-Operation. 0 1 1 1 0 1 1 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 1 Abbildung 3.18: Die Shuffle-Exchange-Operation. Abbildung 3.19: Jeder String lässt sich durch m Shuffle- oder Shuffle-Exchange-Operationen in jeden beliebigen anderen überführen. • Die Shuffle-Operation rotiert die m Bits nach links. Für Bits s1 , . . . , sm ∈ {0, 1} ist sie definiert durch shuffle(s1 , s2 , . . . , sm ) := (s2 , s3 , . . . , sm , s1 ) . Siehe auch Abbildung 3.16. • Bei der Exchange-Operation wird das niedrigst-wertige Bit invertiert, d.h. für Bits s1 , . . . , sm ∈ {0, 1}: exchange(s1 , s2 , . . . , sm ) := (s1 , s2 , . . . , ¬sm ) . Siehe auch Abbildung 3.17. • Bei der Shuffle-Exchange-Operation (auch SE-Operation) wird zuerst ein Shuffle und daraufhin eine Exchange-Operation auf dem Bitstring (Binärzeichenkette) ausgeführt: SE(S) := exchange(shuffle(S) . In der Bit-Darstellung ergibt sich SE(s1 , . . . , sm ) = (s2 , s3 , . . . , sm , ¬s1 ) . Siehe auch Abbildung 3.18 Wir halten folgnde Beobachtung fest. Fakt 1 Jeder String A aus m Bits lässt sich in jeden beliebigen String B durch m-faches Anwenden von Shuffle- und Shuffle-Exchange-Operationen umwandeln. 31 000 001 000 111 100 001 010 110 101 011 010 110 101 011 111 100 Abbildung 3.20: Der DeBrujinGraph für 8 Knoten. Abbildung 3.21: Der selbe DeBrujin-Graph. Die Knoten sind sortiert auf dem Ring aufgetragen. In Abbildung3.19 ist dies am Beispiel von A = (0111011) und B = (1001111) dargestellt. Man sieht an diesem Beispiel, dass jedes der m Bits sukzessive auf den korrekten Wert gesetzt werden. Die notwendige Folge der Operationen erhält man dann indem man A und B bitweise durch XOr kombiniert. Das Bit 1 zeigt dann an, dass eine Shuffle-Exchange-Operation anzuwenden ist, und Bit 0 steht dann für eine ShuffleOperation. Der DeBrujin-Graph kann jetzt mit Hilfe von Shuffle- und Exchange-Operationen wie folgt dargestellt werden. Der DeBrujin-Graph hat n = 2m Knoten. Jeder dieser Knoten stellt eine m-stellige Binärzahl dar. Jeder Knoten hat nun zwei ausgehende Kanten, wobei die erste Kante von u auf shuffle(u) und die zweite Kante von u auf SE(u) zeigt. Als Beispiel ist in Abbildung3.20 ein DeBrujin-Graph aus 8 Knoten dargestellt. Lemma 5 Der DeBrujin-Graph hat Eingrad und Ausgrad von jeweils 2 und Durchmesser log n Beweis: Die Eingrad-Bedingung folgt aus der Definition. Die Ausgrad-Bedingung folgt aus der Eigenschaft, dass sowohl Shuffle als auch Shuffle-Exchange Permutationen über den Binärzahlen sind. Dass der Durchmesser durch log n beschränkt ist, folgt aus Fakt3.16. Dieser Durchmesser wird auch nicht unterschritten, wie man am Beispiel der Knoten 0, . . . , 0 und 1, . . . , 1 leicht einsieht. 3.5.2 Die Topologie von Koorde Wie bereits erwähnt kombiniert man jetzt diesen DeBrujin-Graph mit einer Ring-Topologie und erhält (schon fast) die Koorde-Datenstruktur, dargestellt in Abbildung 3.21. Nun besitzt jeder Peer noch zusätzlich zwei Zeiger, jeweils auf den Vorgänger und Nachfolger, wobei hier die Bitstrings als Binärzahlen interpretiert werden. Aus dieser Abbildung ist nicht sofort die Struktur ersichtlich. Es entsteht vielmehr der Eindruck, dass die Struktur-Information des DeBrujin-Graphen hier nicht dargestellt wird. Dem ist aber nicht so. Daher betrachten wir noch einmal die Shuffle und Shuffle-Exchange-Operationen und interpretieren die Zahlen nun als ganzen Zahlen über dem Ring {0, . . . , 20 m − 1}. Es gilt shuffle(x) SE(x) = = (x div 2m−1 ) + (2x) mod 2m , 1 − (x div 2m−1 ) + (2x) mod 2m . 32 0 1 x 2y+1 2y 2x 2x+1 y n/2 Abbildung 3.22: Die Verbindungsstruktur der DeBrujin-Kanten auf dem Ring. Also zeigen die DeBrujin-Kanten von x auf 2x mod 2m und (2x + 1) mod 20 m, wie in Abbildung3.22 dargestellt. Damit wird die Bedeutung der Verbindung anschaulich beschrieben. Man kann aber nicht voraussetzen, dass eine Zuordnung der Peers auf Bitstrings der Länge m so durchgeführt werden kann, dass weder ein Bitstring nicht verwendet wird noch ein Bitstring mehrfach verwendet wird. Wählt man zufällige Bitstrings, so muss man m mindestens als m > (1 + c)log(n) für eine geeignete Konstante c wählen, um eine Kollision zu vermeiden. Dann ist nämlich die Wahrscheinlichkeit einer Kollision zweier Peers auf den selben Knoten höchstens n−c . Damit werden die meisten Bitstrings überhaupt nicht angenommen, d.h. die entsprechenden DeBrujin-Knoten werden nicht mit Peers besetzt. Um die Leerstellen aufzufüllen verwaltet jeder Peer alle DeBrujin-Knoten bis zu seinem Nachfolger auf dem Ring. Dieses betrifft aber nur die eingehenden Kanten. Die fehlenden ausgehenden Kanten werden vom Peer nicht übernommen. 3.5.3 Eigenschaften von Koorde Der Ausgrad bleibt damit auf zwei beschränkt, wobei der Eingrad zunehmen könnte. Nun gilt folgendes Theorem. Theorem 6 Für die Verbindungsstruktur von Koorde gelten folgende Eigenschaften 1. Jeder Peer hat vier Zeiger. 2. Auf jedem Knoten zeigen mit hoher Wahrscheinlichkeit höchstens O(logn) Zeiger. 3. Der Durchmesser ist mit hoher Wahrscheinlichkeit O(logn). 4. Der Lookup in Koorde kann mit O(log n) Sprüngen/Nachrichten durchgeführt werden. Beweis: 1. Die erste Eigenschaft folgt aus der Definition der Nachbarschaft. 33 virtuelle DeBrujin-Knoten im Verantwortungsbereich des Peers 00 10 20 21 02 O(log n) Peers im Intervall der Länge c (log n)/n 2m 11 01 12 22 Abbildung 3.24: Ein Grad-3-DeBrujin-Graph Abbildung 3.23: Der Eingrad der Knoten in Koorde ist mit hoher Wahrscheinlichkeit O(log n) 2. Wie bei Chord kann man mit hoher Wahrscheinlichkeit zeigen, dass der Abstand zweier benachbarter Peers mit hoher Wahrscheinlichkeit höchstens c(log n) größer ist als der durchschnittliche Abstand 2m /n. Die Strecke von der Peers auf diese virtuellen Knoten zeigen können, umfasst daher höchstens 2m c (logn) Knoten des DeBrujin-Graphen, siehe Abbildung 3.23. Mit Hilfe der Chernoff-Schranke 2n kann man nun zeigen, dass darin sich höchstens O(log n) Peers. Damit ist der Eingrad mit hoher Wahrscheinlichkeit beschränkt durch O(log n). 3. Wir starten mit dem Pfad der Länge m und verwenden hier auch (nicht-existierende) Kanten zwischen virtuellen DeBrujin-Knoten. Die Länge dieses Pfades ist nun m = O(log n). In einem zweiten Schritt ersetzen wir diese durch Ring-Kanten und die Kanten der verantwortlichen Peers. Im Erwartungswert wird jeder dieser Sprünge dadurch nur konstant, d.h. um drei Schritte pro kante, verlängert. Wodurch kann sich nun ein Pfad auf k + 3m Sprünge verlängern? Wenn zwischen virtuellen Knoten und Peer insgesamt mindestens k Peers liegen. Die erwartete Anzahl ist aber pro Sprung konstant und die Peers sind hinreichend unabhängig verteilt worden. Wir setzen nun k = c log n ein und wende daraufhin die Chernoff-Schranke an. 4. Dieses Verfahren zur Bestimmung des Durchmessers war konstruktiv und kann von einem LookupAlgorithmus nachvollzogen werden. Damit folgt die Schranke von O(log n) Sprüngen für eine Lookup-Operation. Damit liegt uns mit Koorde eine einfache Netzwerkstruktur vor, die mit konstanten Ausgrad äußerst effiziente Operationen zur Verfügungstellt. Schließlich folgt aus dem logarithmischen Aufwand zum Suchen einer Position (lookup), dass das Einfügen oder Löschen eines Peers ebenfalls in logarithmischer Zeit vorgenommen werden kann. Damit ist Koorde ebenso einfach wie Chord, nur effizienter. Negativ ist, dass im Gegensatz zu Chord für Koorde noch keine Stabilisierungsstrategie bekannt ist. Der kleine Grad bringt außerdem nicht nur Vorteile. So ist der Zusammenhang des Graphen entsprechend kleiner und damit nimmt die Gefahr zu, dass bei Ausfällen von Peers das Netzwerk auseinander fällt. 34 Will man dieses Problem lösen, dann kann man den Grad des Graphen erhöhen, indem man sogenannte Grad k-DeBrujin-Graphen betrachtet. Hierfür betrachten wir ein Alphabet aus k (statt zwei) Buchstaben, z.B. für k = 3, m = 2 siehe Abbildung 3.24. Jeder k-DeBrujin-Knoten x hat nun die Nachfolger (kx mod k m ), (kx + 1 mod k m ), (kx + 2 mod k m ), . . . , (kx + k − 1 mod k m ). Dadurch verkürzt sich der Durchmesser auf (logm)/(logk), während sich der Graphzusammenhang auf k erhöht. Diese Konstruktion stellt eine natürliche Verallgemeinerung von Koorde dar und die Ergebnisse lassen sich hier weitestgehend übertragen. 7. Vorlesung 05.06.2004 Vertretung 3.6 Tapestry Peter Mahlmann Das Peer-to-Peer Netzwerk Tapestry [HKRZ02] wurde in seiner ursprünglichen Version von Ben Y. Zhao, John D. Kubiatowicz und Anthony Joseph an der University of California, Berkeley, entwickelt. Als Besonderheit dieses Netzwerkes ist hervorzuheben, dass beim Aufbau des Netzwerkes Lokalität berücksichtigt wird um die beim Routing entstehenden Latenzzeiten gering zu halten. Wir werden zunächst einige Grundlegende Begriffe kennen lernen und uns dann mit der Netzwerkstruktur, dem Routing, der Verwaltung von Objekten und dem Einfügen neuer Peers beschäftigen. 3.6.1 Grundlegende Terminologie Objekte bzw. Peers im Tapestry-Netzwerk werden durch eindeutige Objekt-IDs bzw. Peer-IDs identifiziert. Peer-IDs können dabei zufällig vergeben oder durch Hashfunktionen bestimmt werden. Objekt-IDs werden wie schon bei CAN und CHORD durch Hashfunktionen berechnet. Beliebt hierfür sind kryptographische Hashfunktionen wie z.B. SHA-1. Der Vorteil einer kryptographischen Hashfunktion ist, dass böswillige Anwender nicht ständig Objekte einfügen können, für die ein ausgewählter Peer zuständig ist – was zur Überlastung des Peers führen würde. Denn um dieses zu erreichen, müsste der Anwender viele Objekte erstellen, die alle in einem kleinen Intervall des Bildbereichs der Hashfunktion liegen. Eben dieses wird für kryptographische Hashfunktionen jedoch als schwer angesehen. Eine Besonderheit im Tapestry-Netzwerk ist, dass die IDs als Zahlen bzw. Zeichenketten zur Basis b = 2k , k ∈ N interpretiert werden. Die Begründung hierfür liegt im Routing-Algorithmus des Netzwerks, wie wir später sehen werden. Für eine Zeichenkette α über dem Alphabet b bezeichne von nun an |α| die Länge dieser Zeichenkette. 3.6.2 Nachbarschaftsmengen Ein beliebiger Peer mit ID A unterhält Links zu ausgewählten anderen Peers, die einen Prefix x seiner Peer-ID mit ihm gemeinsam haben. Ein anderer Peer mit ID B = x ◦ δ kann also nur mit A benachbart sein, falls x◦δ 0 = A, für beliebiges δ, δ 0 . Wir bezeichnen dabei l = |x|+1 als den Level der Nachbarschaft. Abbildung 3.6.2 zeigt beispielhaft die Nachbarschaft des Peers mit ID 4227. A Die Nachbarn eines Peer werden in Nachbarschaftsmengen Nx,j eingeteilt. Für jedes Prefix x und jeden A Buchstaben j ∈ [0, b − 1] des Alphabets enthält die Nachbarschaftsmenge Nx,j Peers, deren IDs das Prefix x ◦ j mit A teilen. Wir werden diese im Folgenden als (x, j) Nachbarn bezeichnen. Für jedes x und j wird A der gemäß einer festgelegten Metrik naheste Peer zu A in Nx,j als primärer (x, j)-Nachbar bezeichnet, alle Weiteren als sekundäre (x, j)-Nachbarn. A A A , . . . , Nx,b−1 die Level-l Routing Tabelle des Wenn l = |x| + 1, dann bilden die Mengen Nx,0 , Nx,1 Peers A. Die Kardinalität der Nachbarschaftsmengen ist durch eine Konstante R begrenzt (sonst würde die Level-1 Routing Tabelle eines Peers alle anderen Peers enthalten und wir hätten es mit einem vollständigen Graphen zu tun). 3.6.3 Eigenschaften der Nachbarschaftsmengen und Routing A Eigenschaft 1: Konsistenz. Falls Nx,j = ∅ für beliebiges A gilt, dann existieren keine (x, j) Nachbarn im gesamten Netzwerk. Wir bezeichnen dies als ein „Loch“ in der Routing-Tabelle von A in Level |x| + 1, Buchstabe j. 35 4226 5233 Level 4 Level 1 4227 Level 2 4311 Level 3 Level 3 4264 4256 Abbildung 3.25: Nachbarschaft des Peers 4227. Aus der Konsistenz Eigenschaft, lässt sich direkt folgern, dass das Netzwerk zusammenhängend ist. Somit lässt sich ein einfacher Routing-Algorithmus für das Netzwerk angeben. Wir nehmen an, dass wir von einem Knoten mit ID A0 zu einem Knoten mit ID B = j1 ◦ j2 ◦ · · · ◦ jn routen möchten. Dies gelingt, A0 wählen. Von Peer A1 aus wählen wir schrittweise in dem wir im ersten Schritt einen Peer A1 ∈ N∅,j 1 A1 A2 Peers A2 ∈ Nj1 ,j2 , A3 ∈ Nj1 ◦j2 ,j3 usw. Auf diese Weise wird in jedem Routing-Schritt ein weiterer Buchstabe von A0 an B angepasst und nach logb |B| Schritten sind wir am gewünschten Ziel angelangt. Wir vernachlässigen zunächst, dass wir beim Routing auf Löcher in den Routing-Tabellen stossen können. Eine Lösung hierfür werden wir in Kürze kennen lernen. Eine wichtige Eigenschaft des Netzwerkes, die es von vielen anderen unterscheidet, ist die folgende: A Eigenschaft 2: Lokalität. Jede Nachbarschaftsmenge Nx,j enthält die bezüglich eines gegebenen metrischen Raumes nahesten (x, j) Nachbarn von Peer A. Der naheste Peer mit Prefix x ◦ j ist der primäre Nachbar, alle anderen sind sekundäre Nachbarn. Diese Eigenschaft gewährleistet, dass die beim Routing entstehenden Latenzzeiten möglichst gering gehalten werden. Des Weiteren kann Eigenschaft jeder Peer A seinen (gemäß der Latenzzeit) S durch diese A nahesten Nachbarn in der Menge j∈[0,b−1] N∅,j finden. 3.6.4 Objekte und Routing Peers die Objekte bereitstellen, werden in Tapestry Storage-Server genannt. Da ein Objekt von mehreren Storage-Servern bereitgestellt werden kann gibt es zusätzlich zu den Storage-Servern so genannte RootPeers, die für bestimmte Objekte verantwortlich. Für die Verwaltung eines Objekts mit ID ψ wird eine Menge Rψ = M apRoots(ψ) von Root-Peers eingesetzt. Die Menge Rψ bezeichnen wir im Weiteren als Root-Set und die Elemente dieser Mengen als Root-Peers. Aufgabe dieser Root-Peers ist es Links auf diejenigen Peers zu verwalten, die die entsprechenden Objekte bereitstellen. Man beachte, dass jedes Peer sowohl Storage-Server als auch Root-Peer sein kann. Um Objekte jederzeit lokalisieren zu können, muss Folgendes gewährleistet sein: Eigenschaft 3: Eindeutiges Root-Set. Das Root-Set Rψ für Objekt ψ muss eindeutig sein und insbesondere muss die Funktion M apRoots(ψ) immer das gleiche Root-Set Rψ generieren, egal wo im Netzwerk die Funktion aufgerufen wird. 36 437B 437A 43FE 4361 4228 4BF4 4664 4A6D 437E 197E CE75 39AA 437E Abbildung 3.26: Publikation von Objekten. Eine einfache Lösung die garantiert, dass M apRoots(ψ) immer die gleichen Server zurückliefert, egal wo im Netzwerk die Funktion aufgerufen wird ist die Verwendung von Hashfunktionen. Problematisch ist, dass dabei Peer-IDs zurückgeliefert werden können, die nicht im Netzwerk existieren. Dieses Problem könnte gelöst werden, in dem der dem berechneten Hashwert numerisch am nächsten liegende Peer verwendet wird. Hierfür ist jedoch eine globale Ordnung aller Peer-IDs notwendig, die in einem Peer-to-Peer System schwer aufrecht zu erhalten ist. Wie sich dieses Problem ohne globale Ordnung lösen lässt, werden wir in Abschnitt 3.6.5 sehen. Storage-Server müssen den zuständigen Root-Servern mitteilen, dass sie das entsprechende Objekt bereitstellen um es im Netzwerk verfügbar zu machen. Dies geschieht in dem sie eine entsprechende Nachricht entlang primärer Nachbarn zu jedem Peer A ∈ Rψ schicken. Auf jedem Peer der diese Nachricht weiterleitet wird dabei ein Objekt-Link auf den Storage-Server gespeichert, der die Nachricht abgeschickt hat. Abbildung 3.26 veranschaulicht diesen Vorgang. Um Fehlertoleranz zu gewährleisten werden alle beim Publikationsprozess entstandenen Zeiger nach einer festgelegten Zeit verworfen. Ein Storage-Server muss seine Objekte also in festgelgten Intervallen republizieren. Dies hat den Vorteil, dass Objekte von Peers die unerwartet ausgefallen sind, automatisch aus dem System entfernt werden. Des Weiteren werden Peers die sich erst nach dem ersten Publikationsprozess dem Netzwerk angeschlossen haben und nun auf dem Publikationspfad liegen nach kurzer Zeit automatisch mit den entsprechenden Objekt-Links versorgt. Falls von einem Peer aus nach einem Objekt ψ gesucht wird, so wird von diesem Peer das entsprechende Root Set Rψ berechnet und anschließend zu einem beliebigen Root-Server aus Rψ geroutet. Wird auf dem Weg zu dem ausgewählten Root-Server auf einen Link für das gesuchte Objekt getroffen, so wird direkt zu dem Storage-Server gesprungen. Auf diese Weise werden Peers die nahe (bezüglich ihrer ID) zu dem gesuchten Storage-Server liegen bei der Suche schnell auf Abkürzungen treffen und müssen nicht bis zum Storage-Server routen. In Abbildung 3.27 wird der Routing-Vorgang dargestellt. Peer 197E sucht nach Objekt 437E und schickt die Anfrage an den zuständigen Root-Server 437B. Auf dem Weg dahin wird bei Peer 4361 ein Objekt-Link für das gesuchte Objekt gefunden. Das Routing wird abgebrochen und es wird direkt zu Peer 39AA gesprungen, der das gesuchte Objekt bereitstellt. 37 437B 437A 43FE 4361 4228 4BF4 4664 4A6D 437E 197E CE75 39AA 437E Abbildung 3.27: Routing im Tapestry Netzwerk. 3.6.5 Surrogate-Routing Ein Problem, dass wir bislang vernachlässigt haben, ist, dass die von M apRoots(ψ) gelieferten Peers unter umständen gar nicht im Netzwerk existieren. Dies ist sogar wahrscheinlich, da der Namensraum nur sehr dünn besetzt ist um Kollisionen zu vermeiden. Ein anderes Problem sind die dadurch entstehenden Löcher in den Routing-Tabellen. Die Lösung für dieses Problem wurde von den Autoren Surrogate-Routing genannt und funktioniert wie folgt. Wie bisher wird schrittweise versucht den Root-Server zu erreichen. Wird dabei auf ein Loch an Stelle (x, j) der Routing Tabelle eines Peers gestossen, so wird stattdessen nach (x, j +1) geroutet. Handelt es sich auch dabei um ein Loch in der Routing Tabelle, wird jeweils das nächst höhere j genommen. Dieser Vorgang wird so lange wiederholt, bis der gesuchte Peer erreicht wurde oder der aktuelle Peer keine Einträge in höheren Leveln und nur den einen, über den er erreicht wurde, im aktuellen Level seiner Routing Tabelle hat. Es bleibt folgendes Theorem zu zeigen: Theorem 7 Wenn Eigenschaft 1 (Konsistenz) gilt, dann wird durch Surrogate Routing ein eindeutiger Peer erreicht, egal von wo im Netzwerk das Routing startet. Beweis: Beweis durch Widerspruch. Wir nehmen an eine Anfrage nach Objekt ψ endet bei zwei verschiedenen Peers A und B. Sei x das längste gemeinsame Prefix von A und B mit |x| = i. Seien A0 und B 0 die Peers, die den i + 1-ten Routing Schritt durchführen. Man beachte, dass nach diesem Schritt die ersten i + 1 Buchstaben stets gleich bleiben. A0 und B 0 sind also diejenigen Peers, die unterschiedliche Wege wählen. A0 B0 Wegen der Konsistenz Eigenschaft gilt jedoch, dass von den Mengen Nx,∗ und Nx,∗ die gleichen leer sein 0 0 müssen. Deshalb werden A und B die Nachricht an einen Peer mit demselben Buchstaben an Stelle i + 1 schicken, es sei denn, die Konsistenz ist gestört. Dies ist ein Widerspruch! Wir halten an dieser Stelle fest, dass Surrogate Routing höchstens O(log n) (n ist die Anzahl der Peers) Hops benötigt um das gewünschte Ziel zu erreichen, da in jedem Schritt ein Buchstabe angepasst wird. 3.6.6 Einfügen neuer Peers Wird ein neuer Peer in ein bestehendes Netzwerk eingefügt, so soll das resultierende Netzwerk demjenigen gleich sein, dass enstanden wäre, wenn das Netzwerk von Grund auf mit diesem Peer konstruiert worden 38 wäre. Um dies gewährleisten zu können, müsste zusätzlich folgende Eigenschaft erfüllt sein: Eigenschaft 4. Liegt ein Peer A auf dem Pfad zwischen dem publizierenden Peer von Objekt ψ und dessen Root-Server, dann besitzt A einen Objekt-Link auf ψ. Objekte bleiben jedoch auch erreichbar, wenn diese Eigenschaft nicht erfüllt ist. Das schlimmste was passieren kann, ist dass die Suche etwas länger benötigt (jedoch immer noch höchstens (O log n) Hops). Deshalb werden wir diese Eigenschaft hier vernachlässigen, wir halten jedoch fest, dass es einen einfachen Algorithmus hierfür gibt [HKRZ02]. Kommen wir nun zum Einfüge-Algorithmus für neue Peers. Dieser lässt sich in drei wesentliche Schritte teilen: 1. Suche nach der eigenen ID im Netzwerk. Kopiere die Routing Tabelle des so gefundenen Surrogate Peers. 2. Kontaktiere die Peers, die Löcher in ihren Routingtabellen haben, die durch den neuen Peer gefüllt werden können. 3. Aufbauen und optimieren der eigenen Routing Tabelle. Wir werden die einzelnen Schritte der einfüge Operation nun näher erläutern. Schritt 1. Schritt 1 ist unproblematisch und benötigt O(log n) Hops. Schritt 2. Schritt 2 ist notwendig um Eigenschaft 2 (Konsistenz) gewährleisten zu können. Um dies zu erreichen wird der Acknowledged Multicast Algorithmus verwendet. Hierfür wird zunächst das längste gemeinsame Prefix x zwischen dem neuen Peer und dem beim Einfügen gefundenen Surrogate Peer bestimmt. Daraufhin wird wie folgt vorgegangen: • Der neue Peer sendet eine Multicast Nachricht an seinen Surrogate Peer. Diese besteht aus dem gemeinsamen Prefix und einer Funktion (dazu später mehr). A • Empfängt ein Peer A eine Multicast Nachricht, so sendet er sie weiter an jeweils einen seiner Nx,j , j ∈ [0, b − 1], Nachbarn mit Prefix x ◦ j. • Empfängt ein Peer eine Nachricht, die er nicht mehr weiterleiten kann, führt er die in der Nachricht enthaltene Funktion aus. • Die mitgesendete Funktion transferiert Verweise auf Objekte zum neuen Peer, falls dieser ein altes Surrogate Peer ersetzt und entfernt nicht mehr benötigte Verweise. Auf diese Weise wird verhindert, dass Objekte unerreichbar werden. • Jeder Peer, der Multicast Nachrichten verschickt hat, erwartet eine Rückmeldung (Acknowledge) von allen Empfängern. Sind alle Rückmeldungen eingetroffen, so benachrichtigt er den im Aufrufbaum „über“ ihm liegenden Peer. Wir werden nun zeigen, dass der Acknowledged Multicast Algorithmus tatsächlich alle Peers mit Prefix x erreicht. Theorem 8 Wenn der Empfänger einer Multicast Nachricht mit Prefix x sein Acknowledge versendet, dann haben zuvor alle Peers mit Prefix x eine Multicast Nachricht erhalten. Beweis: Beweis durch Induktion über die Länge von x. Induktionsanfang: Wir nehmen an, dass Peer A eine Multicast Nachricht mit Prefix x erhält und A der einzige Peer mit Prefix x ist. In diesem Fall ist die Behauptung offensichtlich korrekt. 39 Induktionsschritt von |x| = i → |x| = i − 1: Angenommen die Behauptung gilt für einen Prefix x mit |x| = i. Des Weiteren nehmen wir an, dass Peer A eine Multicast Nachricht mit Prefix x erhält. Dann sendet A Multicast Nachrichten an jeweils einen Peer mit den möglichen Erweiterungen von x (also x ◦ 0, . . . , x ◦ j − 1). Sobald A von jedem dieser Peers Acknowledge Nachrichten erhalten hat, wurden alle Peers mit Prefix x erreicht. Da A auf diese Acknowledge Nachrichten wartet, bevor die eigene Acknowledge Nachricht gesendet wird, haben bereits alle Peers mit Prefix x eine Multicast Nachricht erhalten, wenn A sein Acknowledge sendet. Schritt 3. Wir kommen nun zum dritten Schritt des Einfüge-Algorithmus für neue Peers. In diesem müssen die Nachbarschaftsmengen des neuen Peers aufgebaut und optimiert werden um die Eigenschaften 1 (Konsistenz) und insbesondere 2 (Lokalität) zu erfüllen. Dieses kommt dem Lösen des Naheste-Nachbarn Problems für viele verschiedene Prefixe gleich. Der Aufbau der Nachbarschaftsmengen geschieht Level-weise. Aus dem vorigen Schritt (Multicast) kennen wir bereits alle Peers, die das grösste gemeinsame Prefix x, |x| = i, mit dem neuen Peer A teilen. A Somit sind alle potentiellen Level i Nachbarn bekannt und es müssen nur noch für jede der Mengen Nx,j (j ∈ [0, i − 1]) die k nahesten von diesen ausgewählt werden. Anschließend werden sukzessive die Level i − 1 Nachbarn mit Hilfe der zuvor berechneten Level i Nachbarn berechnet, bis Level 1 erreicht wurde. Dies geschieht nach folgendem Algorithmus: 1. Fordere von allen Level i Nachbarn Listen mit Links ihrer Level i − 1 Nachbarn an. 2. Messe die Entfernung zu jedem der in Schritt 1 erhaltenen Peers gemäß einer gewählten Metrik3 . 3. Wähle die k nahesten für jedes j aus und speichere diese in der entsprechenden Nachbarschaftsmenge. Schritt 2 des Algorithmus ist von elementarer Bedeutung um die Lokalität des Netzwerkes zu gewährleisten. Damit dies tatsächlich funktioniert müssen wir zeigen, dass mit Hilfe der k nahesten Level i Nachbarn mit hoher Wahrscheinlichkeit die k nahesten Level i − i nachbarn gefunden werden können. Dies gelingt tatsächlich mit hoher Wahrscheinlichkeit, wenn k = O(log n) gewählt wird und die folgende Restriktion des metrischen Raumes, in dem die Peers sich befinden, angenommen wird: Wachstums-Restriktion: Bezeichne BA (r) die Menge aller Peers die sich im Ball mit Radius r um Peer A befinden. Dann muss für eine Konstante c |BA (2r)| ≤ c|BA (r)| 2 und c < b gelten. Die Konstante c wird als Expansionskonstante des Netzwerks bezeichnet. Diese Restriktion kann man sich etwa als eine gleichmässige Verteilung der Peers im Raum vorstellen, die gelten muss. Gilt diese Annahme nicht, so ist nicht mehr garantiert, dass der Algorithmus mit hoher Wahrscheinlichkeit die Lokalitätseigenschaft der Nachbarschaftsmengen aufrecht erhalten kann. Wir werden auf den Beweis der Korrektheit des Algorithmus an dieser Stelle aus Platzgründen verzichten. Er kann in [HKRZ02] nachgelesen werden. Betrachten wir abschließend den Aufwand des Einfüge-Algorithmus. Hierbei konzentrieren wir uns wieder auf die Netzwerklast und vernachlässigen lokale Berechnungen. In Schritt 1 kann der Surrogate Peer mit O(log n) Hops gefunden werden. Der Acknowledged Multicast Algorithmus (Schritt 2) benötigt O(m) Hops, wobei m die Zahl der erreichten Peers ist. m ist klein im Vergleich zu n [HKRZ02] und konstant. Der Aufbau der Nachbarschaftsmengen kann mit O(log2 n) Hops geschehen, da jeder Peer eine konstante Anzahl Nachbarn je Level hat beträgt die Laufzeit des Algorithmus zum Aufbau der Nachbarschaftsmengen O(k) = O(log n) pro Level und somit insgesamt O(log2 n) für alle Level. Insgesamt ergibt sich somit: 8. Vorlesung 14.06.2004 Theorem 9 Das Einfügen eines neuen Peers in Tapestry kann mit O(log2 n) Hops geschehen. 3 Eine geeignete Metrik wird z.B. durch die Ping-Zeit geliefert. 40 3.7 Pastry Peter Druschel (Rice University, Housten, Texas) und Antony Rowstron (Microsoft Research, Cambridge, GB) entwickelten in Cambridge bei Microsoft Research das Pastry-Peer-to-Peer-Netzwerk. Pastry und Tapestry werden wegen ihrer Ähnlichkeit gerne zusammen erwähnt. Tatsächlich beruhen beide auf den Routing-Algorithmus von Plaxton et al [PRR97]. Es gibt aber sowohl in der Umsetzung als auch in der Herangehensweise erhebliche Unterschiede, die wir nun vorstellen werden. Zielsetzung von Pastry ist ein vollständig dezentralisiertes, fehler-tolerantes, skalierbares und zuverlässiges Peer-to-Peer-Netzwerk. Wir beziehen uns hier im wesentlichen auf den Originalartikel [DR01b]: „Scalable, decentralized object location and routing for large scale peer-to-peer-network“. Pastry soll eine Basis bilden für die Konstruktion von Peer-to-Peer-Anwendungen, wie zum Beispiel globales File-Sharing, File-Storage und Gruppen-Kommunikation. In diesem Zusammenhang ist auch PAST zu sehen, vorgestellt in [DR01a] „A large-scale, persistent peer-to-peer storage utility“ von den selben Autoren. Überblick In Pastry werden jedem Peer 128-bit Identifikationsnummern (nodeID) gleichmäßig zugeordnet. Dies kann zum Beispiel durch zufällige Wahl geschehen oder durch das Anwenden einer kryptographischen Verschlüsselungsfunktion auf die IP-Adresse des Peers. Dadurch soll sicher gestellt werden, dass keine zwei die gleiche nodeID erhalten. Die Einträge werden durch Schlüssel adressiert, die ebenfalls auf {0, 1}128 abgebildet werden. Gemäß einer Metrik werden diese Schlüssel-Einträge zum nächstgelegenen Nachbarn weitergereicht. Die eigentliche Zeigerstruktur zwischen den Peers wird bei Pastry Routingtabelle genannt (erfüllt die Aufgabe der Finger bei Chord). Diese Routingtabelle hat bei Pastry (1+)(2b − 1) logb n + ` Einträge, wobei > 0 für große Anzahl n der Peers gegen 0 strebt. Die Parameter b (Wortlänge) und ` stellen Konfigurationsparameter dar (eine typische Wahl ist b = 4 und ` = 16). Der Zusammenhalt von Pastry ist wesentlich größer als zum Beisipiel der Chord. Dies wird durch den Parameter ` gesteuert und insbesondere ist die Auslieferung von Nachrichten garantiert, solange nicht mehr als `/2 beliebige Knoten ausfallen. Daneben ist das Einfügen von Peers ebenfalls effizient umgesetzt. Hierbei werden höchstens O((log n)/b) Nachrichten benötigt. 3.7.1 Die Zeigerstruktur Die Zeiger werden nun Routing-Tabelle und Leaf-Set genannt. Die Routingtabelle Die Routing-Tabelle orientiert sich am Routing von Plaxton et al. [PRR97]. Hierfür wird die NodeID zur Basis 2b dargestellt, also zum Beispiel NodeID: 65A0BA13 für b = 4. Nun kennt jeder Peer für jeden Präfix (Anfangsteilstring) p der NodeID über dem Alphabet 2b und für jeden Buchstaben x ∈ {0, . . . , 2b−1 } einen Repräsentanten der mit px anfängt, siehe Abbildung 3.28. Also im Beispiel mit b = 4 ist 2b = 16 und die Routing-tabelle des Konten mit NodeID 65A0BA13 besteht aus • 15 Einträgen von Knoten mit NodeID 0*,1*, . . . , F* • 15 Einträge für 60*, 61*, . . . , 6F* • 15 Einträge für 650*, 651*, . . . , 65F* • ··· Existiert kein Repräsentant, wird kein Eintrag vorgenommen. Gibt es mehrere Möglichkeiten einen Eintrag vorzunehmen, wird der bestmögliche Nachbar ausgewählt. Hierfür wird eine Abstandsmetrik zugrunde gelegt, die sich aus dem Latenzzeit (RTT — round trip time) zwischen Knoten und Repräsentanten ergibt. Wir werden gleich auf den Prozess zum Finden dieser Repräsentanten zurückkommen. 41 Abbildung 3.28: Beispiel einer Pastry-Routing-Tabelle [Aus einem Web-Dokument von Druschel und Rowstron, das nicht zitiert werden soll] 333 001 012 323 021 032 311 101 300 103 223 130 220 213 210 133 Abbildung 3.29: Die Pastry-Zeigerstruktur im Knoten 001 für b = 2 und ` = 2 Nachbarschaftsmengen Zusätzlich zu dieser Routing-Tabelle werden ` Nachbarn gemäß der NodeID gespeichert (gemäß der Anordnung der NodeID auf dem Ring). Hierzu werden d`/2e Peers rechts vom Ausgangspeer und b`/2c links vom Peer auf dem Ring addressiert. Als triviale Beobachtung können wir festhalten, dass alleine durch diese Nachbarschaftsmengen die Zielknoten immer gefunden In Abbildung 3.29 ist die Zeigerstruktur von Knoten mit NodeID 001 für b = 2 und ` = 4 beispielhaft dargestellt. Durch die zufällige Wahl der NodeIDs, ist die Anzahl der Speichereinträge in der Routing-Tabelle wie folgt beschränkt. Lemma 6 Für n Peers sind mit hoher Wahrscheinlichkeit sind (1 + )2b logb n Einträge in jeder Routingtabelle für beliebiges > 0. Beweis: Die Wahrscheinlichkeit, dass ein Peer einen bestimmten m-stelligen Präfix erhält ist 2−bm . Damit ist die Wahrscheinlichkeit, dass ein m-stelliger Präfix besetzt wird, höchstens n2−bm 42 003 333 001 012 323 021 032 311 101 300 103 223 130 220 213 210 133 Abbildung 3.30: Pastry-insert.pdf Setzen wir nun m = (1 + ) logb n ein, erhalten wir n2−bm = n2−(1+) log n = n · n−1− = n− Mit hoher Wahrscheinlichkeit ist also kein Peer mit dem gleichen Präfix der Länge (1 + )(log n)/b vorhanden. Damit gibt es (1 + )(log n)/b Zeilen á 2b − 1 Einträge. Daraus folgt das Lemma. 3.7.2 Einfügen von Peers Will ein neuer Peer X in das Pastry-Netzwerk aufgenommen werden, so muss er wenigstens einen Knoten des Netzwerks bereits kennen. Von diesem Knoten fahndet X nach dem Knoten Z mit dem längsten gemeinsamen Präfix p, indem X den Routing-Algorithmus aufruft. X erhält nun die Routing-Tabelle und die Nachbarschaftsmenge von Z. Dabei aktualisiert auch Z seine Nachbarschaftsmenge. Nun informiert X die `-Nachbarschaft, damit die Nachbarschaftsmengen aktualisiert werden können. Zusätzlich informiert X Peers in seiner Routing-Tabelle Peers mit gleichen Präfix p, so dass diese so weit notwendig, X als neuen Peer eintragen. Der Aufwand dieser Einfüge-Operation besteht aus ` Nachrichten an die Nachbarn der Nachbarschaftsmengen und erwartet 2b (log n)/b Nachrichten an Knoten mit gemeinsamen Präfix und natürlich einer Nachricht von Knoten Z, sowie einer Lookup-Operation, siehe auch Abbildung 3.30. Wenn das Einfügen versagt Die Einfüge-Operation von Pastry ist damit wesentlich einfach einfacher als die von Tapestry. Dagegen ist sie aber auch nicht immer korrekt. Es kann passieren, dass notwendige Zeigereinträge nicht aktualisiert werden. Dieses ist in Abbildung 3.31 dargestellt. Es ist nämlich nicht ausreichend nur die Zeiger der Peers des nächstgelegenden Peers zu aktualisieren, wie das Beispiel der Abbildung 3.31 lehrt: Falls kein Peer mit 1* vorhanden ist, müssen alle anderen Peers auf den neuen Knoten zeigen. Aber nach Einfügen von 11, erhält 11 nur die Einträge 22, 33 und 03 in der Routing-Tabelle (diese werden ihm von 03 übergeben). Damit informiert er zu wenig Peers, dass ab sofort auch der Präfix 1* besetzt wird. Es müssen nämlich alle Peers diese Eintrag besitzen. Reparatur-Maßnahmen Nun ist aber das Routing (Lookup) selbst dann sichergestellt, wenn Einträge in der Routing-Table fehlen, solange die Leaf-Sets (Nachbarschaftsmengen) ordentlich geführt werden. Peers 43 Neuer Peer Einträge in Leaf-Set 00 01 02 03 11 20 21 22 23 30 31 32 33 Notwendige Einträge in Routing-Table Fehlende Einträge Tatsächliche Einträge Abbildung 3.31: Nach dem Einfügen von Peer 11 werden nicht alle notwendigen Einträge aktualisiert 021 Fehlender Link 00* Anfrage an bekannte Nachbarn 03* 01* Links der Nachbarn Abbildung 3.32: Der Reparatur-Mechanismus für Pastry werden also in jedem Fall gefunden werden. Der einzige Nachteil, der durch fehlende Routing-TableEinträge erwächst, ist ein Verlust in der Geschwindigkeit. Um solche fehlenden Einträge in Routing-Tables zu reparieren, ist ein Mechanismus in Pastry vorgesehen. Angenommen, der Tabelleneintrag R`i fehlt bei Peer D (d.h. `-te Zeile, i-te Spalte des Routing-Table). Peer D bemerkt diesen Verlust zum Beispiel dadurch, dass eine Nachricht an oder von einem Peer mit diesem Präfix durch D befördert wird. Es kann aber auch vorkommen, dass ein Peer das Netzwerk verlässt und dadurch alte Einträge in der Routing-Table falsch oder überflüssig werden. Der Reparatur-Mechanismus geschieht wie folgt: Zuerst werden Peers der selben Zeile kontaktiert. Fehlt also beispielsweise dem Peer 021 ein Link zum Präfix 01*, dann fragt er die Nachbarn mit Präfix 00*, 02* und 03* nach diesem (siehe Abb. 3.32), falls einer dieser Peers diesen Präfix-Eintrag hat, wird er kopiert. Scheitert dies, wird ein Routing (Look-Up) zu der Adresse durchgeführt und aufgrund der Antwort der Eintrag gesetzt. 3.7.3 Routing Im Prinzip funktioniert der Look-Up (hier Routing genannt) wie folgt. Zuerst wird durch Hash-Funktion die Zieladresse hergestellt. Befindet sich die Zieladresse innerhalb der `-Nachbarschaft, wird direkt dorthin ausgeliefert oder zum nächsten Peer. Der nächste Peer ist derjenige, der das Fehlen eines Datums, Peers oder ähnliches feststellen kann. Ansonsten wird in der Routingtabelle die Adresse mit gemeinsame Präfix gesucht und dorthin die Nachricht weitergeleitet. Jetzt kann es, wie bereits erwähnt, geschehen, dass die Routing-Table fehlerhafte oder fehlende Einträge besitzt. Ist man dann mehr als `/2 Schritte vom Ziel entfernt, so kann man entweder versuchen gemäß der Nachbarschaft (die immer ordnungsgemäß geführt wird) den auf dem Ring entlanglaufen, was n/` Schritte im schlimmsten Fall benötigt. Man kann aber auch versuchen, den nächstbesten vorhandenen 44 L R M D A Rij Li Di shl(A) `-Nachbarschaft Routing-Table Knoten in der Nähe von A (gemäß Latenzzeit) Schlüssel als Adresse auf dem Ring Node-ID des aktuellen Peers j-te Zeile und i-te Spalte der Routing-Table Nummerierung der `-Nachbarschaft i-te Ziffer des Schlüssels D Länge des gemeinsamen Präfix von A und D in Ziffern über dem Alphabet {0, . . . , 2b − 1} Tabelle 3.1: Notation des Routing-Algorithmus von Pastry in Abbildung 3.33 Abbildung 3.33: Pastry-Routing-Alg funktionierenden Routing-Table-Eintrag zu verwenden. Tatsächlich wird in Pastry eine Kombination dieser Möglichkeiten verwendet, wobei noch eine Menge M von (latenz)-nahen Knoten hier hinzugenommen wird4 . Aus dieser Menge wird nun ein beliebiger Knoten genommen, der hinsichtlich der Namensmetrik (NodeID) näher am Ziel ist als der momentan betrachtete Peer. Wir geben hier die Originalbeschreibung des Algorithmus aus [DR01b] in Abbildung 3.33 wieder. Die verwendete Notation ist in Tabelle 3.1 dargestellt. Vorsicht: Die Variable `, die hier im Algorithmus verwendet wird bezeichnet nicht etwa die Größe der Nachbarschaft, sondern die Länge des größten gemeinsamen Präfix mit dem Ziel. Diskussion Für die Anzahl der Nachrichten und Sprünge, die Routing benötigt, um eine Nachricht auszuliefern, bedeutet dass, falls die Routing-Table korrekt und vollständig ist, benötigt Routing Aufwand O((log n)/b). Ist die Routing-Table vollständig unbrauchbar und wenigstens die Nachbarschaftsmenge korrekt, so benötigt Routing den Aufwand O(n/`) an Nachrichten und Sprüngen. Tatsächlich wird diese Laufzeit selbst bei durchgehend stark beschädigten Routing-Tables nicht erreicht. Routing ist selbst dann wesentlich schneller, da wenige korrekte Routing-Table-Einträge erhebliche Beschleunigungen ermöglicht. 4 die in der Beschreibung des Algorithmus zuvor in [DR01b] nicht erwähnt wird 45 In dieser reinen Form berücksichtigt das Routing nicht die wahren Abstände (bezüglich Latenzzeiten des zugrunde liegenden Netzwerks). Die ominöse Menge M wird nur benutzt, falls Fehler in der RoutingTabelle vorliegen. Es besteht aber die Möglichkeit durch Ausnutzung der Lokalität, Verbesserungen zu erreichen. Hierzu verwendet Pastry heuristische Ansätze zur Verbesserung der Latenzzeit. Diese werden in den besonders teuren letzten Hops angewendet (welches wie wir gleich sehen werden die letzten Schritte des Routings sind). Lokalisierung der k nächsten Knoten Eine wichtige Beobachtung zur Latenzzeit ist, dass die Nähe eines Knoten bezüglich der Ringmetrik (Raum über {0, 1}128 ) und der Latenzzeitmetrik (gemessen in der Zeit, die eine Nachricht durchschnittlich zwischen zwei Knoten benötigt) völlig unabhängig voneinander sind. Das heißt insbesondere, dass direkte Nachbarn im Peer-to-Peer-Netzwerk sind nicht Knoten in der Nähe sind. So könnte zum Beispiel ein Link von einen Rechner in Neuseeland nach Ostwestfalen führen, oder von Indien nach Kalifornien. Nun misst das TCP-Protokoll des Internets misst sowieso Latenzzeiten (durch die RTT — round trip time). Damit kann eine Metrik definiert werden, welche die Grundlage ist für die Suche eines nächsten Peers für die Einträge in der Routing-Table. So werden die Einträge in der Routing-Table optimiert. Diese Verfahren in Pastry beruhen auf heuristischen Überlegungen und kein mathematischer Nachweis der Güte der Verfahren ist bisher erbracht worden. Insbesondere gilt dies auch für die Annahme, dass diese Latenzmetrik euklidisch ist (d.h. es existiert eine Einbettung der Punkte in einem Raum, so dass die Latenzmetrik sich durch den Euklidischen Abstand dieser Punkte entsteht). Lokalität in der Routing-Table Um die Latenzzeit zu verkleiner wird folgende Heuristik angewendet. Es wird angenommen, dass beim Einfügen eines Peers A der Knoten zuerst einen (latenz-) nahen Knoten P kontaktiert. Weiter wird davon ausgegangen, dass alle anderen Peer ihre Routing-Table bereits optimiert haben (so dass jeder Zeiger auf einen Präfix p*, den Peer adressiert, der bzgl. der Latenzzeit am nächsten ist). Das Problem ist nun, dass der zuerst kontaktiert Peer P bezüglich der NodeID nicht sehr nahe sein wird. Trotzdem kann man aus der Nähe zu P einen Nutzen ziehen: Zuerst werden alle Einträge der ersten Zeile der Routing-Table von P in A übernommen. Da angenommen wurde, dass die Latenzzeit eine Euklidische Metrik ist, erhält man so zwar nicht unbedingt, den nächsten, aber im schlimmsten Fall höchsten einen, der doppelt so weit ist, wie der nächste. In einem zweiten Schritt wird der Peer aus der Routing-Table von P kontaktiert, der den ersten Buchstaben wie A hat. Nun wird der erste Schritt und zweite Schritt wiederholt, bis der Peer A seine Routing-Table so aufgefüllt hat. Die Abbildung 3.34 aus [DR01b] soll diesen Algorithmus veranschaulichen. Lokalität im Routing Wird für jeden Eintrag tatsächlich der latenz-nächste Peer ausgewählt, so steigt mit dem Zeilenindex die Länge der Sprünge exponentiell an (siehe Abbildung 3.35), falls die Peers im Euklidischen Raum gleich verteilt sind (Eine sehr weit gehende Annahme). Nun heisst das aber nicht, dass das Routing den kürzesten Weg wählt (das wäre bei einer Metrik in jedem Fall die direkte Verbindung zwischen zwei Punkten). Es besteht aber die Hoffnung, dass kurze Wege entstehen. Schließlich ist nun der Sprung am teuersten der die letzte Zeile der Routing-Table benötigt und hier kann man mittels der Leaf-Set-Einträge (Nachbarschaftsmengen) einen direkten Sprung benutzen und weitere sehr teure Wege verhindern. Lokalisierung (latenz-) naher Knoten Da wie bereits gesagt der Raum der Node-IDs und die Latenzmetrik völlig unvergleichbar sind, können bei der Speicherung replizierter Daten auf k Knoten, (latenz-) nahe Peers mit ähnlicher Node-ID übersehen werden. Diesen Umstand versuchen die Autoren mit einer Heuristik zu lösen, auf die hier aus Zeit- und Platz-Gründen nicht eingegangen wird. Zumindestens scheinen experimentelle Untersuchungen die Güte dieses Ansatzes zu bestätigen 46 Abbildung 3.34: Beim Einfügen eines Peers in Pastry, kann man die Latenzzeiten des Routing klein halten, indem man latenznahe Knoten eines Levels bevorzugt [DR01b] Abbildung 3.35: Die Latenzzeiten der Level i-Sprünge steigen bei Pastry expontiell in i an [DR01b] 47 Abbildung 3.36: Durchschnittliche Anzahl von Hops beim Routing von Pastry mit steigender Knotenanzahl (b = 4, ` = 16 und |M | = 32) [DR01b] Bösartige Fehler Ein allgemeines Problem bei Peer-to-Peer-Netzwerke ist die Behandlung von Peers, die sich nicht systemgemäß verhalten. Pastry sieht hierzu (noch) keine Lösungen vor. Als mögliche Lösungen werden eine Randomisierung des deterministisichen Routings vorgesehen, sowie der Einfüge-Operation. Für eine ausführliche Diskussion von Sicherheit und der Behandlung von bösartigen Angriffen auf ein Peer-to-Peer-Netzwerk sei auf spätere Kapitel dieses Skripts verwiesen. Ein weiteres Problem sein sogenannten IP-Routing-Anomalien. Mitunter sind Routen im Internet nicht vorhanden und Knoten nur über Umwege erreichbar. Dieses Problemen wird von Pastry, wie auch von anderen Peer-to-Peer-Netzwerken nicht gelöst. Diskutiert wird in [DR01b] eine Lösung durch IP Multicast. Überzeugen können diese Ansätze aber nicht. 3.7.4 Experimentelle Resultate Aufgrund der Schwierigkeit der analytischen Evaluation ihrer heuristischen Routinen, stellen die Autoren Druschel und Rowstron weitreichende experimentelle Untersuchungen ihres Peer-to-Peer-Netzwerks vor. Skalierung Für den Nachweis der Skalierbarkeit des Netzwerks werden für Parameter b = 4, ` = 16 und M = 32 die durchschnittliche Hop-Distanz, die beim Routing auftritt dargestellt. In diesem Experiment (Abb. 3.36) steigt die durchschnittlich Hop-Distanz logarithmisch mit der Knotenanzahl an. Eine mathematische Analyse sagt hier 4 log n voraus, was durch dieses Experiment nur bestätigt wird. Verteilung der Routing-Hops In Abbildung 3.37 ist die Auswertung dieses Experiments hinsichtlich der Verteilung der Hop-Entfernung dargestellt. Die Abweichung von der erwarteten Hop-Distanz ist extrem gering. Tatsächlich sagt auch die Analyse eine Abweichung mit polynomiell kleiner Wahrscheinlichkeit voraus. Wiederum eine gute Übereinstimmung von Analyse und Experiment. Latenzzeit Zuletzt werden die Latenzzeit (Abbildung 3.38) der direkten Entfernung mit dem kürzesten (direkten?) Weg verglichen. Der Unterschied ist erstaunlich gering und durchweg höchstens 30%-40% länger als bestmöglich. Mit steigender Knotenzahl scheint diese Kurve nicht zuzunehmen. Kritische Betrachtung der Experimente Mit der Parameterwahl b = 4, ` = 16 wird die Anzahl der Links pro Knoten relativ groß. Damit kann der Faktor 2b /b = 4 das Ergebnis erheblich beeinflussen. Wenn zum Beispiel n = 106 , dann sind 2b /b log n = 4 log n > 60 Links in der Routing-Table. Hinzu kommen noch 16 Links in der Nachbarschaftsmenge (Leaf-Set) und 32 in M (über deren genaue Wahl nichts bekannt 48 Abbildung 3.37: Verteilung der Hops beim Routing von Pastry mit steigender Knotenanzahl (b = 4, ` = 16, |M | = 32 und n = 106 ) [DR01b] Abbildung 3.38: Pastry-latency.pdf 49 Abbildung 3.39: Güte der Routing-Table von Pastry vor und nach dem Ausfall von 500 von 5.000 Peers und nach Abschluss der Repeartur-Routine [DR01b] wird). Dadurch ist der Grad im Verhältnis zu anderen Protokollen wie Chord oder auch Tapestry weitaus größer. Zumal die Annahme Euklidischer Latenzzeiten aus der Luft gegriffen, aber dennoch die Grundalge der experimentellen Untersuchungen ist. Die Stagnation des Verhältnis der Latenzzeit zur optimalen Latenzzeit nährt zuerst eher Zweifel an der Aussagekraft des Experiments. Knotenausfälle Zuletzt sei hier noch ein Experiment für die Zuverlässigkeit des Reparaturmechanismus wieder gegeben (Abbildung: 3.39). Hierbei bezeichnet No fail, die durchschnittlichen Einträge der RoutingTable vor dem Ausfall der Knoten. Dann fallen 500 von 5.000 Peers aus und No repair zeigten den Zustand der Routing-Table an. Repairl bezeichnet den Zustand nach der Reparatur. Die weiteren Parameter sind b = 4, ` = 16, |M | = 32 und n = 5.000. 3.7.5 Pastry versus Tapestry Pastry und Tapestry werden gerne in einem Atemzug genannt. Tatsächlich beruhen beide Peer-to-PeerNetzwerke auf dem selben Routing-Prinzip von Plaxton, Rajamaran und Richa [PRR97]. Dies stellt eine Verallgemeinerung von Routing auf dem Hyperwürfel dar und verringert die Congestion in StandardNetzwerken. Tapestry ist nicht vollständig selbstorganisierend, achtet aber stark auf die Konsistenz der RoutingTabelle. Tapestry ist ist analytisch gut verstanden und hat nachweisbare Performanz-Eigenschaften. In Pastry werden statt analytischer Methodik viele heuristische Methoden eingesetzt. Die eigentliche algorithmische Beschreibung ist ungenau (siehe M ) und experimentelle Verifikation ersetzt hier analytische Untersuchungen. Dagegen lässt sich Pastry praktisch besser umsetzen und ist durch die Nachbarschafts9. Vorlesung mengenn sehr robust. 11.06.2004 3.8 Viceroy — Ein Butterfly basiertes Peer-to-Peer-Netzwerk Es gab einige Zeit den Wettlauf, den Grad (Anzahl der Zeiger pro Peer) und Durchmesser von Peer-toPeer-Netzwerken zu minimieren. Angefangen hat es mit CAN, welches polynomiellen Durchmesser und konstanten Grad besitzt. Der Durchmesser war damit unakzeptabel hoch. Chord löste dies mittels einer 50 Abbildung 3.40: Der Butterfly-Graph Datenstruktur mit logarithmischen Durchmesser. Nur hat sich dadurch der Grad auf O(log n) verschlechtert. Dies löste dann Koorde (welches eigentlich später erschien als ViceRoy) ohne den logarithmischen Durchmesser zu verlieren. Koorde hat konstanten Ausgrad, aber logarithmischen Eingrad, d.h. jeder Peer zeigt nur auf vier andere, aber eine größere Anzahl von Peers können mitunter auf einen einzelnen Peer zeigen. Solche eine Situation kann zu einer ungleichen Verteilung von Datenlast führen und daher stellen wir in diesem und dem folgenden Abschnitt jeweils ein Peer-to-Peer-Netzwerk vor, dass dieses Problem löst und konstanten Ein- und Aus-Grad als auch logarithmischen Durchmesser vorsieht. Der Name Viceroy, bedeutet zugleich Vizekönig ist aber auch zugleich der Name einer Schmetterlingsart, welches auf die Grundprinzip hinweist. Viceroy wurde von Dahlia Malkhi, Moni Naor und David Ratajczak im Jahr 2001 [MNR02] entwickelt um eine skalierbare und dynamische Emulation des ButterflyGraphen vorzustellen. 3.8.1 Der Butterfly-Graph Für eine natürliche Zahl k besteht ein Butterfly-Graph aus k · 2k Knoten und 2k · 2k Kanten, wobei jeder Knoten Grad vier besitzt. Die Knoten eines Butterfly-Graphen werden mit (i, S) bezeichnet, wobei i ∈ {0, . . . , k − 1} und S einen k-stelligen Binär-String bezeichnet. Als Interpretation kann man sich k Ebenen vorstellen und in jeder Ebene befinden sich m = 2k Knoten. Kanten verbinden immer Ebene i mit Ebene i + 1 mod k. Es gibt zwei Typen von Kanten: • Senkrechte Kanten von (i, (b1 , . . . , bk )) nach (i + 1 mod k, (b1 , . . . , bk )) für alle i ∈ {0, . . . , k − 1}. • Diagonale Kanten von (i, (b1 , . . . , bi , . . . , bk )) nach (i + 1 mod k, (b1 , . . . , ¬bi , . . . , bk )) für alle i ∈ {0, . . . , k − 1} und bj ∈ {0, 1}. In Abbildung ist eine Butterfly-Graph für k = 3 dargestellt. Der Übersicht halber wurde die Ebene 0 zweimal dargestellt, nämlich in der untersten und obersten Reihe. Die Ebene 1 befindet sich in der zweiten Reihe von oben und die Ebene 2 in der dritten von oben. Eigenschaften Butterfly-Graph Aus der Definition ergibt sich schon, dass der Grad des ButterflyGraphen vier. Der Durchmesser ist log m = log n − log log n und damit optimal. Darüber hinaus besitzt der Butterfly-Graphen eine ganze Reihe guter Eigenschaften. Zum Beispiel können beliebige Netzwerke sehr effizient in einen Butterfly-Graphen eingebettet werden. Eine Einbettung eines Graphen in einen anderen geschieht dadurch, dass die Knoten des einen Graphen auf die des anderen (nicht notwendigerweise eineindeutig) abgebildet werden und die Kanten des einen Graphen durch Pfade in dem andern Graph dargestellte werden. Die Güte einer solchen Einbettung misst man dann in der Anzahl der Knoten, die der Zielgraph in einem seiner Knoten übernehmen muss und durch die maximale Pfadlänge einer simulierten Kante. 51 Daneben gibt es nicht nur sehr einfache Routing-Algorithmen, in denen eine Routing-Entscheidung lokal in konstanter Zeit möglich ist. Es können auch Flaschenhälse im Routing sehr einfach vermieden werden. Hierzu wird die Nachricht von Ebene i zu Ebene i + 1, i + 2, . . . , i + k − 1 mod k in jeweils eine zufällige Richtung versendet und dann in maximal 2k − 1 Schritten auf den direkten Weg entlang der Ebenen i, i + 1, . . . versendet. Durch ein solches Routing tritt keine um den Faktor O(log n) höhere Last auf als auf dem besten lastminimierenden Routing. Somit wird durch dieses einfache Verfahren kein Knoten beim Routing mit Nachrichten überlasten. Daneben hat der Butterfly-Graph eine hohe Fehlertoleranz, d.h. der Ausfall von Knoten kann gut ausgeglichen werden. Viele Gründe, die dafür sprechen auf einen Butterfly-Graphen ein Peer-to-Peer-Netzwerk aufzubauen. 3.8.2 Übersicht Die Zielsetzungen von ViceRoy waren neben der Skalierbarkeit, die Bewältigung von dynamischen Lastanforderungen und die gleichmäßige Verteilung des Nachrichtenaufkommens (Traffic). Dieses misst man mit dem Begriff der Congestion, das ist für ein bestimmtes Routing, die maximale Anzahl von Paketen, die ein Peer transportieren muss. Es ist einsichtig, dass die Congestion für die Zeit, die benötigt wird Nachrichten zu befördern, eine untere Schranke darstellt. Daneben sollen auch die Kosten für die Aufnahme und das Entfernen eines Peers klein gehalten werden, als auch die Länge des Suchpfads, welches im Routing-Bereich mit dem Begriff der Dilation bekannt ist. All diese Eigenschafte erfüllte Viceroy und außerdem war Viceroy das erste P2P-Netzwerk mit optimaler Beziehung zwischen Grad und Durchmesser. Dafür benutzt Viceroy Techniken, die sich auf andere Peer-to-Peer-Netzwerke übertragen lassen. Der Aufbau von Viceroy Leider ist der Aufbau von Viceroy etwas komplexer als der vergleichbarer Netzwerke. Vom Prinzip her versucht man in Viceroy die Peers auf die Knoten eines Butterfly-Graphen zu setzen. Jeder Peer wählt zufällig eine Ebene i und einen zufälligen Binärstring S und nimmt diesen Platz ein. Hierzu ist es aber notwendig, den Logarithmus der Knotenanzahl (log n) zu kennen und Mechanismen vorzusehen, falls der Butterfly-Graph nicht vollständig gefüllt ist (Das ist insbesondere dann der Fall, wenn n nicht die Form k · 2k hat. Viceroy erreicht dies durch eine Kombination von drei Strukturen: 1. Einen doppelt verketteten Ring für alle Peers. Dieser verknüpft ähnlich wie der Ring von Chord alle Peers und sorgt für einen elementaren Zusammenhalt. Die Reihenfolge der Peers auf diesen Ring ist nicht wichtig. Es wird auch nicht für Such-Operationen verwendet. 2. Für jede der log n Ebenen wird ein doppelt verketteter Ring angelegt. Hierfür wählt jeder der Peers zufällig eine Ebene und dann eine zufällige Zahl aus dem reellen Intervall [0, 1). Die ersten log n Ziffern der Binärdarstellung dieser Zahl x bestimmen dann (in etwa) die Position des Peers im ButterflyGraphen. 3. Schließlich kommen noch die eigentlichen Butterfly-Kanten hinzu: Hat ein Peer die Ebene i und dort die Zufallszahl x gezogen, dann hat er vier Zeiger (für k = log n). Siehe hierzu Abbildung 3.41. • Einen zum Nachfolger-Peer (auf dem Ring) der Adresse (i + 1 mod k, x) (Senkrechte Kante) • Einen Zeiger zum Nachfolger-Peer (auf dem Ring) der Adresse (i+1 mod k, x+2i ) (Diagonale Kante), falls x + 2i ≥ 1 ist, wird der Nachfolge-Peer von (i + 1 mod k, x + 2i − 1) genommen • Einen Zeiger zum Vorgänger (auf dem Ring) von (i − 1 mod k, x) (Senkrechte Rückwärtskante) • Einen Zeiger zum Vorgänger (auf dem Ring) von (i − 1 mod k, x − 2i ) (Senkrechte Rückwärtskante) (und entsprechend der Vorgänger von (i − 1 mod k, x − 2i + 1), falls x − 2i < 0). 52 Abbildung 3.41: Die Viceroy-Umsetzung eines Butterfly-Graphen aus [MNR02] Berechnung von log n Für Viceroy ist es notwendig, die Größe von log n zu kennen. Für ein Peer-toPeer-Netzwerk ist das keine triviale Aufgabe. Schließlich verlassen und betreten Peers ständig das Netzwerk ohne dass es lokal wahrgenommen wird. Eine einfache Methode zur Bestimmung von log n bis auf ± log log n + O(1) erhält man indem man den Abstand d zu dem k-nächsten Nachbarn auf einem Ring wie bei Chord betrachtet. Im Erwartungs wert ist dieser Abstand k/n. Man kann zeigen, dass er davon mit hoher Wahrscheinlichkeit nur um einen Faktor von O(log n) abweicht (durch Verwendung der Chernoff-Schranke). Damit ist log d − log k bis auf den additiven Term log log n + O(1) eine Approximation von log n. Wählt man k = c log n, dann wird der additive Fehlerterm mit hoher Wahrscheinlichkeit nur noch eine Konstante. Wir werden später im Kapitel Datenaggregation Methoden kennen lernen, wie man n exakt in einem Peer-to-Peer-Netzwerk berechnen kann. 3.8.3 Einfügen eines Peers Ein neuer Peer an einer beliebigen Stelle des Rings eingefügt. Wir nehmen an log n sei bekannt. Dann wählt der Peer i zufällig aus {0, . . . , log n − 1}. Nun sucht der Peer durch ein Lookup ausgehend vom Ringnachbarn seiner Ebene die gewünschten Peers. Er fügt dann die oben beschreiben Zeiger ein. Ebenso werden die entsprechenden Peers der benachbarten Ebenen informiert ihre Zeige neu zu justieren. Die Laufzeit und Anzahl der Nachrichten sind dann im wesentlichen die Zeit für ein LookUp mit O(log n) und das Finden der Nachfolger und Vorgänger mit Zeit O(log n). 3.8.4 Lookup In Abbildung 3.42 ist der Lookup-Algorithmus von Viceroy beschrieben. Er beruht auf der Annahme, dass auf jedem der Ebenen im Butterfly-Graph keine größeren Abstände als log2 n/n zwischen den Knoten auftreten. Ist das nicht der Fall, besteht die Möglichkeit, dass er nicht zum Ziel führt. Die logarithmische Laufzeit ist in Gefahr, falls in auf den Ebenen in einer Strecke von (log n)2 /n sich mehr als O(log n) Peers befinden. Lemma 7 Mit hoher Wahrscheinlichkeit benötigt der Lookup in Viceroy O(log n) Zeit und Nachrichten. 53 Viceroy-Suche(Peer (i, x) erhält Suchanfrage nach (j, y) begin 2 if i = j and |x − y| ≤ (lognn) then Leite Suchanfrage auf näheren Ringnachbar in Ebene i weiter else if y weiter rechts als x + 2i then Leite Suchanfrage and Nachfolger von (i + 1, x + 2i ) weiter else if Nachfolger Z von (i + 1, x) weiter rechts als x then Suche auf dem Ring i + 1 von Z aus einen Knoten (i + 1, p) mit p ≤ x fi fi fi end. Abbildung 3.42: Der Suchalgorithmus für die Viceroy-Datenstruktur Dieses Lemma folgt aus den oben beschrieben Abstandseigenschaften, die direkt aus der Anwendung der Chernoff-Schranke folgen (wenn man annimmt, dass Peers nur eingefügt worden sind). 3.8.5 Eigenschaften von ViceRoy Viceroy besitzt durch die Konstruktion konstanten Ausgrad und erwartet konstanten Eingrad. Der Durchmesser ist O(log n) und die Suche kann davon profitieren. Durch die Struktur des Butterfly-Graphen kann die Kommunikationslast sehr gut balanciert werden, weil zum einen beliebige andere Graphen sehr gut eingebetteten werden können und andererseits die Bisektionsweite mit n/ log n sehr groß ist. Sie ist wie folgt definiert. Definition 2 Sei G = (V, E) ein ungerichteter Graph und V1 , V2 ⊂ V und V1 ∪˙ V2 = V . Bezeiche Ext(V1 , V2 ) die Anzahl der Kanten, die den Schnitt (V1 , V2 ) kreuzen. Dann ist die Bisektionsweite ρ(G) definiert als: ρ(G) = min{Ext(V1 , V2 ) | V = V1 ∪˙ V2 und | |V1 | − |V2 | | ≤ 1} Zwischen der Größe Bisektionsweite und der Fähigkeit Congestion-effizientes Routing bereitzustellen besteht eine sehr Korrelation (Andererseits teilen auch andere Graphen, wie etwa DeBrujin-Graphen diese Eigenschaft). Die Sache mit dem Grad Zwar ist der Ausgrad eines Knoten mit zwei Kanten für den allgemeneinen Ring, zwei Kanten für jede Ebene des Butterfly-Graphen und vier Kanten für die Butterfly-Kanten genau acht. Aber der Eingrad ist nur dann konstant wenn die Knoten auf den Ebenen des Butterfly-Graphen perfekt verteilt werden, d.h. Abstand zum Nachbarn ist bis auf einen konstanten Faktor (log n)/n. Wählt man aber die Positionen auf den Ring zufällig kommt auch ein um den Faktor log n erhöhter Abstand mit konstanter Wahrscheinlichkeit vor. Damit kommt mit konstanter Wahrscheinlichkeit ein logarithmischer Ein-Grad vor. Also ist ViceRoy nicht besser als das einfacher Koorde-Netzwerk (außer dass ViceRoy früher erschien als Koorde). Dieses Problem, dass große Abstände auf den Viceroy-Ring viele eingehende Links anziehen und die Nachbarn in der nächsten Ebene mit kleineren Abstände den Ein-Grad erhöhen kann man nur Lösen, indem man die Peers nicht rein zufällig einordnet. Die Lösung bringt das Prinzip der vielfachen Auswahl (principle of multipe choice). 54 3.8.6 Das Prinzip der mehrfachen Auswahl (principle multiple choice) Statt eine zufällige Position in der Ebene des Butterfly-Rings zu wählen, wählt jeder Peer c log n zufällige Positionen. Für jede dieser Positionen p(j) wird der Abstand a(j) zwischen den potentiellen linken und rechten Nachhbarn gemessen. Nun wird der Peer an der Position p(j ∗ ) genau in der Mitte der vorhandenen Peers eingefügt, für welche a(j ∗ ) maximal ist, d.h. a(j ∗ ) ≥ a(j) für alle j. Lemma 8 Mit hoher Wahrscheinlichkeit ist der Abstand zweier Peers in den log n Viceroy-Ringen nur um einen konstanten Faktor größer oder kleiner als der durchschnittliche Abstand O((log n)/n). Beweis: Wir werden dieses Lemma beweisen, indem wir nur einen Ring betrachten und dort n Peers nach diesem Prinzip einfügen. Man kann mit Hilfe der Chernoff-Schranke nachweisen, dass jeder der log n Ringe mit hoher Wahrscheinlichkeit zwischen n/(2 log n) und 2n/(log n) Peers erhält. Dann kann man für jeden Ring das nun folgende Lemma 9 anwenden. Lemma 9 Nach Einfügen von n = 2k (für k ∈ N) Peers auf einem Ring [0, 1) unter Verwendung des 1 1 , n und n2 übrig. Prinzips der mehrfachen Auswahl, bleiben nur Intervalle der Größe 2n Beweis: Da die Intervall immer genau in der Mitte geteilt werden, entstehen als Intervallgrößen immer nur 1 Zweier-Potenzen. Es genügt also zu zeigen, dass zum einen nicht Intervalle kleiner als 2n und nicht größer 2 als n entstehen. 1. Teil: Mit hoher Wahrscheinlichkeit gibt es kein Intervall länger als 2/n: Wir beweisen zunächst folgendes Lemma: Lemma 10 Sei das längste Intervall c/n (c kann von n abhängig sein). Dann sind nach Einfügen von 2n/c Peers alle Intervalle kürzer als c/(2n) mit hoher Wahrscheinlichkeit. Beweis: Wir betrachte ein Intervall der Länge c/n. Mit Wahrscheinlichkeit c/n wird ein solches Intervall von einem Peer getroffen Angenommen, es werden für jeden Peer t log n Intervalle untersucht. Die erwartete Anzahl von Treffern X eines solchen Intervalls ist also E[X] = c 2n · · t log n = 2t log n . n c Die Chernoff-Schranke liefert dann für δ ∈ (0, 1): P[X ≤ (1 − δ)E[X]] ≤ n−δ 2 t . Ist δ 2 t ≥ 2 werden all diese Intervalle mindestens 2(1 − δ)t log n-mal getroffen. Man muss aber auch berücksichtigen, dass jedes Mal wenn ein Intervall geteilt wird, die t log n zusätzlichen Treffer keine Teilung bewirken können. Wir wählen also 2(1 − δ) ≥ 1 und erhalten dass jedes der Intervalle der Mindestlänge c/n mit hoher Wahrscheinlichkeit geteilt werden. Wendet man dieses Lemma sukzessive für c = n/2, n/4, ..., 4 an, folgt der erste Teil des Beweises. 2. Teil: Kein Intervall entsteht, das kleiner ist als 1/(2n). Die Gesamtlänge aller Intervalle der Größe 1/(2n) ist vor jedem Einfügen höchstens n/2. Damit wird bei c log n Versuchen, jedes so kleine Intervall höchstens mit Wahrscheinlichkeit 21 getroffen. Die Wahrscheinlichkeit, dass unter clogn Intervallen nur solche gewählt werden, ist höchstens 2−c log n = n−c . Damit wird für c > 1 mit nur polynomiell kleiner Wahrscheinlichkeit ein Intervall der Länge 1/(2n) weiter unterteilt. 55 (x,x/2) 0 1 (x,1/2 + x/2) Abbildung 3.43: Links- und Rechts-Kanten des kontinuierlichen Graphen des Distance-Halving-Peer-toPeer-Netzwerks. 3.8.7 Resumee Der Butterfly-Graph ist für Routing besonders gut geeignet. Er ermöglicht viele bekannte erprobte gute Algorithmen und eine ganze Reihe von Arbeiten hat sich gerade mit solchen Netzwerktypen beschäftigt. Viceroy war das erste Peer-to-Peer-Netzwerk mit konstanten Ein- und Ausgrad. Aber die mehrfache Ringstruktur ist relativ kompliziert. Wendet man das Prinzip der mehrfachen Auswahl an, so vergrößert sich der Aufwand zum Einfügen eines Peers auf O(log2 n). Dieses Prinzip der mehrfachen Auswahl kann aber auch bei anderen Netzwertypen, wie etwa bei DeBrujin-Netzwerken angewendet werden. Diese sind wesentlich einfacher und besitzen die gleichen vorteilhaften Netzwerkeigenschaften wie Butterfly-Netzwerke. Dies waren wohl die Gründe, warum (zwei der drei) Autoren selbst ein anderes Peer-to-Peer-Netzwerk als Nachfolger von Viceroy vorschlugen, dass sie Distance Halving nannten. 3.9 Distance Halving Im Jahre 2003 stellten Moni Naor und Udi Wieder Distance Halving [NW03] vor. Ziel war es nicht nur ein weiteres Peer-to-Peer-Netzwerk, sondern es wurde besonderen Wert auf dem Prinzip der kontinuierlichen Graphens gelegt, der eigentlich schon CAN und Chord zu Grunde lag. Hier aber erstmals formalisiert wurde. 3.9.1 Kontinuierliche Graphen Genauso wie man diskrete Graphen definiert über als Kantenmenge über einer endlichen Knotenmenge, kann man auch kontinuierliche Graphen definieren. Nur ist hier schon die Knotenmenge unendlich groß. Als anschauliches Beispiel eines kontinuierlichen Graphs kann schon der in Distance-Halving verwendete Graph dienen. Die Knotenmenge V = [0, 1] ist das kontinuierliche Intervall der Zahlen von 0 bis 1. Die Kantenmenge E ⊂ V × V bildet eine ebenfalls kontinuierliche Paarmenge zwischen diesen Knoten. Es werden zwei Kanten (siehe Abbildung 3.43) verwendet: • Die Links-Kanten: x, x2 für x ∈ [0, 1] und • die Rechts-Kanten: x, 12 + x2 für x ∈ [0, 1] . Hinzu kommen noch die entsprechenden Kanten in der Gegenrichtung, das sind für x ∈ [0, 1] die Kanten x2 , x und 21 + x2 , x . Der Übergang vom kontinuierlichen zum diskreten Fall Natürlich lassen sich solche kontinuierliche Graph nicht direkt verwenden. Daher muss vom kontinuierlichen zum diskreten Fall ein Übergang gefunden werden. Hierzu wird eine Partitionierung von V in Teilintervalle durchgeführt und der diskretisierte Graph hat eben diese Intervalle als Knotenmenge und für die Kantenmenge gilt: Eine Kante zwischen Teilintervall A und B existiert genau dann, falls es ein x ∈ A und y ∈ B gibt, so dass (x, y) Kante des 56 (x,x/2) 0 1 (x,1/2 + x/2) (x,x/2) 0 1 (x,1/2 + x/2) Abbildung 3.44: Durch die Diskretisierung eine kontinuierlichen Graphen ensteht das Distance-HalvingNetzwerkt kontinuierlichen Graphs sind. Die Teilintervalle selber entstehen durch sukzessive Halbierung bestehender Intervalle. Das durch Diskretisierung aus dem oben beschriebenen kontinuierlichen Graph entstehende Netzwerk wird Distance-Halving-Netzwerk genannt (warum sehen wir gleich), siehe Abbildung 3.44. Zusätzlich werden noch Zeiger zwischen benachbarten Teilintervallen eingefügt.5 Wenn man nun zwei Punkte x, y im kontinuierlichen Graph betrachtet, so zeigen die Links-Kanten auf zwei Punkte x/2, y/2 deren Abstand x y zu deinander nur noch halb so groß ist wie zuvor. Vorher war er nämlich d = |x − y| und danach 1 x 12 − y2 = 2d . Genaus verringert sich der Abstand der Punkte auf den die Rechts-Kanten zeigen: 2 + 2 − 2 − 2 = 2 . Wegen dieser Halbierung des Distanz erhielt des Peer-toPeer-Netzwerk seinen Namen Distance-Halving. Für die entsprechenden Rückwärtskanten verdoppelt sich dann entsprechend die Distanz. Aus dieser Distanz-Eigenschaft folgt sofort, dass der Grad von Distance-Halving konstant ist, falls das Verhältnis aus größten und kleinsten Intervall konstant ist, wie Dies kann beim Einfügen durch das Prinzip der mehrfachen Auswahl (multiple choice principle), welches wir bei Viceroy kennen gelernt haben, erreicht werden. 3.9.2 Einfügen von Peers in Distance-Halving Der Aufbau von Distance-Halving geschieht wie folgt. Neue Peers werden den Teilintervallen zugewiesen, die aus einer Testmenge von O(log n) vielen Intervallen am größten sind. Die Grüße von n ergibt sich übrigens bis auf einen konstanten Faktor schon aus dem ersten Intervall, dass der Peer testet (mit hoher Wahrscheinlichkeit). Dies folgt auch aus dem Prinzip der mehrfachen Auswahl. Schließlich hat das 1 größte Intervall mit hoher Wahrscheinlichkeit die Länge n2 und das Kleinste die Länge 2n (falls n eine Zweierpotenz ist). Die Teilintervalle werden jeweils durch ein Lookup lokalisiert. Dieser kostet wie wir gleich sehen werden jeweils O(log n) Sprünge und Nachrichten. Nachdem das Intervall gefunden worden ist, werde zuerst die Verkettungen mit den Nachbar-Intervallen vorgenommen und dann aus den Zeiger der Peers der Nachbar-Intervalle die neuen Zeiger ausgewählt. Entsprechend aktualisieren die Peers der NachbarIntervalle ebenfalls ihre Zeiger. Dadurch erhalten wir ein Peer-to-Peer-Netzwerk mit konstantem Ein- und Ausgrad und logarithmischen Durchmesser, wie wir gleich sehen werden. 5 So gesehen ist das CAN-Netzwerk die Diskretisierung des zwei-dimensionalen Quadrats [0, 1]2 ohne jegliche Kanten. 57 Distance-Halving-Lookup(Start, Ziel) begin if Start und Ziel benachbart then Leite Nachricht von Start nach Ziel else if Start ist links von Ziel then Neuer-Start = Links-Zeiger(Start) Neues-Ziel = Links-Zeiger(Ziel) else Neuer-Start = Rechts-Zeiger(Start) Neues-Ziel = Rechts-Zeiger(Ziel) fi Sende Nachricht von Start nach Neuer-Start Distance-Halving-Lookup(Neuer-Start, Neues-Ziel) Sende Nachricht von Neues-Ziel nach Ziel fi end. Abbildung 3.45: Der Suchalgorithmus für das Distance-Halving-Netzwerk Neuer Start Neues Ziel Start Start Ziel Ziel Neuer Start Neues Ziel Abbildung 3.46: Rekursiver Lookup-Aufruf von Abbildung 3.47: Rekursiver Lookup-Aufruf von Distance-Halving falls der Start-Peer sich links vom Distance-Halving falls der Start-Peer sich rechts Ziel-Peer befindet vom Ziel-Peer befindet 3.9.3 Lookup in Distance-Halving Der Lookup-Algorithmus geschieht rekursiv und ist in Abbildung 3.45 dargestellt. In Abbildung 3.46 ist dargestellt, was passiert, falls der Start-Peer sich links vom Ziel-Peer befindet (und sie nicht benachbart sind). Dann verkürzt sich durch den beidseitigen Links-Sprung die Entfernung zwischen dem neuem Start-Peer und dem neuen Ziel-Peer auf die Hälfte. Hierzu werden nur zwei zusätzliche Sprünge investiert. Analoges geschieht im Fall, falls der Start-Peer sich rechts vom Ziel-Peer befindet, siehe Abbildung 3.47. Da durch die Abbildung der Links-Kanten der Start-Ziel-Anstand halbiert wird und da alle Intervalle sich nur um den Faktor vier unterscheiden, benötigt der Lookup-Algorithmus nur 2+log n Rekursionen um eine Nachricht auszuliefern. Dann kann durch einen Schritt auf dem Ring der aktuelle Ziel-Peer erreicht werden. Jeder Rekursionsschritt benötigt zwei Sprünge und dadurch ergibt sich der Aufwand des Lookups durch 2 log n + 5: Lemma 11 Mit hoher Wahrscheinlichkeit benötigt der Lookup in Distance-Halving-Netzwerken höchstens 2 log n + 5 sequentielle Nachrichtenübertragungen. Congestion beim Lookup Betrachtet man den Lookup-Algorithmus etwas genauer, so war die Bedingung, ob der Start-Peer links von Ziel-Peer liegt, gar nicht notwendig. Man diesen Algorithmus durch den 58 Distance-Halving-Random-Lookup(Start, Ziel) begin if Start und Ziel benachbart then Leite Nachricht von Start nach Ziel else if Münze fällt auf Zahl then Neuer-Start = Links-Zeiger(Start) Neues-Ziel = Links-Zeiger(Ziel) else Neuer-Start = Rechts-Zeiger(Start) Neues-Ziel = Rechts-Zeiger(Ziel) fi Sende Nachricht von Start nach Neuer-Start Distance-Halving-Lookup(Neuer-Start, Neues-Ziel) Sende Nachricht von Neues-Ziel nach Ziel fi end. Abbildung 3.48: Congestion-optimierter Suchalgorithmus für das Distance-Halving-Netzwerk in Abbildung 3.48 ersetzten, ohne dass zusätzliche Kosten entstehen. Hier wird log n + O(1) mal zufällig den Links- oder Rechts-Kanten gefolgt. Analog zu Valiants Routing-Ergebnis auf dem Hyper-Würfel kann man hier zeigen, dass die Congestion eines Knoten höchstens O(log n)-mal höher ist, als die maximal zu sendende oder zu empfangene Menge von Nachrichten eines Peers (Das selbe Resultat kann man übrigens für Viceroy ebenfalls zeigen). 3.9.4 Resumee Distance-Halving Mit Distance-Halving haben wir zum Abschluss der Reiher skalierbarer Peer-to-Peer-Netzwerk ein einfaches effizientes Peer-to-Peer-Netzwerk kennen gelernt. Mit hoher Wahrscheinlichkeit hat Distance-Halving sowohl konstanten Ein-und-Ausgrad, logarithmischen Durchmesser, verfügt über Methoden zur Lastbalancierung und logarithmischen Lookup. Die Einfüge-Operation benötigt O(log2 n) Hops und Nachrichten. Ferner wurde hier erstmals das Prinzip des Übergangs von kontinuierlichen zu diskreten Graphen formalisiert. Tatsächlich haben wir es in der einen oder anderen Form schon in Chord, Koorde, ViceRoy und nicht zuletzt auch CAN kennen gelernt. Folgerungen aus Viceroy und Distance-Halving Das Prinzip der mehrfachen Auswahl (multiple choice principle) kann auch auf andere Peer-to-Peer-Netzwerke angewendet werden. So kann man damit bei Chord den Ein- und Ausgrad auf O(log n) optimieren, während Einfüge-Operationen benötigt weiterhin Aufwand O(log2 n) benötigen. Auch bei Koorde kann dieses Prinzip angewendet werden. Dann ist dort der Ein- und Ausgrad konstant und die Einfüge-Operationen benötigten Aufwand O(log2 n) 6 6 Bei näherer Betrachtung zeigt sich außerdem, dass dann Koorde und Distance-Halving dann isomorph sind 59 60 Kapitel 4 Epidemische Algorithmen und Datenaggregation 10. VorIn diesem Kapitel werden wir uns mit zwei sehr verwandten Methoden zur Informationsverteilung in lose lesung organisierten Kommunikationsnetzwerken . Diese werden hier unterschieden als Epidemische Algorithmen 21.06.2004 und Datenaggregation. Bei näherer Betrachtung handelt es sich hier nur um die diskrete und kontinuierliche Ausprägung des selben algorithmischen Prinzips. 4.1 Epidemische Algorithmen Epidemische Algorithmen werden bisher (nach Wissen der Autoren) kaum in Peer-to-Peer-Netzwerken eingesetzt. Trotzdem sind sie eine sehr elegante und effiziente Methode zur Informationsausbreitung und sollten den Informatiker, der Peer-to-Peer-Netzwerk-Algorithmen entwickelt als wertvolles Werkzeug zur Hand stehen. Bisher wurden epidemische Algorithmen im Bereich der replizierten Datenbanken eingesetzt. 4.1.1 Replizierte Datenbanken Die Ausgangssituation von [DGH+ 87] ist hierbei die Folgende. Knoten eines Kommunikationsnetzwerks sind durch dichtes Netzwerk verbunden, wobei einzelnen Knoten und Netzwerkverbindungen (Kanten ) ausfallen können. Die Aufgabe der Knoten ist es lokal ermittelte Information durch das Netzwerk an alle zu verteilen. Dabei ist die genaue Verbindungsstruktur unklar und auch die Teilnehmerlisten sind zwar allen im Prinzip bekannt, aber durch die Fluktuation der Teilnehmer und durch ungünstige Verbindungsausfälle kann es sein, dass diese Liste lokal von der tatsächlichen Teilnehmerliste abweicht. Replizierte Datenbanken (replicated database) sind im Idealfall exakte Kopien einer Datenbank an verschiedenen Orten. Neue Einträge in diese Datenbanken entstehen lokal und daher ist es notwendig, den Datenbestand in bestimmten Zeitintervallen anzupassen, damit die Konsistenz der replizierten Datenbanken erhalten wird, siehe auch Abbildung 4.1. Ein Beispiel für die Anwendung von replizierten Datenbanken sind z.B. Name-Server im Internet. Wenn neue Rechner ihre Host-ID und IP-Adresse ihrem Router bekanntgeben, ist es nötig, dass diese Information domain-weit zur Verfügung steht. Dafür muß diese Information verbreitet werden. Ferner ist es möglich, dass ganze Teilnetzwerke sich an- oder abkoppeln. Außerdem sind nicht alle Rechner, die mit der Verwaltung von diesen Rechnernamen vertraut sind, nicht allen anderen Rechnern bekannt. Ein ideales Verfahren soll also robust und dezentral diese Informationsverbreitung erledigen, auch wenn Netzwerkverbindungen oder Rechner ausfallen. In [DGH+ 87] werden folgende Lösungen diskutuiert: • Unicast 61 Abbildung 4.1: Replizierte Datenbanken sollen den gleichen Datenbestand verteilt unterhalten ohne dass Knoten und Kantenausfälle dies beeinträchtigen Hier wird jede neue Information an alle Standorte der replizierten Datenbank direkt verschickt. Problematisch ist der Fall, wenn nicht alle Standorte bekannt sind, oder die Standorte zeitweise nicht erreichbar sind. • Anti-Entropie In diesem Verfahren gleichen von Zeit zu Zeit zwei Datenbankenstandorte ihren gesamten Informationsstand aus und bereinigen zeitweise Unterschiede. Die Auswahl dieser zwei Standorte kann zufällig, oder auch nach einen bestimmten Auswahlschema ablaufen. Dieses Verfahren ist sehr zuverlässig, indem jede Information mit der Zeit in allen lokalen Datenbanken vorhanden ist. Dagegen kann es einige Zeit dauern bis dieser Zustand erreicht ist. Das Hauptproblem bei dieser Methode ist der Kommunikationsoverhead für das Überprüfen bereits allseits bekannter Daten. • Epicast Epicast setzt sich aus Epidemie und Broadcast zusammen. Hier nutzt man einen sogenannten epidemischen Algorithmus zur Verbreitung der Information. Hierfür wird in einem geeigneten Kontaktmodell die lokal neu entstandene Information als Virus (oder auch Gerücht) interpretiert. Ähnlich wie ein Virus eine ganze Population anstecken kann oder wie ein Gerücht sich in einer Menschenmenge ausbreitet, so soll die Information eines Updates sich im Netzwerk ausbreiten. Damit ist die Durchdringung des Netzwerkes garantiert, solange es zusammenhängend ist. Hierbei wird für jede Änderung ein neues Gerücht erzeugt, dass dann im Netzwerk verbreitet wird. Hierzu nehmen in einem geeigneten Kommunikationsmodell (dies wird gleich vorgestellt) zwei Partner jeweils Kontakt auf und einer (oder beide) teilen dem anderen ihre Aktualisierungen mit. Die Verbreitung ist sicher gestellt, wenn mit hoher Wahrscheinlichkeit ein Gerücht allen mitgeteilt worden ist. Wir konzentrieren uns im weiteren mit der Verbreitung eines einzelnen Gerüchts. Wenn nämlich dieses schon mit hoher Wahrscheinlichkeit effizient und umfassend verbreitet worden ist, so geschieht das im allgemeinen mit den anderen Gerüchten auch. Das Problem des Kommunikationsoverhead entsteht dann, wenn die Virus-(Gerüchte-)Verbreitung nicht gestoppt wird. Dann wird immer wieder die selbe neue information zwischen den Knoten hin und her gereicht. Daher ist die Wahl eines geeigneten Terminierungsmechanismus notwendig, damit die Anzahl unnötig versandter Informationen eingedämmt wird. 4.1.2 Mathematische Modellierung von Epidemien In der Wissenschaft beschäftigt man sich aus Leid geplagter Erfahrung schon sehr langen mit Epidemien. So schreibt Hippokrates ca 400 v.Chr. Über Epidemien. Die lange Reihe von Untersuchungen im medizinischen Bereicht beinhailtet Arbeiten von John Graunt (1662), Louis Pasteur, und Robert Koch (19. Jhd.). In 62 Abbildung 4.2: Informationsverbreitung im Push-Modell der Mathematik beschäftigte sich schon Daniel Bernoulli (1760) mit der Modellierung von Epidemien. Ein einfaches Epidemie-Modell wurde im Jahr 1911 von Ross entwickelt, das dann im Jahr 1927 von Kermack und McKendrick verallgemeiner wurde. Wir beschäftigen uns hier mit diesem sogenannten Push-Modell, dass hinsichtlich des Erwartungswerts von Pittel [Pit87] exakt charakterisiert worden ist. Die Ergebniss hinsichlich des Push-, Pull- und Push&Pull-Modells gehen auf [KSSV00] zurück. 4.1.3 Epicast Wie bereits erwähnt wird eine Aktualisierung zum Gerücht, dass effizient verbreitet werden muss. Hierbei interessieren wir uns für zwei Komplexitätsmaße: Für die Zeit und für die Anzahl der Nachrichten, die benötigt werden, um das Gerücht mit hoher Wahrscheinlichkeit allen zugänglich zu machen. Diese Art des Epicasts wurde in [DGH+ 87] eingeführt und umfassend in [KSSV00] analysiert, wobei in letzterer Arbeit ein effizienterer Terminierungsalgorithmus für Gerüchte (Der Median-Counter-Algorithmus) vorgestellt wurde. Eine solche Terminierung von Gerüchten ist notwendig, um die ununterbrochene Verteilung dieses Gerüchts zu verhindern. Ist nämlich ein Gerücht alt und damit allen bekannt, sollten alle Teilnehmer zum Schluss kommen, die Weiterverbreitung zu stoppen. Hierbei handelt es sich aber keineswegs um ein triviales Problem, da allen Teilnehmer nicht unbedingt klar ist, wer an dieser Verbreitung teilnimmt und wer das Gerücht schon kennt. 4.1.4 Anruf-Model (Random Call) Das hier verwendete Kommunikationsmodell wird Anruf-Modell (Random Call)-Modell genannt. Es liefert das Grundgerüst, um die Kommunikationsmethoden Push, Pull, und Push&Pull darzustellen. Die Kommunikation findet (der Einfachheit halber) synchronisiert in Runden statt. In jeder Runde kontaktiert jeder Teilnehmer einen zufällig gewählten anderen Teilnehmer, gleichwahrscheinlich und unabhängig gewählt aus der Menge aller Teilnehmer. Derjenige der diese Wahl ausführt wird der Anrufer genannt. Jener, der das Ziel dieser Wahl ist, wird der Angerufene genannt. In jeder Runde ist jeder Teilnehmer ein Anrufer, kann aber auch zugleich (und von mehreren) angerufen werden. Nun geschieht je nach Kommunikationsmethode folgendes: • Im Push-Modell teilt der Anrufer sein Gerücht dem Angerufenen mit. In der Gegenrichtung wird kein Gerücht durchgegeben1 , siehe Abbildung 4.2. • Im Pull-Modell teilt der Angerufene sein Gerücht dem Anrufer mit. Auch hier wird das Gerücht nur einer Richtung mitgeteilt2 , siehe Abbildung 4.3. • Im Push&Pull-Modell tauschen beide ihre Gerüchte aus, siehe Abbildung 4.4. 1 Es sei denn, zufälligerweise ruft der Angerufene auch den Anrufer an natürlich der Anrufer wird auch von Angerufenen angerufen 2 Außer 63 Abbildung 4.3: Informationsverbreitung im Pull-Modell Abbildung 4.4: Informationsverbreitung im Push&Pull-Modell In jedem Fall wird ein Gerücht nur über eine Station weitergeteilt. Das heisst insbesondere, wenn im Push-Modell Peer A Peer B und gleichzeitig Peer B Peer C anruft. Dann kann A sein Gerücht nur bis B weiterreichen und nicht etwa bis Peer C durchreichen. Umsetzung des Anruf-Modells in Peer-to-Peer-Netzwerken Epidemische Algorithmen werden schon länger betrachtet als Peer-to-Peer-Netzwerke (1987 versus 1999). Grundlage des Anrufmodells ist die zufällige Adressierung. Viele Peer-to-Peer-Netzwerke unterstützen dies sehr effizient. So kann man zum Beispiel in Gnutella dies durch einen sogenannten Random Walk erreichen. Hier wird von jedem Peer ein zufälliger Nachfolger-Peer gewählt und sofort, bis eine vorgegebene Schrittweite erreicht ist. In CAN kann man einen zufälligen Peer erreichen, falls das CAN-Netzwerke über mindestens zwei Realitäten verfügt. Dadurch wird ein zufälliger Peer in konstant vielen Sprüngen erreicht werden. Da man in jeder Runde einen neuen zufälligen Peer benötigt, kann man weitere durch mehrere Sprünge in den Realitäten erreichen (Für die nachfolgenden vorgestellten Verfahren genügen Folgen von O(log n) zufällige Peers, dies kann mit O(log log n) Sprüngen zwischen den Realitäten erreicht werden). In Chord, Koorde, Viceroy, Distance-Halving, Pastry und Tapestry erreicht man jeweils in log n Sprüngen zu einem unabhängig gewählten gleichwahrscheinlichen Peers, so dass die Operation ebenso teuer ist wie ein Lookup. Notation Wir betrachten nur ein Gerücht und nehmen an, dass diese Gerücht in Runde 0 nur einem Teilnehmer bekannt ist. Die absolute Anzahl aller Teilnehmer, die das Gerücht kennen, bezeichen wir mit I(t) (wie informiert), wobei t die Rundenanzahl ist, also I(0) = 1 . Die Gesamtanzahl aller Teilnehmer sei n und die Anzahl der Teilnehmer, die das Gerücht noch nicht kennen sei S(t) := n − I(t). Wir beschäftigen uns hier hauptsächlich mit den relativen Häufigkeiten dieser 64 Mengen, nämlich s(t) = S(t) n Foglich ist zu Beginn i(0) = n1 , s(0) = 1 − alle Teilnehmer das Gerücht erhalten haben. i(t) = und 1 n I(t) . n und zum Ende sollte i(t) = 1 und s(t) = 0 gelten, damit Struktur-Eigenschaften des Anruf-Modells Bevor wir uns der Frage zuwenden, wie schnell das Gerücht durch die verschiedenen Kommunikationsmethoden verbreitet werden, betrachten einige StrukturEigenschaften des Anruf-Modells näher. Wir können das Kommunikationsverhältnis zwischen Anrufer und Angerufenen als gerichteten Graph darstellen, wobei eine Kante vom Anrufer zum Angerufenen gezogen wird. In jeder Runde wird dieser Kommunikationsgraph durch einen neuen ersetzt. In einer fest gewählten Runde beobachten wir, dass der Aus-Grad in einem Knoten immer eins ist. Für den Ein-Grad kann jeder Fall, von keiner eingehender Kante bis dass ein Knoten n eingehende Kanten (einschließlich einer Schlinge, d.h. einer In-sich-Kante). Diese Fälle treten aber nicht mit gleicher Wahrscheinlichkeit auf. Der Fall, dass ein Knoten Ein-Grad 0 hat, also kein Anderer ihn anruft, geschieht mit Wahrscheinlichkeit n 1 , 1− n was wie wir bereits wissen, sehr schnell gegen 1e konvergiert. Fast genauso wahrscheinlich ist der Fall, dass genau eine eingehende Kante in einem Knoten auftritt. Dies geschieht mit Wahrscheinlichkeit n 1 n 1− 1 n n−1 = 1− 1 n n−1 , was ebenfalls für zunehmendes n schnell gegen 1e konvergiert. Im Allgemeinen beobachten wir k eingehende Kanten mit Wahrscheinlichkeit n n−k n 1 1 n(n − 1) · . . . · (n − k) 1 1 1 − = 1 − . k nk n nk k! n 1 . Damit beobachten wir für kleine k für den Für große n und festes k konvergiert dieser Term gegen ek! Ein-Grad im wesentlichen eine Poisson-Verteilung mit Erwartungswert 1. 4.1.5 Ausbreitungsverhalten im Push-Modell Im Anruf-Modell wird in jeder Runde t ein neuer gerichteter Graph Gt = ([n], Et ) betrachtet. In diesem Graph hat jeder Knoten eine ausgehende Kante, die gleichwahrscheinlich aus der Knotenmenge [n] gewählt wird. Damit sind auch Schleifen, d.h. Kanten mit gleichen Anfangspunkt und Endpunkt möglich. Die Weitergabe des Gerüchts wird nun in Runde t entlang einer gerichteten Kante weitergegeben, d.h. jeder informierte Knoten u in Runde t wählt gleichwahrscheinlich einen Knoten aus [n] als Kontaktpartner v und informiert ihn. In Abbildung 4.5 wird die Ausbreitung eines Gerüchts im Push-Modell beispielhaft dargestellt. Für einen informierten (und infizierenden) Knoten u ∈ I(t) ergeben sich in einer Runde drei Möglichkeiten: 1. Er kontaktiert und informiert als einziger informierter Knoten einen uninformierten Knoten. 2. Er kontaktiert einen bereits informierten Knoten. 3. Er kontaktiert mit anderen informierten Knoten zusammen einen uninformierten Knoten. Die Wahrscheinlichkeit, dass Fall 2 vorliegt, ist i(t). Die Wahrscheinlichkeit für Fall 3 ist höchstens i(t), da maximal I(t) Kanten in dieser Runde für die Nachrichtenübertragung verwendet werden. Damit ist die Wahrscheinlichkeit für Fall 1 mindestens 1 − 2i(t). Diese Überlegung ergibt das folgende Lemma. 65 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 A A A A A A A A A A B B B B B B B B B B C C C C C C C C C C D D D D D D D D D D E E E E E E E E E E F F F F F F F F F F Abbildung 4.5: Beispielhafte Informationsverbreitung im Push-Modell Lemma 12 Jeder informierte Knoten informiert unabhängig von den anderen Knoten einen uninformierten Knoten mit Wahrscheinlichkeit von mindestens 1 − 2i(t) (im Push-Modell). Der Verlauf einer SI-Epidemie im Push-Modell verläuft in zwei verschiedenen Phasen ab: 1. Exponentielles Wachstum Die Anzahl der informierten wächst bis ein konstanter Anteil informiert ist, in jeder Runde um einen konstanten Faktor. Gegen Ende dieser Periode schwächt sich dieses Wachstum etwas ab. Nach Lemma 12 ist die erwartete Anzahl von Nachrichtenübertragungen in der nächsten Runde gegeben durch: c(ln n)2 E[i(t + 1)] ≥ 2i(t) − 2i(t)2 ≥ 2i(t) 1 − . n Wir unterscheiden in der exponentiellen Wachstumsphase folgende Teilphasen: (a) Startphase I(t) ≤ 2c(ln n)3 Hierbei können wir den rechten Faktor getrost vernachlässigen, da wir wissen, dass erst nach n c(ln n)3 dieser Faktor eine konstante Auswirkung hat, weil c(ln n)2 1− n n c(ln n)3 ≤ 1 . e In viel kürzerer Zeit (wenn n ≥ c log c) ist der Term 2t größer als 2c(ln n)2 , nämlich nach log(2c(ln n)3 ) ≤ 3 + log c + log log n Runden. Dieser Term beschreibt ganz gut die zu erwartende Rundenzahl, denn die Wahrscheinlichkeit, dass alle I(t) informierten Teilnehmer nur uninformierte Teilnehmer infizieren ist: (1 − i(t))I(t) ≥ 1 − i(t)I(t) ≥ 1 − 4c2 (ln n)3 . n Damit findet die Verdopplung mit Wahrscheinlichkeit 1 − O( (ln n) mal 3 + log c + log log n Runden statt. 66 3 log log n ) n in jeder der maxi- (b) Hauptphase: I(t) ∈ [2c(ln n)3 , lnnn ] Um die Gültigkeit der Verdopplung in jeder Phase mit hoher Sicherheit (d.h. mit Wahrscheinlichkeit 1 − O(n−c ) nachzuweisen, verwenden wir hier eine Chernoff-Schranke: Pm Chernoff: Es gilt für unabhängige binäre Zufallsvariablen Xi ∈ {0, 1} und Xm = i=1 Xi für alle δ ∈ [0, 1]: δ 2 E[Xm ] − 2 . P[Xm ≤ (1 − δ)E[Xm ]] ≤ e Wir setzen für Xm die Anzahl der Gerüchtübertragungen einer Runde und erhalten daher − P[I(t + 1) ≤ (1 − δ)E[I(t + 1)]] ≤ e Setzen wir nun δ = sionsgleichung: 1 ln n δ 2 E[I(t + 1)] δ 2 2c(ln n)3 2 2 − 2 2 ≤ e ≤ n−cδ (ln n) . erhalten wir die gewünschte Sicherheit. Damit erhalten wir als Rekur- I(t + 1) ≥ 2I(t)(1 − i(t))(1 − δ) mit Wahrscheinlichkeit 1 − O(n−c ) . Der Faktor (1 − i(t))(1 − δ) ≥ 1 − i(t) − δ(t) = 1 − ln2n . Damit ergibt sich nach log n Runden ein konstanter Faktor von mindestens log n 23 ln n 2 2 ≥ e−3 . ≥ 1− 1− ln n ln n Neben dem Faktor 2log n = n fällt dieser Faktor kaum ins Gewicht. Wir können also in der Hauptphase mit großer Wahrscheinlichkeit davon aus gehen, dass eine Verdoppelung stattfindet. (c) Zwischenphase: I(t) ∈ [ lnnn , n3 ] Nun kann der Term 2i(t)2 nicht mehr vernachlässigt werden. Zumindestens gilt hier 2 4 2i(t) − 2i(t)2 ≥ 2i(t) − i(t) ≥ i(t) . 3 3 Damit ist noch exponentielles Wachstum vorhanden, wenn auch bezüglich einer kleineren Basis. Mit Hilfe der Chernoff-Schranke läßt sich dieses Wachstum auch mit hoher Wahrscheinlichkeit nachweisen. Die Dauer dieser Zwischenphase ist sehr kurz, d.h. dauert nur O(log log n) Runden. 2. Sättigung: I(t) ∈ [ n3 , n] Ist ein konstanter Anteil der Population informiert, stoppt das exponentielle Wachstum. Die Wahrscheinlichkeit, dass ein uninformierter Knoten in einer Runde überhaupt nicht kontaktiert wird, ist n 1 − n1 . Für n ≥ 2 ist die Wahrscheinlichkeit also mindestens 41 und höchstens 1e . Tatsächlich ist aber nur ein konstanter Anteil i(t) cnaller Knoten informiert und wir erhalten für dieses Informierungswahrscheinlichkeit p := 1 − n1 die folgenden Schranken. 4−i(t) ≤ p ≤ e−i(t) . Damit gilt für die erwartete Anzahl der uninformierten Teilnehmer: 1 E[S(t + 1)] = p · S(t) ≤ e−i(t) S(t) ≤ e− 3 S(t) . Damit schrumpft die Anzahl der uninformierten Teilnehmer exponentiell schnell, wobei die Basis 1 rasch von e− 3 gegen 1e konvergiert. Ähnlich wie im ersten Fall läßt sich dieses Verhalten durch Anwenden einer Chernoff-Schranke auch mit hoher Wahrscheinlichkeit für die Zufallsvariablen S(t) und S(t + 1) nachweisen. 67 Abbildung 4.6: Wachstumsphasen im Push-Modell Damit ist mit hoher Wahrscheinlichkeit das Gerücht nach O(log n) Runden verteilt. Eine vereinfachte Darstellung dieser verschiedenen Informationsphasen ist in Abbildung 4.6 dargestellt. Für die erwarteten Rundenanzahl wurde von Pittel folgender Satz beweisen: Theorem 10 [Pit87] Eine SI-Epidemie im Push-Modell benötigt erwartungsgemäß log2 n + ln n + O(1) Runden. Das Pull-Modell Genauso wie beim Push-Modell wird in jeder Runde t ein neuer gerichteter Graph Gt = ([n], Et ) betrachtet, in welchen jeder Knoten eine ausgehende Kante, die gleichwahrscheinlich aus der Knotenmenge [n] gewählt wird. Der Unterschied zum Push-Modell ist, dass die Übertragung entgegen der Kantenrichtung verläuft. Ist also Kante (u, v) ∈ Et und ist v zum Zeitpunkt t informiert, dann ist u spätestens ab den Zeitpunkt t + 1 informiert. Auf den ersten Blick erscheint dieses Modell analog zum Push-Modell. Tatsächlich werden wir aber große Unterschiede beobachten. Ein Beispiel für eine SI-Epidemie im Pull-Modell ist in Abbildung 4.3 dargestellt. Die Wahrscheinlichkeit, dass ein uninformierter Knoten in Runde t einen Informierten kontaktiert ist damit genau i(t) = I(t)/n. Dieses Ereignis ist insbesondere unabhängig von der Informierung anderer uninformierter Knoten. Damit erhalten wir für den relativen Anteil der informierten Knoten: S(t) − S(t)i(t) = s(t) − s(t)i(t) = s(t)(1 − i(t)) = s(t)2 . n Für den erwarteten relativen Anteil der informierten bedeutet dies. E[s(t + 1)] = E[i(t + 1)] = 1 − s(t)2 = 1 − (1 − i(t))2 = 2i(t) − i(t)2 . 68 0 0 0 0 0 0 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5 6 6 6 6 6 6 7 7 7 7 7 7 8 8 8 8 8 8 9 9 9 9 9 9 A A A A A A B B B B B B C C C C C C D D D D D D E E E E E E F F F F F F Abbildung 4.7: Beispielhafte Informationsverbreitung im Pull-Modell 69 Für die Anfangsphase der Informationsverbreitung, wenn i(t) 1, gilt damit E[i(t + 1)] ≈ 2i(t) . Damit beobachten wir die folgenden zwei Phasen der Informationsverbreitung: 1. Exponentielles Wachstum: I(t) ∈ [1, n/2] (a) Startphase: I(t) ≤ 2c(ln n)3 Die Wahrscheinlichkeit, dass ein informierter überhaupt das Gerücht einmal verbreiten kann, ist n−1 1 1− . n Dies entspricht einer konstant großen Wahrscheinlichkeit für die Stagnation der Gerüchteverbreitung. Damit ist die Wahrscheinlichkeit, dass die Epidemie log n Runden am Anfang stagniert, ein Polynom mit n−c . Mit zunehmender Anzahl der informierten Knoten wird die Verdoppelung in jedem Schritt sogar mit hoher Wahrscheinlichkeit (d.h. mit Wahrscheinlichkeit 1−n−c ) geschehen. Garantiert ist dies jedoch erst wenn polylogarithmisch viele Knoten informiert sind. Betrachten wir nur die erwartete Dauer dieser Phase, so läßt sich zeigen, dass sie nur O(log log n) Runden dauert. (b) Hauptphase: I(t) ∈ [2c(ln n)3 , lnnn ] Hier liegt exponentielles Wachstum zur Basis 2 − ln1n mit hoher Wahrscheinlichkeit vor. Die Analyse dieser Phase mittels einer Chernoff-Schranke ist analog zur Analyse der Hauptphase des exponentiellen Wachstums im Push-Modell. (c) Zwischenphase: I(t) ∈ [ lnnn , n2 ] Das exponentielle Wachstums verlangsamt sich jetzt. Jedoch gilt immer noch 1 3 E[i(t + 1)] = 2i(t) − i(t)2 ≥ 2i(t) − i(t) = i(t) . 2 2 Mittels Chernoff-Schranken läßt sich diese Rekursion auch mit hoher Wahrscheinlichkeit nachweisen. 2. Quadratischen Schrumpfen I(t) ∈ [ n2 , n] In dieser Phase quadriert sich der auf 21 beschränkte Anteil der uninformierten erwartungsgemäß in jeder Runde. Fände dieses Quadrierung deterministisch statt, dann wäre nach log log n + 1 Runden der Anteil kleiner als n1 und somit alle informiert, weil: 2log log n+1 log n 1 1 1 < = . 2 2 n Nun muß man natürlich berücksichtigen, dass die Rekursion nur auf den Erwartungswerten beruht und dass sich die Abweichungen von diesen mit der Zeit erheblich vergrößern können. In [KSSV00] wurde aber gezeigt, dass die Epidemie tatsächlich nur O(log log n) benötigt, um alle zu infizieren. Damit gibt es einen enormen Unterschied im Ausbreitungsverhalten im Push- und im Pull-Modell. Trotzdem die gleiche Erwartete Anzahl von Kontaktpartnern vorliegt, unterscheidet sich das Ausbreitungsverhalten in der Schlußphase um Größenordnungen. Die erwartete Ausbreitungsdauer einer SI-Epidemie im Pull-Modell dauert also log n + O(log log n) Runden. Das Push&Pull-Modell Kombiniert man Push und Pull, erhält man eine Verbreitung des Gerüchts, welche die Ausbreitungsgeschwindigkeit beider Kontaktmodelle kombiniert. In diesem Modell kann als die Informationsübertragung sowohl entlang als auch entgegen einer Kante, die mit einem Knoten inzident ist, übertragen werden. In [KSSV00] wird gezeigt, dass hierbei folgende Phasen auftreten: 70 Abbildung 4.8: Wachstumsphasen im Pull-Modell 0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5 6 6 6 6 7 7 7 7 8 8 8 8 9 9 9 9 A A A A B B B B C C C C D D D D E E E E F F F F Abbildung 4.9: Beispielhafte Informationsverbreitung im Push&Pull-Modell 71 Abbildung 4.10: Wachstumsphasen im Push&Pull-Modell 1. Exponentielles Wachstum (a) Startphase: I(t) ≤ 2c(ln n)3 Push-Kontakte garantieren, dass sich die SI-Epidemie exponentiell schnell ausbreitet. Somit dauert diese Phase nur log log n + O(1) Runden. (b) Hauptphase: I(t) ∈ [2c(ln n)3 , lnnn ] Durch die Kombination der Push und der Pull-Ausbreitung läßt sich mit hoher Wahrscheinlichkeit die Gleichung 1 i(t) i(t + 1) ≥ 3 − O ln n nachweisen. (c) Zwischenphase: I(t) ∈ [ lnnn , n/2] Der Anteil der Gerüchte-Übertragungen durch Push-Kontakte nimmt hier verglichen mit den Pull-Übertragungen ab. Das Wachstum von I(t) verlangsamt sich, bleibt aber immer noch exponentiell. 2. Quadratisches Schrumpfen Die Push-Übertragungen sind nun kaum noch erfolgreich. Jetzt werden, wie schon im Pull-Modell beobachtet, alle Teilnehmer in O(log log n) Runden fast ausschließlich mittels Pull-Kontakten informiert Damit dauert die Informierung aller Teilnehmer im Push&Pull höchstens log3 n+O(log log n) Runden. 72 4.1.6 Eine einfache Terminierungsstrategie Als effektive und einfache Terminierungsstrategie erweist sich das Alterungskonzept. Jedes Gerücht wird erweitert um einen Zähler, der mit jeder weiteren Übertragung um eins heraufgesetzt wird. Ist der Zähler größer als ctrmax , wird das Gerücht nicht weiter verbreitet. Damit ist die Anzahl der übertragenen Nachrichten natürlich beschränkt durch n · ctrmax , wobei n die Anzahl der lokalen Datenbankkopien bezeichnet. Problematisch ist die Wahl von ctrmax . Wählt ctrmax zu hoch, werden mehr Nachrichten als notwendig versandt, während eine zu kleine Wahl das Risiko birgt, dass nicht alle Knoten informiert werden. Insbesondere ist die Wahl abhängig von dem Kontaktmodell der Gerüchteverbreitung, die hier vom Datenbankdesigner frei gewählt werden kann. • Push-Modell Wählt man das Push-Modell, so muß man ctrmax ≥ log2 n + c ln n wählen, wobei mit zunehmenden konstanten Faktor c > 1 die Sicherheit der Information aller Knoten zunimmt. Für eine geeignete Wahl von c werden alle Knoten mit hoher Wahrscheinlichkeit informier, d.h. mit Wahrscheinlichkeit 1 − n−O(1) . Die Nachrichtenmenge ist dann O(n log n). • Pull-Modell Damit alle Teilehmer mit hoher Wahrscheinlichkeit informiert werden, ist die Startphase des exponentiellen Wachstums kritisch. Hier zeigt sich, dass eine Wahl von ctrmax ∈ c logn mit c > 1 notwendig ist, obwohl erwartungsgemäß alle Knoten schon in Zeit log n + O(log log n) informiert sind. Damit ergibt sich eine Nachrichtenmenge von O(n log n). • Push&Pull-Modell Da hier die Zeit für die vollständige Verbreitung des Gerüchtst sogar mit hoher Wahrscheinlichkeit beschränkt ist durch log3 n + O(log log n) garantiert die Wahl ctrmax = log3 n + c log log n, dass alle Knoten informiert werden. In [KSSV00] wird gezeigt, dass die Nachrichtenmenge dann sogar nur O(n log log n) für jedes übetragenes Gerücht beträgt. Der Grund für diese geringe Nachrichtenmenge ist, dass in der exponentiellen Verbreitungsphase nur linear viele Nachrichten entstehen. Das Gros der Nachrichten wird daher erst beim quadratischen Schrumpfen des Anteils der Nichtinformierten erzeugt, der dann nur noch O(log log n) Runden benötigt. Der Nachteil dieser Terminierungsstrategie, ist dass die Wahl von ctrmax sich sehr stark auf die Nachrichtenmenge auswirkt. Ist also zum Beispiel ein gleichmäßiges Kontaktmodell wie Push&Pull nicht erreichbar, weil gewisse Teile des Netzwerks nicht von allen erreicht werden können, so ergibt sich ein Trade-Off zwischen der Robustheit und der Nachrichtenmenge. 4.1.7 Shenkers Min-Counter-Algorithmus Scott Shenker [KSSV00] entwarf einen cleveren Terminierungsmechanismus, der dieses Problem elegant löst. Die Idee ist, dass jeder Spieler P für ein Gerücht R einen Zähler ctrR (P ) unterhält, der nur dann um eins erhöht wird, falls in der vergangenen Runde alle Zählerstände von Kontaktpartnern für dieses Gerücht mindestens ebenso groß waren. Ist der Zähler größer als ctrmax , dann wird das Gerücht nicht mehr weitergegeben. Im einzelnen arbeitet der Termininierungsmechanismus wie folgt. • Sei ctrmax ∈ O(log log n). • Zustand A: Jeder Spieler P führt Variable ctrR (P ) für Gerücht R, die initialisiert ist mit ctrR (P ) = 0, falls P das Gerücht R noch nicht kennt. • Zustand B: Entsteht bei P das Gerücht R, setze ctrR (P ) ← 1 und verbreite das Gerücht durch Push und Pull 73 Teilnehmer in Zustand B C D A B−1 2 3 < log n O(log log n) 3 Abbildung 4.11: Häufigkeit der einzelnen Zustände des Min-Counter-Algorithmus • Zustand B: Seien Q1 , . . . , Qm Kommunikationspartner von P in dieser Runde. Falls alle das Gerücht weiterverbreiten und falls min{ctrR (Qi )} ≥ ctrR (P ) , i dann setzte ctrR (P ) ← ctrR (P ) + 1. • Zustand B: Falls ctrR (P ) ≥ ctrmax gehe in Zustand C • Zustand C: Verbreite ctrmax Runden lang das Gerücht weiter. Gehe dann in Zustand D über. • Zustand D: Gerücht wird nicht mehr weiterverbreitet. In Abbildung 4.11 wird gezeigt, wann welche Zustände mit welcher Häufigkeit auftreten. Theorem 11 [KKPS00] Shenkers Min-Counter-Algorithmus informiert mittels Push&Pull-Kommunikation alle Teilnehmer in log3 n+O(log log n) Runden mit Wahrscheinlichkeit 1−nO(1) , wobei maximal O(n log log n) Nachrichten übertragen werden. Es stellt sich im übrigen heraus, dass dieses Verhalten selbst dann garantiert ist, wenn die Partnerwahl im Kontaktgraphen Gt (von Push und Pull) nicht mit einer gleichmäßigen Wahrscheinlichkeitsverteilung durchgeführt wird. Da eine ungleichmäßige Wahrscheinlichkeitsverteilung die Verbreitung des Gerüchts erheblich verkürzen kann, ist die gleiche Performance wie Min-Counter dann mit der einfachen Alterungsterminierungsstrategie nicht zu erreichen. Eine weitere Verbesserung lässt sich erzielen, wenn der Min-Counter Algorithmus leicht verändert wird. Berthold Vöcking schlug daher vor, im Zustand B statt der Mininums-Bildung den Median zu verwenden und tatsächlich funktioniert der dadurch entstehende Median-Counter-Algorithmus für beliebige Wahrscheinlichkeitsverteilungen im Anruf-Modell [KKPS00]. Damit erweist sich dieser Median-Counter-Strategie als eine robuste Terminierungsstrategie für epideVor- mische Informationsausbreitung. 11. lesung 02.07.2004 74 4.2 Datenaggregation Epidemische Informationsausbreitung kann aber mehr, als nur eine Information in einem Netzwerk verbreiten. Man kann damit einfache Mechanismen zum Zählen, zur Durchschnittsbildung und für andere interessante Funktionen bereit stellen. Dies sind Überlegungen aus den Arbeiten [JM04, JMÖB04] von Alberto Montresor, Márk Jelasity und Ozalp Babaoglu von der Universität Bologna. 4.2.1 Zählen Wir starten mit einem Problem, dass uns schon in Viceroy begegnet ist. Wie kann man in einem Peer-toPeer-Netzwerk die Anzahl der Teilnehmer bestimmen? Diese auf den ersten Blick einfachere Aufgabe als z.B. einen bestimmten Peer ist aber bei weitem nicht trivial. Das Problem ist, dass Teilnehmer sehr effizient eingebunden werden in das Netzwerk und keine zentrale Kontrolle diesen Zugang protokolliert. Folgende Ansätze führen nur bedingt zum Erfolg: 1. Ansatz Wir setze in einem Peer eine Zähler-Variable auf 1 und übergeben diese Variable an den Nachbarn. Dieser erhöht den Zähler um 1 und gibt ihn wieder weiter. Das Problem hier ist, dass hier Kontrollmechansimen stattfinden müssen, die sicher stellen dass zum Einen keiner zweimal die Variable erhöht und zum anderen sicherstellen, dass tatsächlich alle Teilehmer diese Variable mindestens einmal erhalten. Ohne diese funktioniert dieser Ansatz z.B. auf dem Ring und benötigt in jedem Fall die nicht praktikable Laufzeit von n − 1 Sprüngen. 2. Ansatz Eine Liste aller Peers wird durch einen epidemischen Algorithmus verbreitet. Jedesmal wenn Listen zwischen Peers ausgetauscht werden, werden die Einträge ergänzt. Die Laufzeit eines solchen Algorithmus wäre wie eben bewiesen nur O(log n) wobei insgesamt O(n log log n) Nachrichten im Fall von Push&Pull verwendet werden. Der Nachteil dieser Methode liegt auf der Hand: Die Nachrichtenlänge wird auf lineare Größe anschwellen und dadurch wird die eigentliche Nachrichtenmenge mindestens Ω(n2 log log n) 3. Ansatz für Zählen In vielen Peer-to-Peer-Netzwerke werden Knoten zufällig auf einen Ring oder in ein Intervall gesetzt. Ferner hat man effiziente Methoden die Abstände zu den direkten Nachbarn zu bestimmen. Wir betrachte dann Abstand zu den nächsten O(log n) Nachbarn auf den Ring. Wenn man hieraus den Durchschnitt µ berechnet, dann liefert − log(µ)/µ eine Approximation mit einem konstanten Faktor von n. Dieses Verfahren arbeitet sogar mit nur einer Anfrage, wenn zum Einfügen das Prinzip der mehrfachen Auswahl angwendet wird. Dann muss nur der Abstand zum direkten Nachbarn gemessen werden um eine Approximation mit dem Faktor 2 zu erhalten. Man kann zeigen, dass diese Approximation sogar mit hoher Wahrscheinlichkeit zum exakten Resultat führt, wenn man O(log2 n) Nachbarn betrachtet und es dann geeignet anpasst. Dieses Verfahren funktioniert natürlich nur, wenn tatsächlich Knoten zufällig platziert werden. Wird von dieser zufällige Platzierung abgegangen, so entstehen Fehler, die die Ausgabe verfälschen könnten. Außerdem gibt es eine Reihe von Peer-to-Peer-Netzwerken, bei denen dieses Verfahren nicht verwendet werden kann (wie z.B. Pastry oder Gnutella). Kann man auch exakt zählen mit Hilfe von Push & Pull ? 75 Average-Algorithmus(s1 , . . . , sn ) begin loop n do (i, j) = getPair() si ← (si + sj )/2 sj ← (si + sj )/2 od end. Abbildung 4.12: Der Average-Algorithmus zur Daten-Aggregation Zählen durch Datenaggregation Tatsächlich gibt es ein wesentlich einfacheres und eleganteres Verfahren zum Zählen. Hierzu betrachten wir den folgenden verteilten Algorithmus [JM04]. • Initialisierung. Ein Peer kann den Zählvorgang starten. Dies sei Peer 1 und dieser setzt eine (reell-wertige) Variable s1 ← 1. • Verbreitung. Jeder weitere Peer i hat ebenfalls eine Variable si , die sobald dieser Peer vom Vorgang des Zählens (ausgelöst durch 1) erfährt mit si ← 0 initialisiert. • Ausgleich. Kontaktiert der Peer i den Peer j. Dann aktualisieren sie ihre Variablen (gleichzeitig) wie folgt: si sj ← (si + sj )/2 ← (si + sj )/2 Nach relativ kurzer Zeit, wie wir im nächsten Teilabschnitt sehen werden, konvergieren alle Variablen relativ schnell zu n1 . Daraus erhält jeder Teilnehmer aus dem reziproken Wert die Teilnehmeranzahl. Theorem 12 Nach O(log n) Runden gilt für alle Peers i mit hoher Wahrscheinlichkeit. 1 1 + =n si 2 4.2.2 Der Average-Algorithmus Damit verwendet der Zählalgorithmus folgenden verallgemeinerten Algorithmus mit Eingabe: s1 , . . . , sn , wobei die Variable si lokal in Peer i vorkommt3 . Dieser Algorithmus berechnet als Ausgabe: µ= 1 (s1 + . . . + sn ) . n Dies geschieht dadurch, dass die Variablen si gegen diesen Wert konvergieren und dass ab einen gewissen Zeitpunkt jeder Peer diesen Wert approximiert. Das Kommunikationsmodell wird durch getPair() festgelegt. getPair() liefert zwei verschiedene Peers gleichwahrscheinlich aus der Menge aller n vorhandenen Peers. Der Average-Algorithmus arbeitet wie in Abbildung 4.12 dargestellt. 3 Diese Nummerierung ist willkürlich und den Peers selber nicht bekannt. Sie dient nur zur Beschreibung des Algorithmus. 76 Wir betrachten folgende Potenzialfunktion P (S) für S := (s1 , . . . , sn ) 4 in Runde t, wobei P (S) := X (si − µ)2 . i∈[n] Für a = si und b = sj gilt nun (a − µ)2 + (b − µ)2 − 2 2 a+b −µ 2 = a2 + b2 − 2aµ − 2bµ − = = ≥ a2 b2 − + ab + 2aµ + 2bµ 2 2 a2 b2 + − ab 2 2 1 (a − b)2 2 1 (a − b)2 2 Nun ist E[(si − sj )2 ] = 2E[s2i ] − 2E[si sj ] = 2E[s2i ] − 2µ2 = 2E[(si − µ)2 ] = In jedem Schritt der Teilrunde verringert sich also P (S) erwartungsgemäß um folgende Rekursionsgleichung für die erwartete Potentialfunktion: 0 E[P (S )] = 1 1− n 2 P (S) . n 2 n P (S). Damit erhält man P (S) Somit gilt nach einer Runde: E[P (St+1 )] = 1 1− n n P (St ) = 1 P (St ) . e Nach 2c ln Runden ist die erwartete Potentialfunktion dann höchstens n−c P (St ). Die maximale Abweichung vom Durchschnitt µ ist aber höchstens n · µ (für positive Ausgangswerte. Wenn nun P (St ) ≤ n−c P (S0 ) gilt, dann gilt für alle si : |si − µ|2 ≤ n−c n max{(si − µ)2 }. Somit ist erwartungsgemäß nach 2c + 2 Runden der maximale Abstand um den polynomiellen Faktor n−c verringert worden. 4.2.3 Experimentelle Resultate Um diese Untersuchungen experimentell zu verifzieren, wurde in [JM04] dieser Zählprozess experimentell verifiziert. Hierzu wurde ein Knoten wurde mit dem Wert 100.000 initialisiert und alle anderen Knoten mit 0. Das Kommunikations netzwerk aus 20 Nachbarn für jeden Peer wurde (abweichend von dem oben beschriebenen Modell) einmalig uniform gewählt. Trotzdem zeigt Abbildung 4.13, dass der Algorithmus sehr schnell konvergiert. Aber auch in dynamischen Netzwerken gelingt es mit Hilfe der Datenaggregation die Netzwergröße zeitnah abzuschätzen. Hierzu wurde der Zählprozess immer wieder neu gestarten, während die Anzahl der Knoten zwischen 90.000 und 110.000 gleichmäßig oszillierte. In Abbildung 4.14 kann man sehen, dass mit Hilfe dieses Zählalgorithms die Netzwerkgröße angenähert werden kann. 4 Wir geben hier eine vom Skript und vom Artikel [JM04] abweichende Beweisidee wieder. Das heisst insbesondere, dass wieder dieser noch der in der Vorelesung vorgestellte Beweis prüfungsrelevant sind. 77 Abbildung 4.13: Experimentell Verifikation des Average-Aggregations-Algorithmus [JM04] Abbildung 4.14: Zählen der Peers durch Datenaggregation in einem dynamischen Netzwerk [JM04] 78 Peer-Ausfälle Des weiteren wurden Peer-Ausfälle untersucht. Im schlimmsten Fall, fallen die Peers zu Beginn aus. Angenommen, pf n Knoten fallen gleichverteilt durch einen Zufallsprozess aus und sei wiederum µf das Mittel von si . So ist nach [JM04] die Varianz von Mittelwert durch folgende Funktion beschrieben Var[µt ] = pf E[σ02 ] n(1 − pf ) 1 ρ 1−pf ρ − 1−p f 1− t . Die Hauptbeobachtung hierbei sit, dass mit zunehmender Teilnehmerzahl, nimmt der Einfluss der ausfallenden Peers ab (bei gleicher Ausfallwahrscheinlichkeit) und dass obgleich mit pf immer der gleiche Anteil von Peers ausfällt. 4.2.4 Weitere Aggregations-Funktionen Folgende Funktionen können ebenfalls effizient berechnet werden: • Das Minimum Hierzu berechnet man f (x, y) = min{x, y}. • Das Maximum Hierzu berechnet man f (x, y) = max{x, y}. Es bleibt anzumerken, dass sowohl Minimum als auch Maximum durch klassische epidemische Verfahren in Kombination mit den oben genannten Terminierungsmechanismen wesentlich effizienter berechnet werden kann. (Und das richtige Ergebnis liegt nach garantierter Laufzeit vor und wird nicht etwa nur approximiert). • Die Summe Hierzu wird der Average-Algorithmus für die Summanden verwendet und das Teilergebnis µ mit der Anzahl von Peers n , die ein parallel laufender Zählalgorithmus liefert, kombiniert. Ausgabe: µ · n • Das geometrische Mittel: Hierfür wird statt der arithmetischen Mittelwertbildung die geometrische Verwendet: s0i = s0j = √ si · sj • Produkt: Hier wird ähnlich wie bei der Summe, das geometrische Mittel g mit der Anzahl der Peers (aus einem parallelen Datenaggregationsalgorithmus) kombiniert: g n 4.2.5 Resumee Datenaggregation funktioniert auf jeder zusammenhängenden Netzwerktopologie und nicht nur im RandomCall-Modell dort aber mit logarithmischer Konvergenzzeit. Die Konvergenz ist stark abhängig von der Netzwerkstruktur, wobei für statische Netzwerke eine Analyse mit Markov-Prozessen möglich ist. Wegen der mangelnden Expander-Eigenschaft ergibt sich nur polynomielle Konvergenzzeit für Topologien wie den Ring oder das Gitter. Dagegen kann man logarithmische Konvergenz in Netzwerken zeigen, wie balancierte Bäume, Hyperwürfel, De-Brujin-Netzwerke, Butterfly-Netzwerke und CAN-Netzwerke mit mehreren Realitäten. Bis heute sind noch einige Fragen offengeblieben, wie zum Beispiel Welche Funktionen sind für Datenaggregation geeignet? Außerdem findet man bei der Datenaggregation keine so schnelle Konvergenz wie bei Push&Pull? Wie lässt sich dieser Unterschied erklären? 79 80 Kapitel 5 Routing und Sicherheit 12. VorPeer-to-Peer-Netzwerke stecken noch in den Kinderschuhen, so dass wichtige Aspekte wie Optimierung lesung des Routing und Sicherheit noch nicht ausreichend untersucht worden sind. Wir werden uns in diesem 09.07.2004 Kapitel mit ausgewählten, aktuellen Arbeiten aus diesen Bereichen beschäftigen. 5.1 Sicherheit in Peer-to-Peer-Netzwerken Bevor wir uns den spezifischen Sicherheitsaspekten von Peer-to-Peer-Netzwerken zuwenden, werden wir einen sehr kurzen Überblick über elementare Methoden der Kryptographie geben. 5.1.1 Methoden der Kryptographie Die klassische Verschlüsselungsmethode ist das symmetrisches Verschlüsselungsverfahren. Bekannte Verfahren sind hierbei z.B. Cäsars Code, DES (Digital Encryption Standard) und AES (Advanced Encryption Standard). Solche Verfahren bestehen aus den Funktionen f und g, sowie einem geheimen Schlüssel S. Ein Text T wird nun zum Code C verschlüsselt durch Anwenden von f : f (k, T ) = C , wobei aus C ohne die Kenntnis von k nicht der Originaltext rekonstruiert werden kann. Die Entschlüsselung geschieht durch Anwenden der Funktion g mit Kenntnis des selben Schlüssels k: g(k, C) = T . In der Regeln werden für f und g bekannte Verfahren verwendet, so dass die Sicherheit dieser symmetrischen Verschlüsselungsverfahren ausschließlich auf der Geheimhaltung des Schlüssels k beruht. Anders verhält es sich hier bei den Asymmetrischen Verschlüsselungsverfahren, wie z.B. RSA von Ronald Rivest, Adi Shamir, Lenard Adleman [RSA78] oder dem Diffie-Hellman-Schema [DH76] oder PGP (Pretty good privacy) [Zim92]. Hier gibt es zwei Schlüssel: einen geheimen Schlüssel S und einen öffentlichen Schlüssel P . Der geheime Schlüssel und der öffentliche Schlüssel werden von dem (zukünftigen) Empfänger einer verschlüsselten Nachricht zu einander passend erzeugt. Dann wird der öffentliche Schlüssel allen potenziellen Sender mitgeteilt. Diese verwenden ihn dann zur Verschlüsselung der Nachricht T in den Code C: f (P, T ) = C . Der Empfänger kann dann als einziger diese Nachricht entschlüsseln durch die Kenntnis des geheimen Schlüssels S: g(S, C) = T . Hierbei sind die Verschlüsselungsfunktion f und die Entschlüsselungsfunktion g in der Regel veröffentlicht. Die Sicherheit des Verfahrens beruht hier auf der Schwierigkeit den geheimen Schlüssel aus der 81 Kenntnis des öffentlichen Schlüssels zu rekonstruieren (oder aus einer Menge von Text/Code-Paaren eine Gesetzmäßigkeit in der Entschlüsselungsfunktion aufzudecken). Eine weitere wichtige Methode der Kryptographie sind die sogenannten Digitalen Unterschriften (Signaturen). Diese beruhen auf asymmetrischen Verschlüsselungsverfahren, wie z.B. RSA. Der Unterzeichner erzeugt auch hier einen geheimen Schlüssel S und öffentlichen Schlüssel P , sowie das Komprimat K des Texts T , z.B. durch kryptographsiche Hash-Funktion h: K = h(T ) . Nun berechnet der Unterzeichner die Funktion g(S, K) = U . Der Empfänger kann nun mittels des öffentlichen Schlüssels P und des Textes T die Unterschrift U verifizieren, indem er die folgende Gleichheit überprüft: f (P, U ) = h(T ) . Ein Problem hierbei ist, dass durch die Veröffentlichung von Text/Code-Paaren die Sicherheit des Verfahrens gefährdet ist. insbesondere dann wenn der Angreifer gewählte Dokumente zur Unterschrift vorlegt (chosen-message-attack). Dieses Problem wurde gelöst durch eine Signaturschema von Shafi Goldwasser, Silvio Micali, und Ronald Rivest [GMR88], das unter bestimmten Annahmen nachweisbar sicher ist. 5.1.2 Sicherheitsanforderungen in Peer-to-Peer-Netzwerken Zumeist sind Peer-to-Peer-Netzwerke darauf angelegt, offen und autonom zu sein. Dies scheint in einem Widerspruch zu Sicherheitsanforderungen zu stehen. Schließlich arbeiten Peer-to-Peer-Netzwerke in einem feindlichen Umfeld. Als Anforderungen kann man folgende Punkte formulieren: • Verfügbarkeit Ein großses Problem für Peer-to-Peer-Netzwerke stellen Dienstverweigerungsangriffe dar (Denialof-Service Attacks). Hier bombardieren beispielsweise eine große Menge von koopierenden Peers Knoten mit Anfragen nach einem Dokument. Dies kann zum Beispiell in Gnutella (II) zu einem Kollaps eines Super-Nodes führen (chosen-victim-attack). Eine andere Methode ist, dass ein bösartiger Peer sich zum Super-Node erklären läßt. Dann erzeugt er eine Menge von Scheinanfragen und blockiert so das ganze Netzwerke. Typisch ist auch ein Angriff durch Ausnutzung von Protokoll-Fehlern und Schwächen. Auf solche Angriffe kann mit der Nachbesserung des Netzwerksoftware reagiert werden. Für die Lösung der Infiltration bösartiger Peers verweisen wir auf die nachfolgende Diskussion von Sybil-Attacken und byzantinischen Generälen. • Dokumentauthentifikation Wenn man in einem Peer-to-Peer-Netzwerk ein Dokument bezieht, dann kann es sein, dass dieses Dokument in mehrfacher Kopie mit leichten Veränderungen vorhanden ist. Welches Dokument ist dann authentisch? Welches ist gefälscht, nachgemacht oder verfälscht? Welcher Autor hat die Urheberrechte? Eine Lösung kann sein Digitale Unterschriften zu verwenden. Diese beantworten aber nicht die Frage, welches Dokument zuerst da war (Das Independent-Label oder der Markentitel). Wie kann man nachweisen, dass eine Datei älter ist als ein anders? In der wirklichen Welt hilft die Physik weiter (C14-Methode, Vergilbung etc.). In der digitalen Welt funktioniert das natürlich nicht. Man kann mit herkömlichen Methoden höchstens nachweisen, dass ein Dokument jung ist (aber nicht, dass es alt ist) z.B. durch Referenz auf aktuelle nicht vorhersehbare Ereignisse1 . 1 Es gibt aber durchaus Ansätze für Systeme, die das Alter von Dokumenten nachweisen können. 82 • Anonymität Eine Motivation für die Anonymität ist nicht nur die Verhinderung des berechtigten Zugriffs staatlicher Verfolgungsbehörden gegen die unrechtliche Verletzung von Urheberschutzgesetzen. Das Internet ist weltumspannend und oftmals das einzige Medium, dass der Zensur und Verfolgung in Diktaturen entzogen ist. Man kann folgende Stufen der Anonymität unterscheiden: – Autor: Wer hat das erzeugt? – Server: Wo wird das gespeichert? – Leser: Wer hat sich das geholt? – Dokument: Welche Dokumente werden auf einen bestimmten Peer gespeichert? Die Peer-to-Peer-Netzwerke Free Haven und Crowds widmen sich dieser Problemstellung und bieten eine Palette verschiedener Stufen der Anonymität. • Zugangskontrolle Peer-to-Peer-Netzwerke werden aber auch in geschützten Bereichen, wie in Unternehmen und im Militär eingesetzt, die über das Internet eine sichere verteilte robuste Netzwerkstruktur unterhalten wollen. Eine Anwendung sind zum Beispiel Bezahl-Peer-to-Peer-Netzwerke, wie im aktuellen Napster-System. Eine Lösung kann hierzu eine zentrale Authorisierung sind. Auch kann man hier virtuelles Geld verwenden (dass ebenfalls zentral authentifiziert ist). Bei verteilte Lösungen ergibt sich ds Problem der Identifizierung und eine Interessenskollision mit dem Prinzip der Anonymität. Als Maßnahmen gegen Attacken unterscheiden wir die Entdeckung der Attacke, ihre Handhabung, die Systemwiederherstellung nach einer Attacke und natürlich im besten Falle die Verhinderung ein er Attacke. 5.1.3 Die Sybil Attacke Mit dem Namen “Sybil” kann kaum einer in Europa etwas verbinden (ganz im Unterschied zu den USA). Im Jahr 1973 erschien das Buch “Sybil” von Flora Rheta Schreiber, das von einer Frau mit 16 separaten Persönlichkeiten handelte (mit 16 unterschiedlichen Namen): Sybil ware eine Aushilfslehrerin mit ZeitAussetzern, Peggy war ein 9 Jahre altes wütendes, verängstigtes Mädchen, Vicki sprach fließend französisch, Vanessa spielte Klavier und war mit den Nachbarn befreundet, Marsha war eine dunkle Persönlichkeit mit Selbstmordabsichten, usw. Das Buch (und der darauf beruhende Film aus dem Jahr 1976) geht auf einen tatsächlichen Fall zurück von Multipler Persönichkeitsstörung (mehrfacher Schizophrenie). Bis heute ist umstritten, in wie weit diese Krankheit bei Menschen wirklich existiert. Bei Peer-to-Peer-Netzwerken ist eine absichtliche Persönlichkeitsstörung jedenfalls ein probates Mittel um die Strukturen zu attackieren. Hierzu gibt sich ein Peer als eine Vielzahl virtueller Peers aus und wird dadurch an mehreren Stellen im Netzwerk aktiv. Was kann eine Sybil-Attacke bewirken? Ein Netzwerk kann dadurch den Zusammenhalt verlieren. Dies betrifft beispielsweise CAN, Chord, Viceroy, Pastry und Tapestry aber nicht Napster (da Napster nicht verteilt arbeitet) und nicht zwingend Gnutella. Außerdem können Mehrheitsabstimmungen über den Zustand des Netzwerks gestört werden. Dies betrifft insbesondere die Mehrheitsfrage: “Verhält sich ein Peer korrekt?”. Dies Frage ist entscheidend für die Lösung des Problems der byzantinischen Generäle, wie wir gleich sehen werden. Außerdem könne durch eine Sybil-Attacke Anfragen im Netzwerk weitestgehend observiert werden. Das Netzwerk kann absichtlich verlangsamt werden oder gar ganz zerstört werden. Natürlich kann man mittels einer Sybil-Attacke auch einen Dienstverweigerungsangriff starten. Wir halten daher fest: Sybil-Attacken greifen Peer-to-peer-Netzwerke wirkungsvoll an. 83 Wie kann man Sybil-Attacken abwehren? Ein nahe liegender Ansatz ist eine zentrale Authorisierungsstelle, welche die Identität der teilnehmenden Peers bestätigt. Diese zentrale Instanz authentifiziert die Existenz eines Teilnehmers und die Gültigkeit seiner öffentlicher Schlüssel durch eine digitale Unterschrift. Jeder Peer kann sich dadurch von der Existenz des Peers überzeugen. Damit kann natürlich kein anonymes Peer-to-Peer-Netzwerk betrieben werden. Problematisch sind dezentrale Authorisierungsstrategien. Erlaubt man z.B. einem Peer auch nur eine kleine Menge von anderen Peers zu authorisieren, dann kann Peer 1 den Peer 2 authorisieren. Dieser authorisiert Peer 3, der dann Peer 4 usw. Damit steht einer Sybil-Attacke nichts mehr im Wege. 5.1.4 Der Sybil-Abwehransatz John Douceur Ein interessanter Ansatz zur Abwehr von Sybil-Attacken wurde von John Douceur (Microsoft Research) [Dou02] entwickelt. Die Annahmen sind hier, dass Peers einzelne Rechner sind, die einer Person unterstehen. Außerderm verfügen Einzelpersonen nicht über unbeschränkte Rechenresourcen. Die Lösungsstrategie ist, dass alle Teilnehmer des Peer-to-Peer-Netzwerks ein bestimmtes mathematisches Problem (Challenge) lösen müssen. Zum Beispiel müssen sie für verschiedene Werte y, den Wert x finden mit h(x) = y, wobei h ist eine kryptographisch sichere Hash-Funktion ist. Hierbei wurde y = h(x) von einem herausfordenden Peer (Challenger) gewählt. Die Größe der Aufgabe kann durch die teilweise Bekanntgabe der Bits von x eingestellt werden. Innerhalb einer gewissen Zeit kann jeder virtuelle Peer nur eine bestimmte Anzahl von solchen “Challenges” lösen. Der Vorteil dieses Ansatzes ist, dass hiermit ein Ansatz vorhanden ist überhaupt Sybil-Attacken zu begegnen. Nachteile Der Hauptnachhteil ist sicherlich die unglaubliche Verschwendung von Rechenresourcen (Energie, Zeit, Rechenleistung, etc.) Dagegen stehen einem Angreifer duch “Ein-Hacken” in fremde Rechner enorme Rechenkapazitäten zur Verfügung. Daneben sind die den Benutzern zur Verfügung stehenden Rechenressourcen enorm heterogen. Studenten an Universitäten können über Pool-Recher große Rechenkapazitäten verfügen, staatliche Einrichtung verfügen über noch größere Resourcen (siehe Motivation). Wenig leistungsfähige Peers können durch den Challenge überfordert werden, wie zum Beispiel ältere PCs, Pocket-PCs, etc. Der Challenge selbst ist ein institutionalisierte Form des Denial-of-Service-Attacks. 5.1.5 Das Problem der byzantinischen Generäle Ein ganz typisches Problem im Netzwerkbereich ist das sogannte Problem der byzantinischen Generäle [LSP95]. Im oströmischen Reich besaßen die Generäle immer Ambitionen Kaiser zu werden und verfolgten daher mit ihren Armeen mitunter höchst eigennützige Strategien. Daher konnten sich die Mit-Generäle im Falle eines Kriegs nicht unbedingt auf ihre Kollegen verlassen. Wir modellieren hier den Fall von drei Generälen. Drei byzantinische Armeen stehen unter dem Kommando dreier Generäle bereit, die gegnerische Burg zu erobern. Die Armeen sind räumlich getrennt und kommunizieren über Boten. Die militärische Lage ist die Folgende: Greift nur eine Armee an, so verliert diese. Greifen zwei an, so gewinnen diese. Greift keine an, so gewinnen die Armeen auch, da durch die fortwährende Belagerung die Burg ausgehungert wird. Jetzt ist aber ein General übergelaufen und man weiß nicht, welcher es ist. Wie in Abbildung 5.1 gezeigt, versucht der übergelaufene General X versucht General A zum Angriff zu überreden und General B zum abwarten. Wenn nun B diesen Befehl A übermittelt und A den gegenteiligen Befehl an B, so können die beiden Generäle diesen Widerspruch nicht auflösen. Schlimmer wiegt der Umstand, dass weder B noch A den General X als Überläufer überführen können oder als Übermittler widersprüchlicher Befehle, da dieser jeweils einen der andern Generäle beschuldigen kann. Theorem 13 Das Problem der drei byzantinischen Generäle kann nicht gelöst werden. Für vier Generäle ist das Problem lösbar. 84 Abbildung 5.1: Der übergelaufene General X gibt widersprüchliche Anweisungen Abbildung 5.2: Unauflösbare Verwirrung unter den Generälen Wir werden die Strategie für vier Generäle kurz skizzieren. Im Falle von vier Generälen müssen alle drei ehrlichen Generäle angreifen oder alle drei abwarten. Dieses Problem kann auf das “1-General, 3 Offiziere-Problem” reduziert werden, siehe Abbild Ist nun der General loyal und einer der drei Offiziere ein Überläufer. So gibt der General konsistente Anweisungen für den Angriff. Diese geben diese Information an alle anderen Offiziere weiter. Diese berechnun eine Mehrheitsentscheidung, die durch einen der drei Offiziere nicht behindert werden kann, siehe Abbildung 5.3 und 5.4. Ist der General nicht loyal, so werden seine (widersprüchlichen) Befehle korrekt unter den Offizieren ausgetauscht. Diese folgen dann der Mehrheitsentscheidung des loyalen Generals, der damit ein gemeinsames Handeln der Offiziere nicht verhindern kann, siehe Abbildung 5.5. Im allgemeinen gilt das folgende Theorem. Theorem 14 Falls m Generäle Überläufer sind, müssen mindestens 2m + 1 Generäle ehrlich sein, damit das Problem der Byzantinischen Generäle lösbar ist. Diese Schranke ist genau, wenn keine kryptographischen Annahmen gemacht werden, wenn also asymmetrische Kryptographie-Verfahren nicht verfügbar sind2 . D.h. wenn man genug Zeit hat jede Verschlüsselung zu brechen Theorem 15 Steht ein digitales Signaturschema zur Verfügung, dann kann eine beliebige Anzahl von falschen Generälen verkraftet werden. Beweis: Hierbei unterschreibt jeder General seinen Befehl und in der folgenden Runde gibt jeder General alle Befehle mit Unterschriften an alle anderen Generäle weiter. Hat nun jeder den korrekten öffentlichen Schlüssel, kann jeder inkonsistente Befehl oder jede falsche Weitergabe aufgedeckt werden. 2 Im strengen Berechenbarkeitsbegriff der Rekursionstheorie ist jedes asymmetrisches Verfahren unsicher, da man “nur” jeden geheimen Schlüssel ausprobieren muß, der zum öffentlichen Schlüssel passen könnte. Das berücksichtigt aber nicht die kombinatorische Vielfalt und die Beschränktheit der Rechenmaschinen sich dorthin zurecht zu finden (falls P = 6 N P) 85 Abbildung 5.3: Der loyale General gibt konsistente Befehle Abbildung 5.4: Eine Mehrheitsentscheidung unter den drei Offizieren kann von dem Überläufer nicht gestört werden Abbildung 5.5: byz-loes-3.pdf 86 Abbildung 5.6: Struktur des Peer-to-Peer-Netzwerks von [FS02] Byzantinische Generäle und Peer-to-Peer-Netzwerke - Ein Resumee Durch den Einsatz von digitalen Unterschriften reduziert sich das Problem auf den (bösartigen) Ausfall von Knoten in einem Netzwerk wenn die Nachbarn die Kommunikation rekonstruieren können. Das Hauptproblem ist, dass dafür O(n) Nachrichten pro Peer verwendet werden müssen. 5.1.6 Ein Zensor-Resistentes Peer-to-Peer-Netzwerk Amos Fiat und Jared Saia stellen in [FS02] ein Peer-to-Peer-Netzwerk vor, dass in der Lage ist, den Ausfall von 50% aller Peers durch einen Angriff zu verkraften. Voraussetzung hierfür, ist dass der Angreifer nichts über die interne Netzwerk-Struktur weiss. Weist man den Knoten die Aufgaben zufällig zu, so fällt jeder Knoten mit Wahrscheinlichkeit 12 aus. Das Netzwerk besteht aus einer Butterfly-Struktur mit Clustern der Größe c log n als Knoten. Die Cluster sind bipartite Expander-Graphen. Definition 3 Bipartiter Graph Ein bipartiter Graph besteht aus zwei disjunkten Knotenmengen A und B, so dass jede Kante einen Knoten aus A und B verbindet. Definition 4 Expander-Graph Ein bipartiter Graph ist ein Expander-Graph, wenn für jede Teilmenge X von A, deren Kardinalität A um höchstens einen konstanten Faktor kleiner 1 erreicht, die Menge der Nachbarknoten in B um einen konstanten Mindestfaktor größer als 1 ist. Diskussion Damit hat man zugleich ein sehr effizientes, robustes, als auch einfaches Verfahren. Auch lässt sich das Funktionsprinzip auf alle bisher diskutierten Verfahren verallgemeinern. Problematisch ist nur, dass der Angreifer wenig über die interne Struktur weiss. Somit funktioniert dieses System wohl nur bei Systemen mit Zugangskontrolle. Denn falls der Angreifer die Struktur kennt, 87 dann kann er jedes System mit konstanten Grad mit einem Denial-of-Service-Angriff auf wenige Peers 13. Vor- aushebeln. lesung 12.07.2004 5.2 Routing in Peer-to-Peer-Netzwerken Bis jetzt haben wir uns (unter anderen) darauf konzentriert, die Netzwerkstruktur hinsichtlich des Durchmessers und des Grads zu optimieren. Die Motivation, um den Durchmesser zu minimieren, war die Routing-Zeit zu minimieren. Hierbei muss man aber zwei Operationen unterscheiden, welche die Datenabfrage betreffen. • Fetch: Wie lange dauert das Laden der Daten. Interessanterweise kann man auch hier die Zeit durch den Einsatz von verteilten Kopien oder Caches verringern. • Lookup: Dieser beschreibt die Zeit, die notwendig ist den Peer zu finden, der die gewünschten Daten trägt. Diese Zeit ist nicht notwendigerweise linear in der Anzahl der Hops, wie wir gleich sehen werden. Wir werden uns in diesem Abschnitt der Optimierung dieses Aspekts zuwenden. Weitere Optimierungsziele sind die Verläßlichkeit des Lookup, die Knotenlast und die Netzwerklast. Bezüglich der Verlässlichkeit interessiert man sich dafür, welche Netzwerkstrukturen den Ausfall von Peers am besten kompensieren können. Welche der dazu notwendigen Replizierungsstrategien sind empfehlenswert? Die Knotenlast beschreibt die Anzahl der Informationen, die auf einem Knoten gespeichert werden und die Anzahl der Anfragen. Um Peers nicht zu überlasten, strebt man hier eine möglichst gleichmäßige Verteilung an. Die Netzwerklast bedingt den Datendurchsatz. Kurze Routing-Wege können zu Engpässen führen. Ein Peer kann dadurch gezwungen werden, sehr viele Anfragen weiter zu leiten. Anzustreben ist ein Routing, dass möglichst gleichmässig Peers als Router einsetzt (wie wir es schon in Viceroy und in Distance-Halving gesehen haben). Wir werden in der verbliebenen knappen Zeit diese Fragen nicht behandeln können. Wir konzentrieren hier uns auf die Lookup-Latzenzeit und wenden uns der Routing-Optimierung von zwei elementaren Peerto-Peer-Netzwerken zu, die wir zu Beginn besprochen haben: CAN und CHORD. 5.2.1 Techniken für CAN In [RFH+ 01] wurden folgende Techniken zur Latenzzeit-Optimierung vorgestellt.3 Latenzoptimiertes Routing Durch Messung der RTT (round trip time) von Testnachrichten wird eine Abstandsmessung vorgenommen. Dann wird bezüglich dieser Abstandmetrik ein Routing durchgeführt, dass nähere Nachbarn bevorzugt. Eine noch bessere Zeitersparnis ergibt sich durch die Topologieangepasste Netzwerkkonstruktion, welche das CAN-Netzwerk von Anfang an gemäß der Latenzzeiten aufbaut. Überladen von Zonen Hierbei wird mehreren Peers die Verantwortung für eine Zone übertragen. In diese Zone werden bis zu M AXPEERS Diese unterhalten dann Kopien der Information oder geben Anfragen in dieser Zone direkt weiter. Der Vorteil dieser Methode ist, dass für das Routing mehr (latenz-) nahe Peers zur Verfügung stehe (Außerdem verringert sich der Durchmesser des um den Faktor O(M AXPEERS). Dadurch verringert sich die Latenzzeit erheblich und die Fehlertoleranz (Verlässlichkeit) wird verbessert. Datenkopien Daten im CAN-Netzwerk können auch mehrfach unter verschiedenen Adressen abgespeichert werden. Dadurch kombiniert man den Schlüssel mit einer Zahl k aus {1, 2, .., C OPIES} kombiniert. Auch dies erhöht die Robustheit (Verlässlichkeit) und verringert die Hop-Distanz für den Lookup (und damit die Latenzzeit), da nur noch der Lookup zu der nächsten Kopie notwendig wird. Die Anzahl der Hops zu der nächsten Kopie nimmt hierbei indirekt proportional mit der Anzahl der Kopien ab. 3 Diese wurden bereits in der dritten Vorlesung vorgestellt 88 Abbildung 5.7: Zwei Realitäten eines (zwei-dimensionalen) CAN-Peer-to-Peer-Netzwerks Weitere Designparameter in CAN Die Leistungsfähigkeit von CAN hängt stark von der verwendeten Dimension d ab. Wählt man einen höherdimensionalen Bildbereich, so verringert sich die Hop-Distanz O(n1/d ), während sich der (erwartete) Grad auf 2d erhöht. Ein weiteres Konzept war die Verwendung von verschiedenen Realitäten, siehe Abbildung 5.7. Simultan werden r CAN-Netzwerke aufgebaut, wobei jeder Peer mit für jeder Realität unterschiedlich HashFunktion abgebildet wird. Dadurch erhöht sich der Grad um den Faktor von r, während die verschiedenen Realitäten sowohl die Zuverlässigkeit als auch die Hop-Distanz und Latenzeit verringert. Vergleicht man aber diese Werte mit den Gewinnen aus einer Vergrößerung der Dimension, so schneidet die Dimensionserhöherung besser ab. 5.2.2 Routing-Techniken für CHORD: DHash++ Wir haben gesehen, dass in CAN es verschiedene Parameter gibt, die helfen können die Latenz-Zeit und Zuverlässigkeit zu erhöhen. Auf den ersten Blick hat CHORD nicht diese Vielfalt an Parametern. Tatsächlich kann man aber mit einer Reihe von Techniken auch in CHORD Gewinne in der Latenz-Zeit erreichen. Wir folgen hier den Untersuchungen von Dabek, Li, Robertson und Kaashoek folgen [DLS+ 04]. In der Datenstruktur von Chord gibt es für jeden Peer b einen Nachfolger (successor) und VorgängerZeiger (predeccessor) auf dem Ring, wo jedem Peer eine zufällige Position zugewiesen wird. Wesentlich für die Suche sind die Finger: Für i ∈ {0, .., m − 1} bezeichnet Finger[i] den Peer, dar auf den Wert rV (b + 2i ) auf dem Ring folgt. Für kleine i werden unterscheiden sich diese Finger-Einträge nciht mehr. Mit hoher Wahrscheinlichkeit müssen nur O(log n) verschiede Finger gespeichert werden. Chord benötigt mit dieser Struktur O(log n) Hops für eine Lookup-Operation und O(log 2 n) Hops für das Einfügen oder Entfernen von Peers (jeweils mit hoher Wahrscheinlichkeit). Diese Datenstruktur ist nun die Ausgangsbasis von [DLS+ 04]. Ausgehend von Chord werden die folgenden Techniken verwendet, um die Latenzzeit zu verringern. • Datenlayout • Rekursion (statt Iteration) • Nächste Nachbarauswahl • Replikation versus Kodierung von Daten • Fehlerkodierungs-optimierter Lookup • Striped Transport Protocol (statt STP) Wir werden diese Techniken nun im Detail vorstellen. 89 4 5 #dimensions=2 increasing dimensions, #realities=2 1 reality 2 realities 3 realities 4 realities d=2, r=2 26.00 24.00 Number of hops 22.00 4096 16K 64K 256K 1M Number of nodes = 131,072 20.00 r=3 18.00 16.00 r=4 14.00 d=3 12.00 r=5 r=6 Number of nodes 10.00 d=4 8.00 ect of multiple realities on in can by TT) is to vel increasing realities, #dimensions=2 d=5 6.00 8 12 16 20 d=6 24 r=7 d=7 28 Number of neighbors Abbildung 5.8: Hop-Distanz-Verringerung durch Erhöhung der Dimension und der Anzahl der Realitäten in CAN [RFH+ 01] Figure 6: Path length with increasing neighbor state which is the maximum number of allowable peers per zone (we imagine that this value would typically be rather low, 3 or 4 for example). With zone overloading, a node maintains a list of its peers in addition to its neighbor list. While a node must know all the peers in its own zone, it need not track all the peers in its neighboring zones. Rather, a node selects one node from each of its neighboring zones. Thus, zone overloading does not increase the90amount of neighbor information an individual node must hold, but does require it to Abbildung 5.9: Iterativer Lookup in Chord Abbildung 5.10: Rekursiver Lookup in Chord Datenlayout Eine wesentliche Frage, die wir bislang noch nicht untersucht haben, ist, ob die Daten überhaupt verteilt gespeichert werden sollen? Die Alternativen ist zum Beispiel ein sogenannter “Key location service”. Hier wird die Referenzinformation auf Dokumente gespeichert. Eine weitere Methode ist die verteilte Datenspeicherung, bei der die Dokumente auf die Peers verteilt werden. Eine weitere Methode ist die verteilte Speicherung von Datenblöcken, d.h. Entweder Caching von Datenblöcken oder blockweise Verteilung aller Daten über das Netzwerk. Hierzu gibt es weitere Alternativen (die im [DLS+ 04] nicht betrachtet werden). Zum Beispiel die semantische Partitionierung und Speicherung von Dokumenten (wenn wie bei XML-Dokumenten solche Information verfügbar ist). Von diesen Methoden verwendet DHash++ eine blockweise (unsemantische) Verteilung aller Daten über das Netzwerk. Rekursiver versus Iterativer Lookup Bei der Durchführung eines Lookups in Chord kann man folgende Varianten verwenden: Iterativer Lookup: Wie in Abbildung 5.9 dargestellt, kontrolliert der Lookup-initiierende Peer die Suche, indem er sukzessive die Peers auf dem Lookup-Pfad nach den Finger-Zeigern abfragt. Rekursiver Lookup: Hier übergibt jeder Peer die Suchanfrage an den nächsten zuständigen Peer, der diese dann entsprechend weiterleitet, siehe Abbildung 5.10. Der Zielpeer liefert dann die gesuchte Information direkt an den Initiator des Lookups zurückt. DHash++ wählt diesen rekursiven Lookup, da der Lookup dann fast um den Faktor zwei schneller ist als für den iterativen Lookup. In Abbildung 5.11 ist die kumulative Verteilung der Latenzzeiten aus Simulationen dieser beiden Methoden dargestellt. Nächste Nachbarauswahl Ein wichtiges Maß, um die tatsächliche Latenzzeit zwischen zwei Peers im Internet zu messen ist die so genannte Round-Trip-Time (RTT). Dies ist die Zeit, die benötigt wird, um eine Nachricht zu einem Peer zu schicken und eine Antwort zu erhalten. Diese Zeit wir in einem Ansatz von Gummadi, Gummadi, Grippe, Ratnasamy, Shenker und Stoica [GGG+ 03] verwendet verwendet, um 91 Abbildung 5.11: Vergleich von iterativen und rekursiven Lookup in Chord [DLS+ 04] die Nachbarauswahl zu optimieren. Proximity Neighbor Selection (PNS): Die Routingtabelle der Peers (d.h. hier die Finger) wird hinsichtlich der Latenzzeit (RTT) optimiert. In Chord kann diese Technik wie folgt angewendet werden. Statt einem Sprung mit Entfernung 2k für einen Finger des Levels k durchzuführen, wird nach dem Peer im Intervall [2k−1 , 2k [ rechts vom Ausgangspeer auf dem Ring gesucht, der die kleinste Latenzzeit besitzt, siehe Abbildung ?? ProximityRouteSelection(PRS): Nachdem die Routingtabelle erstellt ist, wird der nächste Nachhbar aus der Routing-Tabelle genommen. Wie kann man diese Methode auf Chord anwenden? Statt immer den größtmöglichen Sprung zu nehmen, der noch vor dem Zielpeer liegt, nimmt man den (latenz)-nächsten Sprung, der noch vor dem Zielpeer auf dem Ring liegt. Simulationen (Abbildung 5.13) zeigen, dass der größte Gewinn durch PNS erreicht wird, während die Kombination von PNS und PRS praktisch nicht besser wird als PNS alleine (In der Abbildung fallen diese Linien aufeinander). DHash++ verwendet daher nur PNS (Proximity Neighbor Selection). Diese Optimierung ist aber recht aufwändig, da für die längsten Finger, Abstandsmessungen zu rund einem Viertel aller Peers durchgeführt werden müssen. Statt im gesamten Intervall nach dem nächsten Nachbarn zu suchen wird unter einer kleine Auswahl von 16 zufällig gewählten Peers ausgewählt (PNS-Sample). In Abbildung 5.14 wird das (0, 1; 0, 5; 0, 9)-Perzentil einer solchen PNS-Wahl gezeigt (Das p-Perzentil bezeichnet den Wert eines Elements einer Verteilung mit n Element für das pn kleiner sind als dieses Element). Man sieht, dass praktisch kein Unterschied festgestellt wird für ≥ 16 Samples. DHash++ nimmt als Strategie die Proximity-Neighbor-Selection mit einer Testmenge von 16 Elementen. Abbildung 5.15 zeigt die durchschnittliche Latenzzeit bei Lookup, bei Wahl von 16 Elementen im Vergleich mit der kürzesten Wahl. Interessanterweise nimmt die Latenzzeit mit der Netzwerkgröße kaum zu. Wie kann man sich das erklären. Eine Intuition liefert die folgende Überlegung. Sei L die durchschnittliche Latenzzeit und nehmen wir an, dass die Latenzzeiten gleichmäßig (uniform) verteilt sind. Mit 2L sind die beiden letzten Hops am teuersten. Der vorletzte erhält im Erwartungswert Latenzzeit L/2, weil von zwei möglichen Peers der schnellere genommen wird. Beim nächsten Finger kann man aus vier Nachbarn wählen, was die durchschnittliche Latenzzeit auf L/4 reduziert. Der nächste Finge hat dann Latenzzeit L/8, usw. Nach dieser 92 Finger minimieren RTT im Intervall Abbildung 5.12: Wahl der Finger in Chord durch Proximity Neighbor Selection (PNS) [DLS+ 04] Abbildung 5.13: Vergleich von PNS, PRS und deren Kombination in Chord [DLS+ 04] 93 Abbildung 5.14: (0, 1; 0, 5; 0, 9)-Perzentile eines solchen PNS-samples verschiedener Größ[DLS+ 04] Abbildung 5.15: Routing Zeit eines PNS-16-samples im Vergleich zu PNS in Chord [DLS+ 04] 94 Überschlagsrechnung ist dann die erwartete Latenzzeit: L + L + L/2 + L/4 + L/8 + L/16 + L/32 . . . = 3L . Dieses Verhalten wird durch Simulationen bestätigt. Kodierung versus Replikation In [AL96] führten Noga Alon und Mike Luby die sogenannten Erasure Resilient Codes ein. Damit kodiert man ein Dokument aus m Fragmenten in n Fragmente wobei n > m. Aus jeder Kombination der m Fragmente lässt sich das Original-Dokument herstellen. Zum Beispiel: Sei r = 1/4 und ein Dokument bestehe aus 16 Fragmenten Dann vergrößert diese Kodierung das Dokument auf 64 kodierte Fragmente. Es wird dabei die vierfache Speichermenge benötigt. Um das Dokument abzufragen, können 16 beliebige der 64 kodierten Fragmente genommen werden und aus diesen kann das Originaldokument rekonstruiert weden. Hakim Weatherspoon und John Kubiatowicz zeigten in [WK02] für Oceanstore, dass die Verfügbarkeit von Daten enorm zunimmt, wenn man diese Kodierung verwendet. DHash++ verwendet einen m = 7, n = 14, r = 2 Erasure Resilient Code. Damit nimmt die Ausfallwahrscheinlichkeit um zwei Zehnerpotenzen ab Dafür erhöht sich die Fetchzeit im Vergleich zu m = 1, n = 2, und r = 2, d.h. Download-Zeit, um rund 20%. Die Fetchzeit beider Verfahren ist aber immer noch im Durchschnitt besser als die Daten direkt abzufragen. Eine weitere Eigenschaft dieser Codes ist, dass beim Schreibzugriff müssen bei dieser Kodierung nur 8 der 14 Fragmente verändert werden müssen. Dadurch genügt es die 8 nächsten Fragmente zu verändern, was zu einer Zeitersparnis führt. Integration von Kodierung und Lookup Die Erasure Resilient kodierten Fragmente werden auf k benachbarten Peers auf den Chord-Ring abgelegt. Das Problem ist nun, dass der letzte Hop am teuersten ist. Nun genügen aber k/2 der k benachbarten Peers genügen, um das Datum zu erhalten (es wird r = 1/2 gewählt). Somit wird die Chord-Suche wird abgebrochen, wenn schon k/2 Peers in diesem Intervalls gefunden worden sind. Dafür wird in der Rekursion die Menge aller Peers, die schon auf den Weg zum Vorgänger des Teilintervalls aufgefunden worden sind, gespeichert. Sind k/2 Peers dabei aufgelaufen, wird die Rekursion beendet und die bereits gefundenen k/2 Peers beantworten die Suchanfrage. Performanzgewinn durch diese Komponenten Abbildung 5.16 fasst nun den Performanzgewinn durch die Komponenten Datenlayout (Base), Rekursion, nächste Nachbarauswahl (Proximity Routing), Replikation versus Kodierung von Daten (Server selection) und Fehlerkodierungs-optimierter Lookup (Integration) zusammen und zeigt die kumulativen Beschleunigungen. Hierbei zeigt heller Grund die Lookup-Zeit und dunkler Untergrund die Fetch-Zeit. Auf der linken Seite sieht man einen realen Test, in der Mitte eine Simulation und auf der rechten Seiten einen Test mit einer Benchmark-Latenzmatrix. Das Underlay-Netzwerk: Das Internet Das Internet ist das weltweite, offene WAN (wide area network). Dies ist in der Regel das den Peer-to-Peer-Netzwerken zu Grunde liegende Netzwerk. Das Internet besteht im wesentlichen aus der Netzwerkschicht IP (Internet Protokoll), dass mit den Unterprotokollen ICMP (Internet control message protocol) und IGMP (internet group management protocol) für das Routing der Pakete verantwortlich ist und aus der Transportschicht. In der Transportschicht gibt es neben UDP (User Datagram Protocol). TCP erzeugt einen zuverlässigen Datenfluß zwischen zwei Rechnern. Es unterteilt Datenströme aus Anwendungsschicht in Pakete und versendet Empfangsbestätigungen (Acknowledgments). UDP (user datagram protocol) ist dagegen ein einfacher unzuverlässiger Dienst zum Versand von einzelnen Paketen. Hierzu wandelt es die Eingabe in ein Datagramm um, wobei die Anwendungsschicht die Paketgröße bestimmt. In beiden Protokollen bestimmt IP den eigentlichen Versand. Für eine weitergehende Einführung zu TCP/IP sei auf die Vorlesungsunteralgen “Algorithmische Grundlagen für das Internet” in den vergangenen Sommersemestern hingewiesen. Ein eigenes Transport-Protokoll Es stellt sich heraus, dass TCP sich nicht eignet, um den den Lookup in Peer-to-Peer-Netzwerken zu steuern. Das Problem ist der Stauvermeidungsmechanismus von TCP (congestion avoidance), der dazu dient die Paketmenge im Internet fair und effizient zu kontrollieren. 95 Abbildung 5.16: Kumulativer Performanz-Gewinn in DHash++ [DLS+ 04] Hierzu passt TCP die Datenrate an. TCP startet beim Versenden mit einem Paket pro RTT (slow start) und verdoppelt es in nach dem erfolgreichen Empfangen von Paketen. Dadurch erhöht sich die Latenzzeit. TCP arbeitet erst effizient bei einer kleinen Anzahl von langlaufenden Verbindungen. UDP ist keine Lösung, da UDP unzuverlässig (kein Acknowledgment) arbeitet. Deutlich wird dieser Umstand, wenn man berücksichtigt, dass im Routing-Layer Pakete absichtlich (!) gelöscht werden. In DHash++ wird UDP als Basis für eigenes Protokoll verwendet: Striped Transport Protocol (STP). Dies verwendet wie TCP einen Fenster-Kontrollmechanismus zur Datenratenanpassung, verwendet aber keinen fast-retransmit. TCP verwendet implizites Wissen über die Paketordnung, um verlorengegangen Pakete schnell nachzusenden. Wegen der stark variierenden Latenzzeiten in CHORD geht diechronologische Ordnung der Pakete verloren. Deswegen kann STP wesentlich schneller Pakete ausliefern, wie Abbildung 5.17 zeigt. Vergleich von TCP und SCP in DHash++ Diskussion DHash++ DHash++ kombiniert eine Reihe von Techniken zur Verbesserung der Latenzzeit des Lookups und des Daten-Fetch. DHash++ erhöht dabei Zuverlässigkeit des Datenzugriffs. Dies wird erreicht durch Latenzoptimierte Routing-Tabellen, Redundante Datenkodierung, Aufbau der Datensuche, Änderungen in der Transportschicht, und geeignete Integration der Komponenten. Alle diese Komponenten können auch auf andere Peer-to-Peer-Netzwerk angewendet werden. (Tatsächlich sind einige schon integrale Bestandteile anderer (z.B. Datenkodierung aus Oceanstore und Latenzoptimierung in Pastry). 96 Abbildung 5.17: Vergleich von STP und TCP in DHash++ [DLS+ 04] 97 98 Literaturverzeichnis [AL96] A LON und L UBY: A Linear Time Erasure-Resilient Code with Nearly Optimal Recovery. IEEETIT: IEEE Transactions on Information Theory, 42, 1996. [DGH+ 87] D EMERS , A LAN, DAN G REENE, C ARL H AUSER, W ES I RISH, J OHN L ARSON, S COTT S HENKER, H OWARD S TURGIS, DAN S WINEHART und D OUG T ERRY: Epidemic Algorithms for Replicated Database Maintenance. In: S CHNEIDER , F RED B. (Herausgeber): Proceedings of the 6th Annual ACM Symposium on Principles of Distributed Computing, Seiten 1–12. ACM Press, 1987. [DGMY02] DASWANI , N EIL, H ECTOR G ARCIA -M OLINA und B EVERLY YANG: Open Problems in Data-Sharing Peer-to-Peer Systems. In: Proceedings of the 9th International Conference on Database Theory, Seiten 1–15. Springer-Verlag, 2002. [DH76] D IFFIE , W HITFIELD und M ARTIN E. H ELLMAN: New Directions in Cryptography. IEEE Transactions on Information Theory, IT-22(6):644–654, 1976. [DLS+ 04] DABEK , F., J. L I, E. S IT, J. ROBERTSON, M. K AASHOEK und R. M ORRIS: Designing a DHT for low latency and high throughput, 2004. [Dou02] D OUCEUR , J.: The sybil attack, 2002. [DR01a] D RUSCHEL , P. und A. ROWSTRON: PAST: A Large-Scale, Persistent Peer-to-Peer Storage Utility. In: IEEE (Herausgeber): Eighth IEEE Workshop on Hot Topics in Operating Systems (HotOS-VIII). May 20–23, 2001, Schloss Elmau, Germany, Seiten 75–80, 1109 Spring Street, Suite 300, Silver Spring, MD 20910, USA, 2001. IEEE Computer Society Press. [DR01b] D RUSCHEL , P ETER und A NTONY ROWSTRON: Pastry: Scalable, distributed object location and routing for large-scale peer-to-peer systems. In: G UERRAOUI , R ACHID (Herausgeber): Middleware 2001, IFIP/ACM International Conference on Distributed Systems Platforms Heidelberg, Germany, November 12-16, 2001, Proceedings, Band 2218 der Reihe Lecture Notes in Computer Science, Seiten 329–350. Springer, 2001. [FS02] F IAT, A MOS und JARED S AIA: Censorship Resistant Peer-to-Peer Content Addressable Networks. In: Proceedings of Symposium on Discrete Algorithms, 2002. [GGG+ 03] G UMMADI , K., R. G UMMADI, S. G RIBBLE, S. R ATNASAMY, S. S HENKER und I. S TOI CA : The impact of DHT routing geometry on resilience and proximity. In: Proceedings of the 2003 conference on Applications, technologies, architectures, and protocols for computer communications, Seiten 381–394. ACM Press, 2003. [GMR88] G OLDWASSER , S HAFI, S ILVIO M ICALI und RON L. R IVEST: A Digital Signature Scheme Secure Against Adaptive Chosen-Message Attacks. SIAM Journal on Computing, 17(2):281– 308, 1988. [Gnu] G NUTELLA: The Gnutella protocol specification v0.4. 99 [HJS+ 03] H ARVEY, N., M. J ONES, S. S AROIU, M. T HEIMER und A. W OLMAN: Skipnet: A scalable overlay network with practical locality properties. In: In Proceedings of USITS (Seattle, WA, March 2003), USENIX, 2003. [HKRZ02] H ILDRUM , K., J. D. K UBIATOWICZ, S. R AO und B. Y. Z HAO: Distributed Object Location in a Dynamic Network. In: Proceedings of the 14th Annual ACM Symposium on Parallel ALgorithms and Architectures (SPAA-02), Seiten 41–52, New York, August 10–13 2002. ACM Press. [JAB01] J OVANOVIC , M. A., F. S. A NNEXSTEIN und K. A. B ERMAN: Scalability Issues in large Peer-to-Peer Networks — a Case Study of Gnutella. Technischer Bericht, Univ. of Cincinnati, 2001. [JM04] J ELASITY, M ÁRK und A LBERTO M ONTRESOR: Epidemic-Style Proactive Aggregation in Large Overlay Networks. In: 24th International Conference on Distributed Computing Systems (ICDCS 2004), 24-26 March 2004, Hachioji, Tokyo, Japan, Seiten 102–109. IEEE Computer Society, 2004. [JMÖB04] J ELASITY, M ÁRK, A LBERTO M ONTRESOR und Ö ZALP BABAOGLU: A Modular Paradigm for Building Self-Organizing Peer-to-Peer Applications. In: S ERUGENDO , G IOVAN NA D I M ARZO , A NTHONY K ARAGEORGOS, O MER F. R ANA und F RANCO Z AMBONELLI (Herausgeber): Engineering Self-Organising Systems, Nature-Inspired Approaches to Software Engineering [revised and extended papers presented at the Engineering Self-Organising Applications Workshop, ESOA 2003, held at AAMAS 2003 in Melbourne, Australia, in July 2003 and selected invited papers from leading researchers in self-organisation], Band 2977 der Reihe Lecture Notes in Computer Science, Seiten 265–282. Springer, 2004. [JZK02] J OSEPH , A NTHONY D., B EN Y Z HAO und J OHN K UBIATOWICZ: Tapestry: An Infrastructure for Fault-tolerant Wide-area Location and Routing. Januar 15 2002. [KK03] K ARGER , DAVID R. und M. F RANS K AASHOEK: Koorde: A simple degree-optimal distributed hash table. Februar 10 2003. [KKPS00] K ARP, R ICHARD, E LIAS KOUTSOUPIAS, C HRISTOS H. PAPADIMITRIOU und S COTT S HENKER: Optimization problems in congestion control. In: 41st Annual Symposium on Foundations of Computer Science (FOCS’00), Seiten 66–74, 2000. [KLL+ 97] K ARGER , DAVID, E RIC L EHMAN, T OM L EIGHTON, M ATTHEW L EVINE, DANIEL L EWIN und R INA PANIGRAHY: Consistent Hashing and Random Trees: Distributed Caching Protocols for Relieving Hot Spots on the World Wide Web. In: Proceedings of the Twenty-Ninth Annual ACM Symposium on Theory of Computing, Seiten 654–663, El Paso, Texas, 4–6 Mai 1997. [KSSV00] K ARP, R ICHARD, C HRISTIAN S CHINDELHAUER, S COTT S HENKER und B ERTHOLD V ÖCKING: Randomized Rumor Spreading. In: 41st Annual Symposium on Foundations of Computer Science (FOCS’00), Seiten 565–574, 2000. [LSP95] L AMPORT, S HOSTAK und P EASE: The Byzantine Generals Problem. In: Advances in UltraDependable Distributed Systems, N. Suri, C. J. Walter, and M. M. Hugue (Eds.), IEEE Computer Society Press. 1995. [Min01] M INAR , N ELSON: Distributed Systems Topologies. http://www.openp2p.com/pub/a/p2p/2001/12/14/topologies_one.html, 2001. [MNR02] M ALKHI , DAHLIA, M ONI NAOR und DAVID R ATAJCZAK: Viceroy: a scalable and dynamic emulation of the butterfly. In: Proceedings of the twenty-first annual symposium on Principles of distributed computing, Seiten 183–192. ACM Press, 2002. 100 [NW03] NAOR , M ONI und U DI W IEDER: Novel architectures for P2P applications: the continuousdiscrete approach. In: Proceedings of the fifteenth annual ACM symposium on Parallel algorithms and architectures, Seiten 50–59. ACM Press, 2003. [Pit87] P ITTEL , B ORIS: On Spreading a Rumor. SIAM Journal on Applied Mathematics, 47(1):213– 223, Februar 1987. [PRR97] P LAXTON , C. G REG, R AJMOHAN R AJARAMAN und A NDREA R ICHA: Accessing Nearby Copies of Replicated Objects in a Distributed Environment. In: 9th Annual ACM Symposium on Parallel Algorithms and Architectures (SPAA ’97), Seiten 311–320, New York, Juni 1997. Association for Computing Machinery. [RFH+ 01] R ATNASAMY, S., P. F RANCIS, M. H ANDLEY, R. K ARP und S. S HENKER: A scalable content-addressable network. In: Computer Communication Review, Band 31, Seiten 161– 172. Dept. of Elec. Eng. and Comp. Sci., University of California, Berkeley, 2001. [RSA78] R IVEST, R., A. S HAMIR und L. A DLEMAN: On digital signatures and public key cryptosystems. Comm. A.C.M., 21:120–126, 1978. [Shi01] S HIRKY, C.: Listening to Napster. In Oram, A., (ed) Peer-to-Peer: Harnessing the Benefits of a Disruptive Technology, O’Reilly and Associates, Inc., Sebastopol, California., 2001. [SMK+ 01] S TOICA , I ON, ROBERT M ORRIS, DAVID K ARGER, F RANS K AASHOEK und H ARI BA LAKRISHNAN : Chord: A Scalable Peer-To-Peer Lookup Service for Internet Applications. In: G UERIN , ROCH (Herausgeber): Proceedings of the ACM SIGCOMM 2001 Conference (SIGCOMM-01), Band 31, 4 der Reihe Computer Communication Review, Seiten 149–160, New York, August 27–31 2001. ACM Press. [WK02] W EATHERSPOON , H AKIM und J OHN D. K UBIATOWICZ: Erasure Coding Vs. Replication: A Quantitative Comparison. Lecture Notes in Computer Science, 2429:328–??, 2002. [Zim92] Z IMMERMAN , P.: PGP user’s guide, 1992. 101