Bachelorarbeit Verteilte Datenhaltung einer Website durch ein browserbasiertes Peer-to-Peer-System Marten Schälicke 22.01.2013 Hochschule für Technik und Wirtschaft Berlin Fachbereich 4 – Wirtschaftswissenschaften II Internationale Medieninformatik Prüfungsvorsitzende: Erstgutachter: Zweitgutachter: Prof. Dr. Debora Weber-Wulff Prof. Dr. (USA) Ralph Lano Sascha Baumeister Dieses Dokument ist lizensiert als Inhalt der Creative Commons Namensnennung - Nicht-kommerziell - Weitergabe unter gleichen Bedingungen 3.0 UnportedLizenz. Um eine Kopie der Lizenz zu sehen, besuchen Sie http://creativecommons.org/licenses/by-nc-sa/3.0/. Inhaltsverzeichnis 1. Einleitung 6 1.1. Problem 6 1.2. Analyse 6 1.3. Anforderungen 7 1.4. Vorgehensweise 7 2. HTML5 2.1. JavaScript 8 9 2.2. WebRTC 10 2.3. Lokaler Speicher 11 2.3.1. Web Storage 11 2.3.2. IndexedDB 12 2.3.3. Web SQL Database 13 2.3.4. File System API 13 2.3.5. Cache Manifest 14 3. Prozess- / Programmiermodell 15 4. Programmiersprache 16 5. Netzwerk 17 5.1. Verbindungsstruktur 17 5.1.1. Soziale- / Zufalls-Netzwerke 18 5.1.2. Strukturierte Netzwerke 18 5.1.3. Hybride Netzwerke 21 5.1.4. Schlussfolgerung 21 5.1.5. Umsetzung 5.1.5.1. PeerID 22 23 3 5.1.5.2. Entfernungen zwischen Peers 5.1.5.3. Routing-Tabelle 5.1.5.4. Einwahl in das Netzwerk 5.1.5.5. Suche nach Knoten 5.1.5.6. Routing 5.1.5.7. Verbindungsaufbau zwischen Peers 5.2. Web-Service-Protokoll 24 24 28 29 29 31 32 5.2.1. REST 32 5.2.2. WSDL + SOAP 33 5.2.3. Zusammenfassung und Schlussfolgerung 33 5.2.4. Umsetzung Netzwerk-Protokoll 5.2.4.1. Network 5.2.4.1.1. nodeLookup 5.2.4.1.2. peerDescription 5.2.4.1.3. ringSegmentSearch 5.2.4.1.4. pcDescription 5.2.4.1.5. iceProcess 5.2.4.2. Public 5.2.4.2.1. valueStore 5.2.4.2.2 valueManage 5.2.4.2.3. valueLookup 5.2.4.3. Friendship 5.2.4.3.1. userAuthentication 5.2.4.3.2. humanAuthentication 5.2.4.3.3. changesRequest 5.2.4.3.4. changesPush 5.2.4.3.5. valueStore, valueGet & valueDelete 35 36 37 37 37 37 38 38 38 38 39 39 39 39 40 40 40 6. Datenhaltung 6.1. Datenhaltung öffentlicher Daten 41 42 6.1.1. Datenformat 42 6.1.2. Erzeugung von DatenIDs 42 6.1.3. Datenverteilung 43 6.1.4. Datenversionierung 44 6.1.5. Speichermanagement 46 6.1.6. Suche 46 6.1.7. Cache 48 6.2. Datenhaltung privater Daten 49 4 7. Freundschaften 50 7.1. Einwahl von anderem Rechner 50 7.2. Suche nach eingeloggten Freunden 51 8. Fazit und Ausblick 8.1. Sicherheit & Anonymität 52 53 8.1.1. Onion-Routing 53 8.1.2. Herkunft von Dokumenten 53 8.2. Steigerung Nutzerakzeptanz 54 8.2.1. Suchmaschinen 54 8.2.2. Import von Daten 54 8.3. weitere Verbesserungen 55 I Literaturverzeichnis 56 II Darstellungsverzeichnis 61 III Abkürzungsverzeichnis 62 IV Anhang 63 Anwendungsfalldiagramm 63 Klassendiagramm 64 Aktivitätsdiagramm „Einwahl“ 65 weitere Anhänge 66 Installation V Eidesstattliche Erklärung 66 67 5 1. Einleitung Websites werden von einer Personengruppe erstellt, von dieser verwaltet und von dieser gehostet. Auch der Inhalt wurde früher von dieser Gruppe geschaffen. Schließlich begann aber mit Foren und Ähnlichem die Entwicklung von Websites mit User-generated-Content, woraus Internetportale, wie YouTube, Flickr oder Wikipedia, entstanden, die nur von nutzergenerierten Inhalten leben. Eines ist jedoch geblieben: die Daten liegen auf einem zentralen Punkt. 1.1. Problem Gerade bei Open-Source Projekten, wie Wikipedia, führen die Kosten für die Server des öfteren zu Problemen. Auch ist ein einziger zentraler Punkt eine Schwachstelle im System – sei es durch Ausfälle der Hardware oder Ausnutzung von Macht durch Dritte, wie es in totalitären Staaten leider praktiziert wird. Zentralität lässt sich durch Redundanz lösen, Machtmissbrauch hingegen nur durch Umgehung der offiziellen Netzwerke. Technische Lösungen wie VPN-Verbindungen sind allerdings für den Laien oft schwer einzurichten. 1.2. Analyse Eine Lösung, die sowohl die Finanzierungsprobleme von kostenfrei erhältlichen Webseiten, als auch möglicherweise eine Zensur, beheben kann, sollte daher möglichst einfach für den Nutzer sein und darf kaum von seinem normalen Internetverhalten abweichen, um akzeptiert zu werden. Der Hauptansatz wäre die Verteilung der Daten auf viele Punkte, so dass ein Netzwerk aus Peers entsteht. Weiterhin sollte der Anwender keine weitere Software installieren müssen, um den Dienst auch von öffentlichen Geräten aus nutzen zu können. Ein Browser ist auf nahezu jedem Computer vorhanden, daher könnte dieser genutzt werden. Mit den Neu6 erungen im Zusammenhang mit HTML5 ist dies auch zum Greifen nah. Die Lösung ist also eine Website, deren Inhalte von den Nutzern generiert werden. Diese werden anschließend automatisch verteilt, gespeichert und somit für andere Nutzer auf Abruf erfahrbar macht. Weiterhin stellt die direkte Kommunikation zwischen Personen eine Hauptnutzungsart des Internet dar. Jene ist zwar weniger durch Zensur, aber umso mehr von Überwachung betroffen. Da hier ebenso das Hauptproblem zentrale Strukturen sind, ließe sich dies gleichermaßen durch ein Peer-to-Peer-Netzwerk entschärfen. 1.3. Anforderungen Somit ergeben sich folgende Anforderungen: • Die Bedienung muss leicht und intuitiv sein. • Das Nutzungserlebnis darf nicht zu sehr von dem normaler Webseiten abweichen. • Das Netzwerk muss browserbasiert sein. • Das Netzwerk muss rückwärtskompatibel sein und darf nicht nur die neueste Software unterstützen. • Die Speicherung und Suche von Daten muss möglich sein. • Eine Art soziales Netzwerk sollte integriert sein. • Eine Sicherung und Anonymisierung sollte möglich sein. • Die Teilnahme am Netzwerk darf nicht durch Spuren auf dem Computer erkenntlich sein. 1.4. Vorgehensweise Diese Arbeit beschreibt ein Netzwerk – genannt PeerWeb – , welches zur Lösung des Problems benutzt werden kann. Hierbei liegt der Fokus auf einer effizienten und einfachen Nutzung. Vorrangig geht es in der Arbeit um den öffentlichen Teil von PeerWeb, daher werden Sicherheitsaspekte nur so weit bedacht, dass ihre spätere Umsetzung keine Änderung des vorgestellten Konzepts ergeben. 7 2. HTML5 HTML steht für Hypertext Markup Language und ist die für das Internet, wie es der gemeine Nutzer versteht, benutzte Auszeichnungssprache. Die Inspiration zum Hypertext stammt bereits aus dem Jahre 1945. Vannevar Bush beschrieb in seinem Artikel „As We May Think“ (erschienen im „The Atlantic Monthly“) mit „Memex“ ein Gerät zum Speichern von Informationen, bei dem der Fokus auf Assoziationen lag 1. Die grundlegende Idee ist wohl viel älter. So referenzieren sich bereits die Kommentare des Talmuds 2 gegenseitig. Den Begriff „Hypertext“ verwendete Ted Nelson zum ersten Mal im Jahre 1965 3. In einem 1990 erschienenen Memo beschreibt Sir Tim Berners-Lee ein verteiltes Hypertext System für das CERN 4. Dieses Memo gilt als Erfindung des World Wide Web, da darin bereits von mehreren HypertextServern die Rede ist. So konnte auch zu Texten auf anderen Servern verwiesen werden. Der erste Vorschlag für eine Spezifikation von HTML als Internetstandard erschien im Juni 1993 5. 1994 wurde das W3C (World Wide Web Consortium) gegründet 6, welches am 14. Januar 1997 ihre erste Empfehlung veröffentlichte. Dabei handelte es sich um eine Spezifikation von HTML 3.2 7. 2004 wurde die „Web Hypertext Application Technology Working Group“ (WHATWG) als Reaktion auf die eingeschlagene Richtung des W3C gegründet 8. Die aktuelle Version von HTML bildet HTML5, wobei dieser Standard sowohl von dem W3C als auch von der WHATWG entwickelt wird. Die WHATWG möchte dabei jedoch keine neue Version der Auszeichnungssprache hervorrufen, sondern einen „lebendigen Standard“ schaffen 9. Das W3C behält seine Vorgehensweise bei und veröffentlicht regelmäßig 1 vgl. [BUSH-1945] 2 „‚Belehrung‘, ‚Unterweisung‘. Rabbinische Auslegung des Gesetzes [des Judentums d.V.] sowie die in zwei Rezensionen vorliegenden Textkorpora [...]“ [GOLZ-2000] Seite 91 3 vgl. [NELS-1965], [W3HI-2000] 4 vgl. [BERN-1990] 5 vgl. [BERN-CONN-1993] 6 vgl. [W3HI-2000] 7 vgl. [W3HT-1997] 8 vgl. [WHAT-2013] Abschnitt 1.6 „History“ 9 vgl. [WHAT-2013] 8 aktuelle Versionen seines Konzepts 10. Beide Entwürfe sind nahezu identisch 11. HTML5 beinhaltet nicht nur Neuerungen für das Markup, sondern auch JavaScript APIs. Außerdem werden neue CSS (Cascading Style Sheet) Funktionen mit HTML5 gleichgesetzt. So kamen unter anderem hinzu: • Elementtypen, wie header und footer, welche sich an gängigen Praktiken des Webdesign orientieren, • Formularfelder, wie eMail, Number, Time, • Markup für Audio und Video, sowie entsprechende APIs, • Webworker, welche Parallelisierung in JavaScript ermöglichen, • Möglichkeiten Daten im Browser zu speichern, • Geolocation, zur Abfrage des Standortes im Browser • und mit Web Real Time Communication Peer-to-Peer-Verbindungen. 12 2.1. JavaScript 1995 wurde JavaScript mit dem Netscape 2.0 erstmalig veröffentlicht. Damals galt es nur Formulare zu validieren und das Data Object Model (DOM) anzupassen. Die Sprache wurde jedoch ständig weiterentwickelt und wird heutzutage nicht mehr nur im Browser verwendet. Dabei sind Anwendungsfälle wie Datenvalidierung in PDF-Formularen noch nah an der ursprünglichen Idee. Mit Node.js gibt es mittlerweile auch Webserver, welche mit JavaScript programmiert werden. JavaScript ist eine prototyp-basierte, objektorientierte – aber klassenlose – Scriptsprache. Klassen können dennoch durch First-Class-Objekte verwendet werden. Generell kann diese Sprache stark angepasst werden. 10 vgl. [W3HT-2012] 11 Die WHATWG listet die Unterschiede in ihrem Entwurf, siehe [WHAT-2013] Abschnitt 1.2.1 „How do the WHATWG and W3C specifications differ?“ 12[MINT-2011] 9 2.2. WebRTC Web Real Time Communication verfolgt das Ziel, Latenzen in der Kommunikation zwischen Nutzern auf ein Minimum zu verringern, ohne den Einsatz von Browserplugins. Das Hauptaugenmerk bei der Entwicklung dieses Standards liegt auf der Durchführung von Videokonferenzen. So wurden zunächst Audio- und Videoverbindungen implementiert. Seit kurzem wird auch die angedachte Datenverbindung umgesetzt. Dar. 2.1 – Benötigte Verbindungen zum Aufbau einer RTCPeerConnection [DUTT-2012] Die RTCPeerConnection ist blau dargestellt. Peer A und B ermitteln ihre Erreichbarkeit von außen mittels der STUN-Server, anschließend tauschen sie sich diese Informationen über eine nicht weiter definierte Verbindung aus. Um eine Verbindung zwischen zwei Browsern 13 (RTCPeerConnection) aufzubauen, wird ein zusätzlicher Kanal benötigt, über den die Verbindungspartner Informationen austauschen können. Dieser kann beliebig realisiert werden. So könnten die Nachrichten einfach über einen Server geleitet werden, mit dem beide Browserclients verbunden sind. Aber auch ein bereits bestehendes Netzwerk kann genutzt werden, um weitere Verbindungen aufzubauen. Die über diesen Weg transportierten Daten sind: • Informationen zur lokalen Konfiguration • Informationen zur entfernten Konfiguration • Transport-/Verbindungsinformationen 13 zur Zeit werden nur Verbindungen zwischen zwei Peers unterstützt, Verbindungen zu mehreren sind möglich, erfordern jedoch jeweils eine zusätzliche RTCPeerConnection 10 Die Erreichbarkeit von Peers hinter NATs wird durch STUN (Session Traversal Utilities for NAT) bzw. TURN (Traversal Using Relays around NAT) Server ermöglicht. Diese werden im zur Verbindungsfindung genutzten ICE-Framework verwendet. Es können jedoch beim aktuellen Stand der Entwicklung mehrere STUN bzw. TURN Server über ein Konfigurationsobjekt übergeben werden 14, wodurch der Ausfall einzelner Server abgemildert wird. Noch befindet sich dieser Standard in der Phase einer Arbeitsfassung. So sollen die Statuscodes der Verbindung noch denen von Websockets angepasst werden. 2.3. Lokaler Speicher Durch die Entwicklung von HTML5 entstand auch die Möglichkeit, größere Mengen an Informationen im Browser persistent zu speichern. Vorher stand mit der Verwendung von Cookies nur ein sehr begrenztes Volumen zur Verfügung. Zu dem beeinflusste diese Technik die Geschwindigkeit von Seitenaufrufen negativ. Dank der folgenden Neuerungen kann je nach Browser, Anwendungs- und Speicherart die gesamte Festplattenkapazität verwendet werden 15. Dabei gilt jedoch bei allen Möglichkeiten die Same-Origin-Policy. So können nur Anwendungen von der gleichen Herkunft auf den selben Speicher zugreifen. Die Herkunft wird dabei über das Protokoll, die Domain und den Port beschrieben. 2.3.1. Web Storage Web Storage beschreibt eine einfache Key/Value basierte Speicherlösung im Browser. Sowohl Key als auch Value können dabei nur vom Typ String sein. Dabei gibt es die zwei Varianten localStorage und sessionStorage. Während sessionStorage nur für die Dauer einer Sitzung Gültigkeit besitzt, werden im localStorage Daten persistent gespeichert. Dabei können mehrere Tabs einer Domain auf den selben Speicher zugreifen. Die 14 15 vgl. [W3WR-2012] Abschnitt 5 „Peer-to-peer connections“ vgl. [GOOG-2012] 11 Defaultspeichergröße ist nicht in der Spezifikation festgelegt und variiert somit von Browser zu Browser. Firefox 16 und Opera 17 lassen 5MB zu, Internet Explorer hingegen 10MB 18 (jeweils für eine Quelle). Somit steht wesentlich mehr Speicher zur Verfügung als mit Cookies (4KB 19). Außerdem wird der Inhalt des Storage nicht an den Server geschickt. Web Storage wird von rund 91% der verwendeten Browser unterstützt 20. Die APIs der beiden Storagevarianten unterscheiden sich nicht. Da nur das Ablegen von Strings unterstützt wird, müssen Objekte vorher in JSON-Strings (JavaScript Object Notation) umgewandelt werden. Durch das Hinzufügen eines Handlers für das Storage-Event lassen sich zudem Änderungen im Speicher verfolgen 21. 2.3.2. IndexedDB IndexedDB speichert wie Web Storage Key-Value-Paare. Hierbei können jedoch auch Objekte als Wert abgelegt werden. Der Schlüssel kann dabei eine Eigenschaft des Objektes sein. Weiterhin können Indices erstellt werden. Zugriffe auf die Datenbank sind an Transaktionen gebunden, so können nicht mehrere Veränderungen oder Schreibvorgänge innerhalb eines Scopes gleichzeitig stattfinden. Sollte die Applikation mehrere solcher Transaktionen gleichzeitig starten, werden sie nacheinander ausgeführt. Lesevorgänge können sich jedoch überschneiden 22. Durch die Verwendung der Indices ist auch das Suchen in bestimmten Feldern möglich, ohne das über jedes Objekt iteriert werden muss. Weiterhin sind die meisten Aufrufe asynchron gehalten, so dass ein Callback übergeben werden muss. Es ist zwar eine synchrone API vorgesehen, bisher wird diese jedoch von keinem Browser unterstützt. Dadurch gibt es Überlegungen seitens des W3C, diese wieder fallen zu lassen 23. 16 17 18 19 20 21 22 23 vgl. [FIRE-2006] Zeile 67 vgl. [OPER-2012] vgl. [MSDN-2012] vgl. [IETF-2011] Abschnitt 6.1 vgl. [CANI-2013] vgl. [PILG-2011] vgl. [MBID-2012] Abschnitt „Definitions“ vgl. [W3ID-2012] Abschnitt „Features at Risk“ 12 Die maximale Größe der Datenbank ist nicht festgelegt und ist somit von Browser zu Browser unterschiedlich. Im Firefox gibt es keine Limitierung, jedoch wird der Nutzer ab 50MB um Erlaubnis gefragt 24. Unter Chrome wird der zur Verfügung stehende Speicher abhängig von der Festplattenbelegung errechnet 25. Obwohl IndexedDB vom W3C weiterverfolgt wird, liegt die Verfügbarkeit nur bei rund 46% bzw. 49%. Zudem müssen in einigen Browsern Präfixe verwendet werden 26. Über ein Polyfill kann jedoch IndexedDB in Browsern welche WebSQL unterstützen verwendet werden 27. 2.3.3. Web SQL Database Wie der Name schon erahnen lässt, sollte mit der Web SQL Database eine auf SQLite basierende relationale Datenbank in Browser integriert werden. Leider wurde die Entwicklung vom W3C abgebrochen 28, obwohl einige Browser 29 sie bereits implementiert hatten. In diesen Browsern ist die Datenbank jedoch noch nutzbar. 2.3.4. File System API Die File System API (oftmals auch File API, welche jedoch nur das Lesen von lokalen Daten beschreibt) stellt ein lokales Dateisystem zur Verfügung. In diesem können Anwendungen lesen, schreiben, Dateien und Ordner erzeugen, sowie durch sie navigieren. Es gibt zwei Arten des Speicherplatzes: einen temporären und einen persistenten. Auf beide kann asynchron oder synchron zugegriffen werden. Die synchrone API ist hierbei jedoch WebWorkern (JavaScript Threads) vorbehalten. Die asynchrone API verwendet Callbacks 30. 24 per Default, Wert ist vom Nutzer veränderbar; vgl. [MIDB-2013] Abschnitt „Storage Limit“ 25 für Websites; vgl. [GOOG-2012] Abschnitt „Temporary Storage“ 26 vgl. [CANI-2013] 27 vgl. [IDBS-2012] 28 vgl. [W3WD-2010] 29 u.a. Chrome, Safari, Opera; Verbreitung ca. 47%; vgl. [CANI-2013] 30 vgl. [W3FA-2012], [MFAP-2012] 13 Das virtuelle Laufwerk wird in einer Sandbox erzeugt. Dadurch hat die Anwendung keinen Zugriff auf normale Dateien, welche für Desktopapplikationen erreichbar sind. Ein Austausch von Dateien muss daher in Form eines „Imports“ bzw. „Exports“ erfolgen. Der Import sieht für den Nutzer wie ein klassischer Dateiupload aus. Der Export hingegen wie ein Download. Diese API hat die geringste Verbreitung. So ist sie nur in Chrome per Präfix verwendbar. Die Verbreitung liegt daher nur bei rund 30% 31. Für die Größe des Speichers gelten bei der temporären Version die gleichen Bedingungen wie für die IndexedDB. Für die Nutzung von persistentem Speicher muss der Nutzer explizit gefragt werden. Dabei ist die gewünschte Größe anzugeben. Diese kann jedoch später unter Zustimmung des Nutzers erhöht werden. Außerdem kann jederzeit abgefragt werden, wie viel freier Speicher noch zur Verfügung steht. 2.3.5. Cache Manifest Das Cache Manifest ermöglicht es Webseiten, die einmal von einem Browser geladen wurden, auch erreichbar zu sein, wenn gerade keine Internetverbindung besteht. Somit können Anwendungen erschaffen werden, welche zwar im Browser ausgeführt werden, aber dennoch keine ständige Verbindung in das Internet benötigen. Verfügbar ist dieses Feature in rund 66% der verwendeten Browserclients 32. Um das Cache Manifest zu nutzen, muss im öffnenden html-Tag der Seite auf das entsprechende Manifest verwiesen werden. Dieses muss zudem mit dem richtigen MIME-Typ übertragen werden. Die Datei selbst ist recht einfach aufgebaut. In der ersten Zeile muss „CACHE MANIFEST" stehen. Anschließend können drei Abschnitte (CACHE, NETWORK, FALLBACK) beschrieben werden, diese können mehrmals und in beliebiger Reihenfolge auftreten. 31 32 vgl. [CANI-2013] vgl. [CANI-2013] 14 Dateien unter CACHE werden explizit gespeichert. Unter NETWORK aufgeführte Einträge werden auf jeden Fall vom Server angefragt und mittels FALLBACK können Alternativen für nicht erreichbare Ressourcen angegeben werden. Soll der Browser eine gecachte Datei neu laden, so muss das Manifest verändert werden. Dazu reicht ein Kommentar, wie das Datum der letzten Änderung, in diesem. 33 3. Prozess- / Programmiermodell Neben der reinen Webanwendung – also einer Applikation, welche im Browser ausgeführt wird – gibt es die Möglichkeit zweier Prozesse. Dabei würde ein Prozess im Hintergrund laufen, welcher zum Beispiel die Kommunikation zu anderen Peers abwickelt. Dieser Prozess würde einen lokalen Server darstellen, der über eine Browseranwendung gesteuert wird. Dieses Modell verwendet das Peer-to-Peer-Netzwerk Freenet 34. Damit ist der Vorteil verbunden, dass auch Programmiersprachen wie Java oder C++ verwendet werden könnten, welche zu mehr Freiraum in der Umsetzung beitragen. Jedoch würde es sich dadurch um keine browserbasierte Anwendung mehr handeln. Zudem ergäben sich weitere Nachteile. Der Nutzer müsste so unter Umständen Software installieren – an fremden Computern ist dies oftmals keine Option. Die zusätzliche Software könnte zwar auch portabel konzipiert werden, dennoch bedeutete es Mehraufwand für den Nutzer. Eine Applikation die nur im Browser ausgeführt wird, stellt für den Benutzer das normale Nutzungsverhalten des Internets her. Er kann von jedem beliebigen mit dem Internet verbundenen Gerät die Seite öffnen und nutzen, somit auch an fremden Geräten. 33 34 vgl. [BIDE-2011] vgl. [FREE-2012] Abschnitt „Techincal Questions“ Frage 1 15 4. Programmiersprache Durch die Zielsetzung, ein browserbasiertes Peer-to-Peer-Netzwerk zu entwickeln, ist die Wahl der zu verwendenden Sprache bereits stark eingeschränkt. So bleiben nur Skriptsprachen, welche von der Mehrheit der zur Zeit benutzten Browser 35 unterstützt werden. Dar. 4.1 – Verteilung relevanter Browserplugins (auf Grundlage von [STAT-2010], [STAT-2011], [WEBH-2013]) Erhebungszeitraum Dezember 2010 bis Januar 2013 In dem Diagramm sind die Verteilungen relevanter Browserplugins und somit Skriptsprachen abgebildet. Auf Grund der geringen Verbreitung fallen Visual Basic Scripting sowie Java aus der Betrachtung. Zu dem ist Visual Basic Scripting nur auf Windows Systemen verfügbar. Flash stellt das einzige Plugin mit einer steigenden Verbreitung dar, außerdem bietet es die Möglichkeit Peer-to-Peer-Verbindungen aufzubauen 36. Jedoch handelt es sich dabei um ein proprietäres System, wodurch die Applikation auf Server von Adobe angewiesen ist. Allen aktuellen Versionen gemein ist jedoch die Scriptsprache JavaScript. Hierbei gibt es Unterschiede im Funktionsumfang. So ist die für PeerWeb verwendetbare RTCPeerConnection erst in den aktuellen Versionen von Chrome und Firefox vorhanden. Deren benötigter Teil „DataChannel“ wird hingegen zur Zeit in den nightly Builds von Firefox implementiert und soll im Januar 2013 in die reguläre Version integriert 35 36 restriktive Browserversionen inklusive Plugins bzw. Addons über NetStream, vgl. [ADOB-2010] 16 werden. In den Browser Google Chrome soll mit Version 25 eine experimentelle Version einfließen, ab Version 26 soll auch die Kommunikation zu Firefox möglich sein 37. Weiterhin besteht die Möglichkeit zwischen JavaScript und dem in Flash verwendeten ActionScript zu kommunizieren 38, wodurch die Möglichkeit besteht, eine fehlende WebRTC Unterstützung des Browsers durch Flash abzufangen. 5. Netzwerk Wie bereits in der Einleitung erwähnt, soll ein Peer-to-Peer-Netzwerk entstehen. Die Frage nach der konkreten Struktur ist jedoch nicht beantwortet. Weiterhin muss geklärt werden, wie die Teilnehmer des Netzwerks miteinander kommunizieren. 5.1. Verbindungsstruktur Je nach Zielsetzung eines Netzwerkes sind bestimmte Eigenschaften wichtig. Sollen allgemein Daten abgelegt und genutzt werden, ist ein geringer Durchmesser von entscheidender Bedeutung. Weiterhin ist auch der Grad des Netzwerkes wichtig. Grad steht hierbei für die Anzahl an Verbindungen, die ein Peer unterhält. In Freundschaftsnetzwerken wird die Verbindungsstruktur durch die Nutzer determiniert. Werden diese gewissenhaft benutzt, stellen sie aus sich heraus einen guten Schutz gegen Zensur dar. Hybride Netzwerke können Teilnehmer, die für eine Aufgabe besonders geeignet sind, herausstellen und somit die Effektivität erhöhen. Allen gemein ist, dass ein geringer Nachrichtenbedarf und eine hohe Robustheit gegen Ausfälle wichtig sind. 37 38 vgl. [DUTT-2012] Abschnitt „WebRTC Support Summary“ vgl. [ADFL-2013] 17 5.1.1. Soziale- / Zufalls-Netzwerke Soziale Netzwerke bieten den Vorteil, trotz durchschnittlich kleiner Grade nur einen geringen Durchmesser zu besitzen. Hierbei folgt die Verteilung der Grade jedoch der Pareto-Verteilung, was zur Folge hat, dass es einige Teilnehmer mit sehr vielen Verbindungen gibt. Dies spricht gegen das Gleichheitsprinzip von Peer-to-Peer-Netzwerken. Soll ein solches Netzwerk künstlich erschaffen werden, so ist die Anwendung mehrerer zufallsbedingter Operationen nötig. Bei besonders kleinen Durchmessern spricht man zu dem von Small-World-Netzwerken 39. Der Beitritt in ein solches Netzwerk ist besonders kostengünstig, da keine bestimmte Struktur erzeugt werden muss. Auch ist der Ausfall einzelner Peers sehr leicht zu beheben. Zu dem bleibt das Netzwerk bei einem Wegfall größerer Teilnehmermengen mit hoher Wahrscheinlichkeit zusammenhängend 40. Weiterhin kann ein solches Netzwerk recht anonym betrieben werden, da zur Teilnahme nur Informationen über die unmittelbaren Nachbarn benötigt werden. Jedoch gibt es entscheidende Nachteile in der Datenhaltung. So kann das Auffinden eines vorhandenen Datums nicht garantiert werden oder ist mit einem sehr hohen Nachrichtenaufwand verbunden 41. 5.1.2. Strukturierte Netzwerke In diesen Netzwerken wird durch das verwendete Peer-to-Peer-Protokoll eine gewisse Verbindungsstruktur festgelegt. Diese beruht auf eindeutigen IDs. Um diese eindeutig zu halten, müssen sie von bereits vorhandenen eindeutigen Merkmalen (wie einer IPv6-Adresse) abgeleitet sein oder aus einem Zufallsprozess mit ausreichend großem Ergebnisraum 42 stammen, um Kollisionen zu vermeiden. Somit lassen sich verteilte HashTabellen (Distributed Hash Tables – DHT) realisieren, wodurch ein Datum effektiv abgelegt und wieder aufgefunden werden kann. Jedoch ergeben sich zusätzliche Kosten für den Beitritt eines Peers in ein solches 39 40 41 42 vgl. [MAHL-SCHI-2007] S. 174 ff (Kapitel 9.1) vgl. [MAHL-SCHI-2007] S. 184 vgl. [MAHL-SCHI-2007] S. 57 ff (Kapitel 3.2) häufig 2m, wobei m 128 - 160 beträgt 18 Netzwerk, da Verbindungen zu Nachbarn nicht willkürlich aufgebaut werden können. Zu dem kann der Ausfall von Knoten kritisch werden, da durch die Struktur benötigte Verbindungen unter Umständen nicht mehr vorhanden sind und das Netzwerk auseinander brechen könnte. Die Effektivität solcher Netzwerke hängt stark von ihrer durch das Protokoll entstehenden Routing-Tabelle ab. Um den Nachrichtenaufwand zu minimieren und gleichzeitig die Robustheit gegenüber Ausfällen bzw. fehlerhaften Einträgen zu erhöhen, werden häufig Verbindungsinformationen zu vielen anderen Peers verwaltet. Dies hat jedoch den Nachteil, dass neben dem Speicherverbrauch auch der Wartungsaufwand für einen Teilnehmer steigt. Zu dem ist ab einem bestimmten Grad die Benutzung von dauerhaften Verbindungen zu Nachbarn nicht mehr möglich. Chord ordnet die beteiligten Knoten entlang eines Kreises mit zusätzlichen „Abkürzungen“ (Fingerzeiger genannt), wobei jedoch ein gerichteter Graph die Grundlage bildet. Somit wird ein Datum mit hoher Wahrscheinlichkeit nach O(log n) Schritten lokalisiert. Die Grade der Peers sind einheitlich, wobei die Nachbarschaft höchstwahrscheinlich nur eine logarithmische Größe aufweist. Das Beitreten eines Peers beinhaltet nicht nur das Einrichten der eigenen Fingerzeiger, sondern auch das Benachrichtigen der bereits vorhandenen Knoten, deren Fingerzeiger auf den neuen Peer zeigen könnten 43. Das auf dem Plaxton et al. 44 Routing beruhende System Pastry verwendet drei Nachbarschaftsklassen. Die erste Klasse (Routing-Tabelle) besteht aus nach ihren IDs in sogenannte Level geordneten Peers. Die Level beschreiben dabei die Länge des gemeinsamen Präfixes (gemeinsame Bitfolgen zu Beginn der ID) der eigenen ID und des Nachbarpeers. Die zweite Klasse (Leaf-Set) besteht aus, über die numerische Interpretation der ID ermittelten, l nächsten Peers. l beschreibt dabei eine programmweite Konstante. Der letzte Teil (Nachbarschaftsmenge) beinhaltet einfach latenznahe Peers. Bereits durch den zweiten Teil der Routing-Tabelle lässt sich ein Routing mit maximal O(n/l) Schritten realisieren. 45 43 44 45 vgl. [MAHL-SCHI-2007] S. 81 ff (Kapitel 5) Plaxton, Rajamaran und Richa vgl. [MAHL-SCHI-2007] S. 100 ff (Kapitel 6.2), sowie [ROWS-DRUS-2001] 19 Betrachtet man Kademlia näher so nutzt es ebenfalls das Plaxton Routing 46. Jedoch ist es einfacher aufgebaut als Pastry, da es nur eine RoutingTabelle besitzt. Für diese wird die k-Bucket-Struktur verwendet. k ist eine systemweite Konstante und in der Originalspezifikation 20. Da die IDs in Kademlia 160 bits lang sind, beträgt die maximale Größe der RoutingTabelle 160k, wobei Buckets nahe der eigenen ID zunehmend nicht voll besetzt werden können. 47 Sowohl Pastry als auch Kademlia können auf gerichtete wie ungerichtete Graphen aufbauen. Ebenso können beide, obwohl sie aus relativ zufälligen Verbindungen bestehen (mit zunehmender Entfernung der Knoten 48 können Teilnehmer ihre Verbindungspartner aus einer größer werdenden Menge wählen), mit sich aus der sozialen Komponente ergebenen Verbindungen ohne größere Modifikationen 49 umgehen. Kademlia beruht auf einem iterativem Routing 50, so dass Nachrichten nicht weitergereicht werden. Dem Anfragenden werden lediglich Verbindungsinformationen des nächsten zu kontaktierenden Peers mitgeteilt. Dies schont zwar die Bandbreite, da große Nachrichten mit Daten nur an den Zielknoten übertragen werden, führt jedoch zu erhöhtem Nachrichtenaufkommen. Pastry hingegen verwendet rekursives Routing 51. In beiden Fällen ist die Anzahl an Verbindungen verglichen mit Chord relativ hoch 52. 46 vgl. [MAHL-SCHI-2007] S. 247 (Kapitel 13.4) 47 vgl. [MAYM-MAZI-2002] 48 basierend auf den IDs der Knoten; Entfernungen sind in beiden Fällen symmetrisch 49 nur wenn für ein bestimmtes Level bzw. Bucket dadurch mehr Verbindungen als vorgesehen nötig werden 50 in [MAYM-MAZI-2002] Kapitel 2.3 wird dies fälschlich rekursiv genannt; vgl. [CROS-WaLL-2007] Kapitel 4 bzw. [XLAT-2010] Kapitel „Node Lookup“ 51 vgl. [MAHL-SCHI-2007] S. 110 f bzw. [CROS-WaLL-2007] Kapitel 4 52 vgl. [MAHL-SCHI-2007] S. 113 20 5.1.3. Hybride Netzwerke Die Netzwerke Skype, FastTrack und der Gnutella-Nachfolger Gnutella-2 sind zwar Peer-to-Peer-Netzwerke, statten aber im Einsatz einige Peers mit zusätzlichen Aufgaben aus. Für die Bestimmung dieser Peers werden bestimmte Eigenschaften wie Bandbreite und Verfügbarkeit herangezogen. FastTrack und Skype sind proprietäre Software, daher können sie nicht als Vorlage verwendet werden. Gnutella-2 verbessert durch die hybride Struktur aus Leafs (normale Peers) und Hubs (Superpeers – Peers mit erweiterten Aufgaben) die Effizienz und Zuverlässigkeit der Suche, indem Indexdaten auf den Superpeers gespeichert werden. Allerdings stellt das Netzwerk so kein reines Peer-to-Peer-System mehr dar 53. 5.1.4. Schlussfolgerung Für PeerWeb erscheinen sowohl Freundschafts-/Zufallsnetzwerke als auch verteile Hash-Tabellen als Grundlage dienen zu können. Beide sind jedoch nicht ohne Verluste von Effizienz im Suchen nach Daten oder von Privatsphäre vereinbar. Durch die recht offene Wahl der Verbindungspartner von Pastry und Kademlia lassen sich in diesen Netzwerken gut Verbindungen zwischen Peers, welche auf Freundschaften basieren integrieren. Das in Kademlia vorgesehene iterative Routing kann auf Grund der – durch den Verbindungsaufbau – hohen Kosten nicht sinnvoll umgesetzt werden. Ein weiterer Grund gegen ein iteratives Routing ist die Abwärtskompatibilität, durch die nicht gewährleistet werden kann, dass sich zwei Teilnehmer verbinden können. Die Abwärtskompatibilität, sowie die Tatsache, dass ein zusätzlicher Kanal benötigt wird, um zwischen zwei Browsern per RTCPeerConnection eine direkte Verbindung aufzubauen, bedingt die Verwendung einer hybriden Netzwerkstruktur. Somit müssen Peers integriert werden, welche auf klassische Weise (AJAX mit Polling, Websockets) von Browsern kontaktiert werden können. 53 vgl. [MAHL-SCHI-2007] Kapitel 13 21 5.1.5. Umsetzung Da Pastry durch das Leaf-Set bereits mit wenigen Verbindungen ein Routing ermöglicht, dient es als Grundlage für PeerWeb. Weiterhin wird auf eine hybride Netzwerkstruktur aus Peers und Superpeers gesetzt. Dabei bilden Knoten, welche in Browsern laufen, die Menge der Peers. Superpeers können nicht aus dieser Menge generiert werden. Grund hierfür ist die für die Einwahl mangelhafte Erreichbarkeit 54. Um dieses Hindernis zu umgehen, müssen Knoten erreichbar sein, welche wie klassische Server bereitstehen und von anderen Peers jederzeit kontaktiert werden können. Da das Netzwerk jedoch weiterhin den Ansprüchen eines Peer-to-Peer-Netzes gerecht werden soll, darf weder die Anzahl dieser Superpeers willkürlich festgelegt sein, noch dürfen sie von einer einzelnen Gruppe bereitgestellt werden. Weiterhin darf diesen Knoten keine weitere zusätzliche Aufgabe zu Teil werden, als die Einwahl in das Netzwerk zu ermöglichen. Der Betrieb nach der Einwahl darf nicht von ihnen abhängig sein, kann durch sie aber erleichtert werden (z.B. in Form einer Steigerung der Effizienz bei Suchanfragen). Die Wahl der Programmiersprache für Superpeers ist offen, da keine weiteren Anforderungen gestellt werden. Da es ohne weiteres möglich sein soll, einen solchen Knoten aufzusetzen, sollten die im Internet besonders stark verbreiteten Sprachen PHP, Ruby und Python 55 favorisiert werden. Weiterhin folgt das Netzwerkdesign den Grundlagen von verteilten Hash-Tabellen. Somit sind Teilnehmer über eine eindeutige Kennung adressierbar, über welche auch Inhalte verteilt werden. Diese Kennziffer entspricht nur dem Knoten und ist nicht an Nutzer des Netzwerkes gebunden. Durch die Verwendung von unterschiedlichen Technologien im Bereich der p2p-Verbindungen 56, welche nicht miteinander kompatibel sind, ergeben sich besondere Umstände. Diese werden in den Abschnitten 5.1.5.3 Routing-Tabelle und 5.1.5.6 Routing behandelt. Auch musste eine geson- 54 siehe Abschnitt 5.1.4 55 eine Statistik zur Verteilung kann nicht angeführt werden, sie kann jedoch von [UDEM-2012] abgeleitet werden 56 JavaScripts RTCPeerConnection und deren Fallback auf Flashs NetStream 22 derte Nachricht eingeführt werden, welche in 5.2.4.1.3 vorgestellt wird. Da die Verwendung der NetStreams aus Flash nur den Fallback darstellt, wird auf diese nicht weiter eingegangen. 5.1.5.1. PeerID Um Knoten des Netzwerks eindeutig erkennbar zu machen wird eine 160 bit lange Kennung (Identifier – ID) verwendet. Diese kann nicht von der IP-Adresse der Teilnehmer abgeleitet werden. Dies folgt aus der Aufteilung des Internets. Die Wahrscheinlichkeit, dass zwei Teilnehmer über denselben Internetzugang das Netzwerk benutzen, ist hoch. Da sie somit nach außen die gleiche IP-Adresse besitzen, würde es bei einer Generierung der ID über diese zu einer Kollision kommen. Aber auch bei Verwendung der IP-Adresse, welche die Knoten von ihrem jeweiligen LAN erhalten, kann es zu Kollisionen kommen. Denn diese IP-Adresse ist zwar in dem jeweiligen Netzwerk einmalig, jedoch nicht weltweit. Eine Erzeugung der Kennung über die Kombination von externer und interner IP-Adresse würde dieses Problem beheben. Dies wäre jedoch mit zusätzlichem Aufwand für die Datenhaltung verbunden, da sich die zugewiesenen IP-Adressen ändern können. Somit würde der Peer eine neue ID und somit einen anderen Zuständigkeitsbereich erhalten. Dieses Problem wird durch die einmalige Generierung der ID und der Beibehaltung dieser gelöst. Dafür kann aber nicht die IP-Adresse herangezogen werden, da diese zu einem anderen Zeitpunkt einem anderen Teilnehmer gehört, welcher somit die gleiche Kennung erzeugen würde. Eine zentrale Generierung und Zuweisung der ID würde zwar auf der einen Seite Kollisionen vermeiden können, auf der anderen Seite allerdings eine angreifbare – weil zentrale – Stelle darstellen. Wird jedoch die Größe der Kennung weit genug gewählt, kann sie – bei einer vernachlässigbar kleinen Wahrscheinlichkeit von Kollisionen – zufällig erzeugt werden. So ergeben sich bei einer Weite von 160 bit 1,46*1046 Kombinationsmöglichkeiten. IDs werden als Zahlen zur Basis |B| = 2b interpretiert. In PeerWeb gilt – wie in Pastry – hierfür: b = 4 57. 57 vgl. [ROWS-DRUS-2001] Kapitel 2 23 Um die Güte der Zufallszahlen zu steigern, wird diese über den Dienst random.org generiert. Dieser stellt echte Zufallszahlen zur Verfügung 58. Somit wird die Wahrscheinlichkeit einer Gleichverteilung der IDs gesteigert. Sollte der Dienst nicht verfügbar sein, werden die IDs von den Peers selbst erzeugt. 5.1.5.2. Entfernungen zwischen Peers Die Entfernung zwischen zwei Knoten wird nicht wie in Kademlia über die XOR-Metrik ihrer Kennungen bestimmt 59. Dies begründet sich durch die geringe Anzahl an Verbindungen, mit denen PeerWeb bereits funktionsfähig sein soll. Würde der erste Teil der Routing-Tabelle durch eine auf XOR basierende Entfernung aufgebaut werden, können sich in diesem Teil separate Gruppen bilden. Auch der zweite Teil der RoutingTabelle kann eine Abspaltung dieser Gruppen nicht verhindern. Auch wäre, wenn der Zusammenhang des Netzwerks gewahrt bleiben könnte, das Routing nicht optimal 60. Entfernungen werden daher numerisch bestimmt, wobei dadurch auch auf die Länge ihres gemeinsamen Präfixes geachtet wird. Für die Länge des Präfixes gilt auch der Begriff Level. Peers die in Level 0 miteinander verbunden sind, haben kein gemeinsames Präfix; Peers in Level 1 haben ein Präfix der Länge 1; usw. 61. 5.1.5.3. Routing-Tabelle Die Routing-Tabelle eines Peers besteht aus vier Teilen und basiert in ihren Grundannahmen auf den Nachbarschaftsklassen von Pastry. Die Mindestgröße beträgt dabei 2,5l Einträge, wobei jeder Eintrag für eine aktive Verbindung steht. l ist eine Konstante die zur Skalierung des Netzwerkes dient. Somit ist eine Anpassung an kleinere Umgebungen, in denen ein kleinerer Namensraum verwendet werden kann, einfach realisierbar. Der Wert von l wird durch eine gerade Integerzahl bestimmt. In der hier vorgestellten Umsetzung wurde für l der Wert 6 gewählt. Grund 58 erzeugt mittels atmosphärischen Rauschens 59 vgl. [MAYM-MAZI-2002] Kapitel 2.1 60 auf Grund der in Teil 1 entstehenden Gruppen, aus denen eine Nachricht nur mit zusätzlichem Aufwand entkäme 61 vgl. [MAHL-SCHI-2007] Kapitel 6.2.1 bzw. [ROWS-DRUS-2001] Kapitel 2.1 24 hierfür ist die überschaubare Mindestanzahl von 15 Verbindungen 62. Diese ist jedoch bereits groß genug, um einzelne Knotenausfälle zu verkraften. Nach oben ist die Anzahl offen und wird von dem Nutzer durch die Anzahl seiner Freunde und seinen Einstellungen bestimmt. Hierbei stehen die Auswahlmöglichkeiten „Verbindungen zu meinen (online) Freunden und x“ und „maximal x zusätzliche Verbindungen (inklusive Freunde)“ zur Verfügung. Bis auf den dritten Teil der Routing-Tabelle, der mit Superpeers besetzt wird, werden Verbindungen zu Peers in der Tabelle unterhalten. Dar. 5.1 – Netzwerkstruktur in PeerWeb Bei diesem Beispielnetzwerk mit l = 4 und 50 Teilnehmern ist die doppelte Ringstruktur gut erkennbar. Blau sind Verbindungen aus dem ersten Teil der Routing-Tabelle, Verbindungen aus dem dritten Teil sind Grün dargestellt und Verbindungen, die auf Freundschaften beruhen Orange. Durchgehende Linien stehen für RTCPeerConnections, gestrichelte für Verbindungen auf Flashbasis und Punkt-Strich-Linien für Websocket-Verbindungen. Aus Gründen der Übersichtlichkeit wurde auf Darstellung des zweiten Teils der Routing-Tabelle sowie weiterer Freundschaften verzichtet. 62 für Peers, die eine Möglichkeit für p2p-Verbindundungen besitzen; Peers mit beiden Verbindungsarten weisen bis zu 21 Verbindungen auf 25 Den ersten und wichtigsten Teil bilden die l nächsten Nachbarn des Knotens. Wobei nach links und rechts jeweils l/2 Verbindungen aufgebaut werden. Somit bildet dieser Teil einen Ring, durch den bereits der Zusammenhang des Netzes (bei mindestens 2 korrekten Einträgen aller Teilnehmer) garantiert werden kann. Sind alle l Einträge korrekt, beträgt der Durchmesser O(n/l). Dieser Teil entspricht dem Leaf-Set von Pastry 63 und wird in PeerWeb ebenso genannt und mit L abgekürzt. Die Verwendung unterschiedlicher p2p-Verbindungstechniken hat auf das Leaf-Set besondere Auswirkungen. So kann sich ein Knoten unter Umständen nicht zu einem anderen verbinden, obwohl er es auf Grund der Nähebeziehung müsste. Da das Leaf-Set dennoch voll besetzt werden soll, wird es mit den nächsten Peers gefüllt, zu denen eine Verbindung möglich ist. Es entstehen daher zwei parallele Ringe, welche sich an einigen Knoten berühren. In Darstellung 5.1 ist dies gut erkennbar. Der zweite Teil der Routing-Tabelle dient der Erhöhung des Zusammenhalts und so der Verringerung des Durchmessers. Die Gesamtmenge an Einträgen ist für diesen Teil wiederum l. Zunächst werden Verbindungen zu Peers mit einem gemeinsamen Präfix aufgebaut. Längere Präfixe werden dafür bevorzugt. Die Verbindungen dürfen hierbei nicht schon in einem anderen Teil der Routing-Tabelle beinhaltet sein. Weiterhin wird pro Level nur eine Verbindung aufgebaut. Können keine l Nachbarn bestimmt werden, fällt die Wahl auf zufällig ausgewählte Knoten aus dem Level 0. Dieser Teil entspräche der Routing-Tabelle von Pastry. In dieser Arbeit wird R für diesen Teil verwand. Um die Effizienz des Netzwerkes zu erhöhen, werden im dritten Teil der Routing-Tabelle nur Superpeers geführt. Die angestrebte Anzahl an Verbindungen ist hierbei l/2, wodurch die eingangs erwähnte Mindestzahl an Verbindungen erreicht ist. Die Einträge werden wiederum durch Nähebeziehungen bestimmt. Hierbei werden zwei Verbindungen zu den nächsten erreichbaren Superpeers zwingend aufgebaut. Die weiteren Verbindungen werden wie in dem zweiten Teil nach den Leveln vergeben. Hier wird jedoch mit Level 0 begonnen. Die Abkürzung für diesen Teil ist S. Die Freundschaftsbeziehungen des jeweils angemeldeten Nutzers stellen den vierten Teil der Verbindungsstruktur dar. Da die Wahl der Freunde nicht von PeerWeb beeinflusst werden kann, können keine wei63 vgl. [ROWS-DRUS-2001] Kapitel 2.1 26 Dar. 5.2 – Durchschnittliche Freundesanzahl bei Facebook 2010 (auf Grundlage von [TNSF-2010]) Norwegen führt die Liste mit 216 Freunden an, gefolgt von Polen mit 201 und Griechenland mit 198 Freunden. Großbritannien (164) und Frankreich (95) sind ebenso deutlich vernetzter als Deutschland mit einem Durchschnitt von 75 Freunden. tere Angaben gemacht werden. Ein durchschnittlicher Nutzer sozialer Netzwerke in Deutschland hatte im Dezember 2010 75 Freunde. Wird die Option „maximal x zusätzliche Verbindungen (inklusive Freunde)“ genutzt, werden Verbindungen zu Freunden bevorzugt. Freundschaftsbeziehungen werden in der Routing-Tabelle berücksichtigt, um direkte Verbindungen und somit erhöhte Sicherheit für sensible Daten zu ermöglichen. Außerdem erhöhen diese Verbindungen den Zusammenhang des Netzwerkes und verringern dessen Durchmesser. Obwohl dieser Teil für das Routing mit in R aufgenommen wird, erhält er mit F eine eigene Abkürzung. Lässt der Nutzer mehr Verbindungen zu, werden diese in den zweiten Teil der Routing-Tabelle einsortiert. Dieser wird dann wie die RoutingTabelle von Pastry aufgebaut. Somit werden für jedes Level bis zu 2b -1 Einträge gesucht. Superpeers besitzen hingegen nur eine zweiteilige Routing-Tabelle. Einen Teil für Verbindungen zu Peers, den anderen Teil für Verbindungen zu Superpeers. Der Betreiber eines solchen Knotens kann über die Konfiguration die maximale Anzahl an Einträgen festlegen. Dabei sollten we27 PeerID: 1114C5 Leaf-Set L E89E9E FF8CF8 18804C 33E132 Teil 2 R 53A6F1 7A100C A580CE B9C0C1 Superpeers S 0D4E95 2C68E5 Freunde F 4A9C2C 659D7A C0DF4D D0D7D5 Dar. 5.3 – Routing-Tabelle für Peer 1114C5 aus dem Beispielnetzwerk (Dar. 5.1) sentlich mehr Verbindungen für Peers als zu Superpeers zur Verfügung stehen. Der Teil für Superpeers wird dabei von dem Knoten selbstständig aufgebaut und folgt der Routing-Tabelle von Pastry. 5.1.5.4. Einwahl in das Netzwerk Nach dem Laden von PeerWeb werden zunächst die nötigen Eigenschaften des Browsers geprüft. Ist die Software in dem vom Nutzer verwendeten Browser lauffähig, wird die ID des Knotens geladen bzw. erzeugt. Gleichzeitig werden Standardwerte geladen, diese umfassen Superpeers, die zur Einwahl verwendet werden können und eine Reihe von STUN bzw. TURN Servern. Nachdem der Peer so initialisiert wurde, werden Verbindungen zu allen hinterlegten Superpeers aufgebaut. Dabei muss mindestens ein Superpeer erreichbar sein, welcher nun für das folgende Bootstrapping genutzt wird. Sind mehrere Superpeers erreichbar, werden diese entsprechend der Routing-Tabelle bzw. der Einstellungen des Knotens gewählt. 28 Nachdem ein Superpeer für den Bootstrapping-Prozess ausgewählt wurde, werden Verbindungen zur unmittelbaren Nachbarschaft aufgebaut, das heißt, der erste Teil der Routing-Tabelle gefüllt. Hierzu wird der Suchalgorithmus für Knoten mit der eigenen ID als Parameter verwendet. Ist der erste bis dritte Teil der Routing-Tabelle aufgebaut, schließt sich die Suche nach Freunden an. Zuletzt werden mögliche zusätzliche Verbindungen aufgebaut. Dies geschieht durch Suchanfragen nach zufälligen PeerIDs. Diese müssen jedoch in den jeweils zu füllenden Bereich liegen. Superpeers bauen bei der Einwahl nur Verbindungen zu anderen Superpeers aktiv auf. 5.1.5.5. Suche nach Knoten Durch die Verwendung von Pastry als Netzwerkstruktur ist die Suche nach Knoten einfach zu implementieren. Hierfür ist es ausreichend eine entsprechende Nachricht zu verschicken. Diese hat die gewünschte ID als Ziel. Bereits der anfragende Peer füllt den Body der nodeLookup-Nachricht mit dem ihm bekannten l nächsten Peers. Diese Liste wird von jedem weiterleitenden Knoten aktualisiert, indem dieser wiederum die ihm bekannten nächsten Peers einordnet. Der endgültige Empfänger der Liste tut dies ebenfalls und schickt eine Antwort zurück. Für diese Suche gilt ebenso das in 5.1.5.6 vorgestellte Routing mit der Bedingung zur Findung des finalen Knotens. 5.1.5.6. Routing Das Routing funktioniert nach dem Prinzip, nach dem grundlegend alle verteilten Hash-Tabellen arbeiten. So werden Anfragen an den Peer aus der Routing-Tabelle weitergeleitet dessen ID am nächsten zu der ID des angefragten Datums ist. Dies geschieht bis ein Peer erreicht ist, der keinen näheren Eintrag in seiner Routing-Tabelle hat. Somit weiß dieser, dass er für das Datum verantwortlich wäre. 29 Zur Steigerung der Geschwindigkeit und Verringerung des Nachrichtenaufkommens, werden Nachrichten (Anfragen, wie Antworten) vom Sender, an den nächsten verbundenen Superpeer geschickt. Ausgenommen hiervon sind Peers, die bereits eine Verbindung zu dem Empfänger besitzen. Diese versenden die Nachricht direkt. Für den anschließenden Routingalgorithmus gibt es nur das Leaf-Set (L) und den zweiten Teil (R) der Routing-Tabelle, welcher hierfür durch die Einträge aus den weiteren Teilen ergänzt wird. Der Routingalgorithmus als solches ist an den von Pastry angelehnt. Er wurde jedoch für den Fall, dass die ID nicht vom Leaf-Set abgedeckt wird, angepasst. Durch die geringere Größe der Routing-Tabelle von PeerWeb gegenüber Pastry ist die Wahrscheinlichkeit einen leeren Eintrag zu treffen, sehr hoch. Daher verwendet PeerWeb direkt die als „seltener Fall“ angegebene Methode. Suche( id ){ if( L-l/2 <= id <= Ll/2 ){ //die gesuchte id wird vom Leaf-Set abgedeckt leite an Peer p’ weiter, für den |id - p’.id| minimal } else{ //Wähle aus allen Verbindungen level = präfixlänge( PeerID, id ); leite an Peer (aus L oder R) weiter, für den präfixlänge( PeerID, id ) >= level && |p’.id - id| < |p.id - id| } } Dar. 5.4 – Routingalgorithmus in Pseudocode (nach [MAHL-SCHI-2007] Seite 105, [ROWS-DRUS-2001] Kapitel 2.2) L-l/2 bzw. Ll/2 bezeichnen die IDs der beiden äußeren Peers des ersten Teils der Routing-Tabelle L. Durch die verschiedenen Technologien im Bereich der Verbindungen zwischen Peers 64, kann eine Nachricht fälschlich zu einem nahen, aber nicht dem nächsten gesuchten, Knoten weitergereicht werden. Dies kann jedoch nur geschehen, wenn die Nachricht nicht über den nächsten Superpeer zu diesem Knoten gelangt. Um ein solches Fehlverhalten zu erkennen, existieren zwei Möglichkeiten. Sind Superpeers vorhanden, reicht es aus, wenn der vermeintlich letzte Peer, die Anfrage zusätzlich an seine zwei nächsten Superpeers weiterleitet. Da diese alle vorhande- 64 siehe Abschnitt 5.1.5.3 bzw. 5.1.5.6 30 nen Knoten in der Umgebung kennen, kennt einer von ihnen auch einen näheren, sofern er im Netzwerk anwesend ist. Somit kann der Superpeer die Nachricht an den wirklichen Empfänger schicken. Sind hingegen keine Superpeers vorhanden, müssen wenigstens Teilnehmer anwesend sein, die beide Verbindungstechniken beherrschen. Um in diesem Fall den näheren Peer zu finden, wird lediglich das LeafSet und eine ringSegementSearch-Nachricht verwendet. Mittels dieser wird die eigentliche Anfrage verpackt und in Richtung des nächsten bekannten Knotens, welcher beide Verbindungsarten unterstützt, geschickt. Ist ein solcher nicht bekannt, wird die Nachricht entsprechend der gesuchten ID nach links oder rechts gereicht. Wurde ein entsprechender Peer erreicht, schickt er die Nachricht in die Richtung zurück, aus der sie kam, verwendet dabei jedoch die andere Verbindungsart. Wird auf dem so erreichten Ringabschnitt ein näherer Knoten gefunden, weiß dieser, dass er antworten muss. Andernfalls gelangt die Nachricht zurück zum Sender der ringSegmentSearch-Nachricht. Somit ist dieser der nächste anwesende Peer. Eine Anfrage muss jedoch nicht bis zu diesem Ende geleitet werden, da wie im Kapitel 6.1.3 beschrieben, mehrere Knoten dasselbe Dokument speichern. Selbst diese Teilnehmer müssen nicht zwangsläufig erreicht werden, da Peers auch Anfragen mittels ihres Caches beantworten können. Es muss bedacht werden, dass ein Peer beim Routing keine Weiterleitung einer Nachricht an den Knoten vornimmt, von dem er die Nachricht empfangen hat. 5.1.5.7. Verbindungsaufbau zwischen Peers Der Verbindungsaufbau zwischen Peers und Superpeers kann aus technischen Gründen nur auf Initiative des Peers erfolgen, benötigt jedoch kein weiteres Zutun von außen. Zwischen zwei Peers müssen bei Verwendung einer RTCPeerConnection von beiden Seiten aus Nachrichten ausgetauscht werden. Ein Verbindungsaufbau ist somit nur über aktives Handeln auf beiden Seiten und einem zusätzlichen Kanal möglich. 31 Dar. 5.5 – Nachrichtenfluss bei Verbindungsaufbau zwischen Peers Dargestellt sind hierbei nur die Nachrichten von PeerWeb, für eine umfangreichere Darstellung siehe [W3WR2012]. 5.2. Web-Service-Protokoll Neben der Festlegung des p2p-Protokoll und der somit entstehenden Netzwerkstruktur, muss auch geklärt werden, wie die Knoten miteinander kommunizieren. 5.2.1. REST Representational State Transfer (REST) 65 erläutert ein Programmierparadigma zur Erstellung von Web-Services und integriert sich vollständig in HTTP. Über die URL wird hierbei nicht der Web-Service als solches adressiert, sondern eine Ressource. Die durch HTTP verwendeten Request-Methoden werden interpretiert und auf die Ressource angewendet. Daraus folgt, dass für jede Ressource eine eindeutige URL bereitge- 65 vgl. [FIEL-2000] 32 stellt werden muss, was als Nachteil angesehen werden kann. REST ist zustandslos, weshalb sämtliche für einen Aufruf benötigte Informationen mit der Anfrage verschickt werden müssen. Weiterhin ist REST plattform- und sprachunabhängig. So kann jederzeit die Kommunikation zu jedem Teilnehmer erfolgen. Es muss jedoch ein gewisses Vorwissen über die erreichbaren Ressourcen bestehen. 66 Die Fehlerbehandlung erfolgt über Statuscodes in der Antwort. 5.2.2. WSDL + SOAP Zur Beschreibung der Schnittstelle eines Webservice kann die Web Service Description Language (WSDL) 67 verwendet werden. Diese baut auf XML auf und muss vor der eigentlichen Verwendung des Webservice abgerufen werden. Aus ihr kann auf Clientseite automatisch ein Stellvertreterobjekt generiert werden. Es werden im Fehlerfall die vom Webservice geworfenen Errors zum Client übertragen und dort wiederum erzeugt. Somit wird kaum zusätzlicher Aufwand zur Implementierung auf der Clientseite benötigt. 5.2.3. Zusammenfassung und Schlussfolgerung In dem entstehenden Netzwerk ist die Wahrscheinlichkeit gering, dass der Sender einer Nachricht direkt mit dem Empfänger verbunden ist. Weiterhin kann ein rein auf den PeerIDs beruhendes Routing versagen, werden nicht mit den Paketen Informationen mitgeschickt, wenn ein Paket über einen bestimmten Peer geleitet werden soll. Somit muss das genutzte Protokoll die Möglichkeit bieten, zusätzliche Informationen für das Routing zu übertragen. SOAP bietet die Möglichkeit den Header mit eben solchen Informationen zu füllen, wodurch es als Grundlage für das verwendete Protokoll in Frage kommt. Zudem kann REST durch die Verwendung von für jede Ressource eindeutigen URLs nicht umgesetzt 66 67 vgl. [BAYE-2002] vgl. [WSDL-2001] 33 werden, da die Verbindungen zwischen den Peers nicht den Aufruf verschiedener URL erlauben. Somit sind auch mehrere Service-URLs für die verschiedenen Aufgabenbereiche 68 des Netzwerkes nicht möglich. Die Verwendung von WSDL-Dateien zur Beschreibung der Schnittstelle von Knoten ist nicht möglich, da grundsätzlich bereits die Notwendigkeit des Abrufes dieser Datei besteht. Eine Verbindung zu einem Teilnehmer kann jedoch nur durch aktives Handeln auf beiden Seiten aufgebaut werden 69. Da somit bereits eine Kommunikation mit dem Verbindungspartner über einen weiteren Kanal (vermittelnder dritter Peer) vorhanden sein muss, würden bereits Daten der WSDL zum Abruf eben dieser benötigt. Da jedoch ein Peer-to-Peer-Netzwerk – also ein Netzwerk aus gleichberechtigten Teilnehmern – entstehen soll, ist davon auszugehen, dass Peer B die gleiche Schnittstelle zur Verfügung stellt wie Peer A. Ausnahmen hiervon können nur bei Versionsunterschieden der auf den Peers verwendeten Software entstehen. Hierbei muss jedoch Abwärtskompatibilität bestehen. Um solche Versionskonflikte erkennen zu können, sollte das Protokoll eine Versionsnummer enthalten. Diese darf sich dabei nicht auf die verwendete Software, sondern muss sich auf das Protokoll beziehen. Auf Grund der Implementierung im Browser liegt die Verwendung von JSON (JavaScript Object Notation 70) nahe. Dies hätte besondere Auswirkungen auf die Belastung der Bandbreite, da per JSON verfasste Nachrichten kleiner sind als ihre XML-Pendants. Die Verschiebung zugunsten der Nutzlast begründet sich darin, dass XML die eigentlichen Werte in öffnende und schließende Tags einschließt. JSON verwendet dafür nur den Feldnamen gefolgt von einem Doppelpunkt. Weiterhin können JSONStrings in rund 94% 71 nativ erzeugt bzw. geparst werden. 72 Ein somit passendes Protokoll stellt SOAP Junior da (SOAPjr). Dieses wird jedoch nicht mehr weiter verfolgt, wodurch nur noch der Eintrag in der englischsprachigen Wikipedia verfügbar ist 73. 68 Verbindungsebene (z.B. Austausch von Verbindungsinformation), Anwendungsschicht (z.B. Anforderung von Texten, Freundschaftsbeziehungen) 69 siehe vorheriges Kapitel 70 siehe [CROC-2006] 71 vgl. [CANI-2013] 72 siehe auch [NURS-PAUL-REYN-IZUR-2009] 73 vgl. [WSOJ-2012] 34 5.2.4. Umsetzung Netzwerk-Protokoll Um die verschiedenen Bereiche des Netzwerks getrennt voneinander behandeln zu können, werden drei Services (Network, Public, Friendship) adressiert. Technisch gesehen ist die Trennung von Network- und PublicService kontraproduktiv, da ein Peer nur den Netzwerk-Dienst bereitstellen muss, um sich zu verbinden und durch ein Nichtanbieten des Öffentlichen Daten-Dienstes das Netzwerk stört. Da jedoch die Aufgabenbereiche der Dienste sehr unterschiedlich sind, ist eine Trennung durchaus sinnvoll. Der Dienst zur Abwicklung von Daten, die durch Freundschaften von Nutzern entstehen, ist davon losgelöst, da er nur einen Nutzer bzw. dessen Freunde betrifft. Das Nachrichtenprotokoll baut – wie im vorangegangen Kapitel geschlussfolgert – auf SOAPjr auf. Entsprechend handelt es bei den Nachrichten zwischen den teilnehmenden Knoten um JSON-Strings. Diese sind in Head und Body unterteilt. Der Kopf beinhaltet dabei Angaben zum adressierten Service und der gewünschten Methode. Weiterhin sind die verwendete Protokollversion, der Absender, ein Zeitstempel, sowie ein pro Anfrage (die Antwort verwendet den gleichen) zufälliger 160 bits langer Referenzcode pflicht. Der Referenzcode wird dabei verwendet um Kreise im Netzwerk zu erkennen 74. Zusätzlich kann der Kopf enthalten: • to -> um den Empfänger zu adressieren, sonst gilt der • Verbindungspartner als Empfänger; es können mehrere Empfänger in einem Array definiert werden. via / sendVia -> genutzt falls das Routingsystem auf Grund der vorhandenen Verbindungen 75 versagen würde Die Angabe von mehreren Empfängern eines Pakets hat den Vorteil, dass es nur einmal versendet werden muss. Dies schont die Bandbreite und senkt das Nachrichtenaufkommen. Jedoch muss jeder weiterleitende Knoten prüfen, ob die Nachricht auf Grund der Wege zu den Empfängern bei ihm geteilt werden muss. 74 vgl. vgl. [XLAT-2010] Kapitel „Protocol / PING“ und [CLAR-SAND-WILEHONG-2001] Kapitel 3; Seite 4 75 durch die Abwärtskompatibilität ist nicht gewährleistet, dass die entstehende Verbindungsstruktur der gewünschten entspricht. 35 Felder zur Fehlererkennung bei der Übertragung sind nicht notwendig, da diese bereits durch die verwendeten Verbindungsarten berücksichtigt wird 76. Bei Anfragen enthält der Body der Nachricht die zum Aufruf benötigten Attribute. Antworten enthalten einen Statuscode im Kopf der Nachricht. Dieser Statuscode folgt den von HTTP bekannten Codes. Für PeerWeb sind folgende Codes relevant: 100, 102, 200, 201, 202, 207, 300, 302, 304, 400, 401, 404, 410, 421 (uminterpretiert), 429, 500, 501, 504, 507. { “head”: { “service”: “network”, “action”: “peerDescription”, “from”: “10E844530188F910C0EF3ECC4E413D63E CE79604”, "refCode": "326435E86B659C7D34D47CA9FC21E1A44 2EB9555", "date": "1358825257049", "protocolVersion": "0.1" }, “body”: { “peerDescription”: { “ID”: “10E844530188F910C0EF3ECC4E413D63E CE79604”, “ws”: "ws://peerweb.mar-mar.de:8080" } } } Dar. 5.6 – Beispielnachricht Hierbei handelt es sich um die Beschreibung eines Superpeers, welche von ihm selber verschickt wurde. 5.2.4.1. Network Nachrichten dieses Dienstes dienen der Knotenfindung und dem Verbindungsaufbau. 76 vgl. [W3WR-2012] Kapitel 11.1 „DataChannel“ 36 5.2.4.1.1. nodeLookup Die Anfrage enthält die gesuchte ID im Body und wird anhand dieser weitergeleitet. Außerdem wird in dem Body eine Liste der Beschreibungen der nächsten Peers geführt. Diese wird bereits vom anfragenden Knoten erstellt und von jedem weiterleitenden aktualisiert. Für die Findung der Knoten siehe auch Abschnitt 5.1.5.5. 5.2.4.1.2. peerDescription Mittels dieser Nachricht wird die Beschreibung eines Peers übermittelt. Diese beinhaltet neben der PeerID Informationen zu Verbindungsmöglichkeiten zu dem Peer. Handelt es sich dabei um einen Superpeer ist dies seine Websocket-Adresse bzw. die Adresse seiner AJAX-Schnittstelle. Da RTCPeerConnections nur auf Anfrage erstellt werden, wird für diese nur ein Binärfeld verwendet. Ist es einem Knoten nicht möglich sich über eine bestimmte Methode zu verbinden, wird diese nicht in der Beschreibung aufgeführt. 5.2.4.1.3. ringSegmentSearch Diese Nachricht wird für den finalen Routingschritt verwendet, sollten keine Superpeers erreichbar sein. Für diese Nachricht gilt ein gesondertes Routing, daher wird ihre Verwendung in dem Abschnitt 5.1.5.6 Routing erklärt. Ihr Body enthält die ursprüngliche Anfrage und die Beschreibung des Absenders der ringSegmentSearch-Nachricht – des vermeintlichen Zielknotens. 5.2.4.1.4. pcDescription Der Versand einer pcDescription-Nachricht markiert den Beginn der Verbindungsherstellung per RTCPeerConnection. Der Sender hat bereits ein neues Objekt erzeugt und schickt dem Verbindungspartner die dazugehörige Beschreibung, wodurch er den Wunsch einer direkten Verbindung bekannt gibt. 37 Auf den Empfang einer solchen Nachricht wird durch das Verschicken einer Response reagiert. Ist eine Verbindung erwünscht, versendet der Empfänger zusätzlich eine eigene pcDescription-Nachricht. 5.2.4.1.5. iceProcess Diese Nachricht bildet den zweiten Schritt in der Herstellung einer p2p-Verbindung zwischen Browsern. Über diese Art von Mitteilung einigen sich die Verbindungspartner auf eine Verbindung. Um analog zu dem Versand anderer Nachrichten zu bleiben, wird jeweils mit einer Response geantwortet. Der weitere Austausch geschieht über neue „Anfragen“. 5.2.4.2. Public Dieser Service dient dem öffentlichen Teil von PeerWeb. Daher beinhaltet er nur das Speichern und Auffinden von Dokumenten. 5.2.4.2.1. valueStore Diese Nachricht ist zweiteilig angedacht, muss jedoch nicht so umgesetzt werden, um zum Beispiel ein schnelleres Speichern zu ermöglichen. Der zweite Teil ist dabei von Bedeutung. Zunächst wird an die in Frage kommenden Peers ein valueStore mit der benötigten Größe geschickt. So erhalten Knoten die Möglichkeit Daten abzulehnen bzw. ohne zusätzliche Belastung freien Speicher zu schaffen. Dies hat auch den Nebeneffekt, dass eine unnötige Belastung der Bandbreite vermieden werden kann. Wird dieser erste Teil positiv beantwortet, wird eine valueStoreNachricht mit dem Dokument als Body geschickt. 5.2.4.2.2 valueManage Um eine Versionierung mit Versionsgeschichte zu ermöglichen, wird mit dieser Nachricht dem für die Titel-ID verantwortlichen Peer mitgeteilt, dass eine Änderung vorgenommen wurde und er die Versionszeiger 38 entsprechend anpassen muss. Inhalt dieser Nachricht ist die neue Version-ID und diejenige, auf welche sich die Veränderungen beziehen. Siehe auch Kapitel 6.1.4. 5.2.4.2.3. valueLookup Die Nachricht ist analog zu nodeLookup aufgebaut. Sie beinhaltet die ID, nach der gesucht wird und wird anhand dieser weitergereicht. Sollte auf dem Weg zum finalen Peer jedoch ein Knoten eine Kopie des Datums im Cache besitzen, so antwortet er mit dieser. Ist dies nicht gewünscht, kann ein Flag in der Nachricht gesetzt werden. Siehe auch Kapitel 6.1.6. 5.2.4.3. Friendship Zwischen befreundeten Nutzern sind besondere Aktionen möglich. Um diese zu schützen, müssen sich Nutzer bzw. deren Knoten verifizieren. Werden Anfragen an geschützte Inhalte ohne eine vorherige Anmeldung verschickt, wird mit dem Fehlercode 401 und der gewünschten Authentifizierungsmethode geantwortet. 5.2.4.3.1. userAuthentication Über diese Nachricht lässt sich der angemeldete Nutzer eines Knoten verifizieren. Dem Peer wird ein für den Nutzer verschlüsselter Zufallstring zugesandt. Dieser muss dort entschlüsselt und dem anfragenden Knoten zurückgeschickt werden. 5.2.4.3.2. humanAuthentication Um den an einem anderen Gerät angemeldeten Freund ohne Zuhilfenahme eines asymmetrischen Verschlüsselungsverfahren zu bestätigen, muss dem Nutzer direkt eine Frage gestellt werden. Dabei wird der Body jeweils verschlüsselt übertragen. 39 5.2.4.3.3. changesRequest Meldet sich ein Nutzer im Netzwerk an, muss er auch – während seiner Abwesenheit vorgenommene – Änderungen seiner Freunde erhalten. Diese werden aktiv angefragt. Ist der Body der Anfrage leer, gilt sie für den mittels des Headers, adressierten Empfänger. Es können jedoch auch gemeinsame Freunde angegeben werden. Hierzu kann zur Vermeidung mehrerer Nachrichten ein Array verwendet werden. Weiterhin kann das Datum des letzten Erhalts von Änderungen mitgeschickt werden, wodurch sich die Antwort potentiell verkleinert. Unter Änderungen werden auch private Mitteilungen zwischen Nutzern verstanden. 5.2.4.3.4. changesPush changesPush ist das Gegenstück zu changesRequest. Um den Austausch von Neuigkeiten schneller zu gestalten, können diese auch aktiv an verbundene Freunde geschickt werden. Hierbei werden einfach die geänderten Daten im Body der Anfrage übertragen. 5.2.4.3.5. valueStore, valueGet & valueDelete Die Namen der Nachrichten besagen schon ihre Aufgabe. Mit valueStore werden Daten bei Freunden abgelegt, wobei diese dies auch auf Grund von mangelndem Speicherplatz verweigern können. Der Speichervorgang erfolgt wie unter 5.2.4.2.1 beschrieben. Daten können über valueGet wieder erhalten werden. Dabei können direkt Namen oder IDs von Dateien angegeben werden. Wird der Body einer solchen Anfrage leer gelassen, antwortet der Knoten hingegen mit einer Liste von für den Nutzer verfügbaren Daten. Da bei Freunden hinterlegte Dateien einen eindeutigen Besitzer haben, können diese auch gelöscht werden. 40 6. Datenhaltung Neben der Möglichkeit, direkte Verbindungen zwischen Browserclients aufzubauen, sind die Speichermöglichkeiten durch HTML5 von entscheidender Bedeutung für PeerWeb. Session Storage Local Storage IndexedDB Filesystem API • kurzlebige Knoteninformationen • PeerID • Index • Nutzerdaten • Einstellungen • Superpeers • Informationen über Nachrichten • STUN/TURNServer • öffentliche Dokumente • Dokumente von Freunden • Cache Dar. 6.1 – Übersicht Speichernutzung in PeerWeb Dabei bezeichnen kurzlebige Informationen nur für die aktuelle Sitzung relevante Daten. Ebenso werden hier die entschlüsselten Daten des Nutzers abgelegt, um einen erneuten Zugriff zu beschleunigen. Nachrichteninformationen sind zum einen Daten zu weitergeleiteten Paketen, um z.B. Ringe zu erkennen. Zum anderen fallen unter sie auch eigene verschickte Nachrichten. Diesen dienen zur Behandlung von Übertragungsfehlern (z.B. durch Time Outs). Der Index hat nur eine begrenzte Reichweite. Er muss dabei mindestens die auf dem Knoten gespeicherten öffentlichen Dokumente beinhalten, kann aber auch weitere listen. In der Tabelle „Superpeers“ werden Verbindungsinformationen zu Superpeers gehalten. Diese umfassen die URL für Websockets und/oder für AJAX. Die ID sollte auch abgelegt sein. Diese Daten werden gespeichert, da Superpeers für die Einwahl in das Netzwerk benötigt werden. Zudem sind sie mit hoher Wahrscheinlichkeit zukünftig erreichbar, was für normale Peers nicht gilt. Um die Bereiche im Filesystem unterscheiden zu können, wird eine Ordnerstruktur angelegt. Daten eines Nutzers werden verschlüsselt in einer Datei abgelegt, welche zufällig benannt wird. Dokumente von Freunden des Nutzers werden zusätzlich in Unterordnern organisiert. 41 6.1. Datenhaltung öffentlicher Daten Daten werden im Netzwerk auf verschiedenen Peers gespeichert. Um die Ausfallsicherheit zu erhöhen, wird hierfür immer versucht ein Datum auf l 77 Knoten zu verteilen. Die Menge des Speicherplatzes auf den jeweiligen Knoten kann von ihren Nutzern eingestellt werden. 6.1.1. Datenformat Die im Netzwerk zu speichernden Daten werden entsprechend ihres Formats abgelegt. Artikelinhalte können dabei mit HTML-Tags verfasst werden. Dadurch lässt sich ein späteres Übersetzen in HTML zur Anzeige einsparen. Jedoch müssen zusätzliche Sicherheitsmaßnahmen, wie die Löschung möglicherweise eingebetteten JavaScript, eingeführt werden. Diese sollten vor dem Speichern und Anzeigen durchgeführt werden. Zudem wird der Inhalt von Artikeln mit zusätzlichen Angaben versehen. Dazu wird JSON verwendet. Das umschließende Objekt enthält Metaangaben wie Versionsnummer, Titel, Kategorie. 6.1.2. Erzeugung von DatenIDs Die zufällige Erzeugung von DatenIDs bietet kaum Vorteile. So kann keine Zuordnung zwischen Inhalt bzw. Namen des Datums und der ID erzeugt werden. Dies ist für verschleierte Inhalte wichtig, da es die Suche erschwert. Somit könnten Inhalte nur über Indexverzeichnisse ihren IDs zugeordnet werden, es sei denn, die ID nach der gesucht werden soll, ist anderweitig bekannt. Für eine erleichterte Suche muss die ID eines Datums jederzeit wieder erzeugt werden können. Dies ist möglich, wenn die ID abhängig vom Namen erzeugt wird. Das erfordert jedoch hohe Aufmerksamkeit bei der Wahl des Algorithmus zur Erstellung, da Namen recht kurz sind, wodurch das verwendete Hash-Verfahren besonders gut streuen muss. Jedoch hat dies den weiteren Nachteil, dass identische Namen die gleiche ID ergeben. Somit ist auch eine Versionierung nur über 77 siehe 5.1.5.3 42 Umwege möglich. Sollen unterschiedliche Versionen einer Datei zur unterschiedlichen IDs führen, ist das Erzeugen der IDs über den Inhalt ratsam. Dies erschwert jedoch wiederum die Suche. Generell ist auch die Länge der IDs von Bedeutung. Da IDs nicht zentral erzeugt werden, muss gewährleistet sein, dass sie nicht kollidieren. Somit haben längere IDs einen Vorteil gegenüber kürzeren, allerdings führen sie zu zusätzlichem Speicherverbrauch. In PeerWeb werden Dokumente über zwei Kennungen beschrieben. So erhalten sie eine Titel-ID und eine Version-ID. Die Titel-ID wird dabei über den Namen, die Version-ID aus dem Inhalt des Artikels generiert. Siehe dazu auch Abschnitt 6.1.4. 6.1.3. Datenverteilung Werden Artikel beliebig im Netzwerk verteilt, verringert sich die Wahrscheinlichkeit sie (effektiv) zu finden signifikant, da Anfragen nicht gerichtet weitergeleitet werden können. Jedoch stellt es die einfachste Möglichkeit zur Datenhaltung dar. Lässt man aber die Spezialisierung von Knoten – in Verbindung mit einem entsprechenden Routing – zu, lässt sich die Wahrscheinlichkeit erhöhen, Daten in einem solchen Netzwerk wiederzufinden. Jedoch muss dann die Routing-Tabelle Informationen zu den von Nachbarn (wahrscheinlich) verwalteten Schlüsseln beinhalten 78. Wesentlich effektiver ist die Verwendung einer verteilten Hash-Tabelle, wie sie bereits in Kapitel 5.1.2 beschrieben ist. Hier werden Daten auf Knoten verteilt, deren ID nahe zu der eigenen ist. Um die Ausfallsicherheit zu erhöhen, werden zudem mehrere nahe Peers dafür gewählt. Dies hat den Vorteil, dass Anfragen nur mit dem Wissen der IDs von benachbarten Knoten an das potentielle Ziel weitergeleitet werden können. Nachteil dieser Methode ist jedoch, dass der Speicherort von unliebsamen Inhalten ebenso bekannt ist. Eine Zensur wird somit erleichtert. Dies wird für die Effizienz des Netzwerks in Kauf genommen. 78 vgl. [CLAR-SAND-WILE-HONG-2001] Kapitel 3.2 43 Weiterhin wird ein Datum nicht nur auf einen Peer verteilt, sondern auf die l 79 gerade zu der ID nächsten Peers. Der Speichervorgang wird etwa eine Stunde nach der letzten Speichernachricht von einem dieser Knoten erneut ausgelöst 80. Somit ist die Anzahl der speichernden Peers nahezu gesichert. 6.1.4. Datenversionierung Durch die Verwendung von zwei Schlüsseln für einen Artikel ist eine Versionierung relativ einfach umsetzbar. Wird ein Dokument gesucht, kann über dessen Titel-ID der Speicherort bestimmt werden. An diesem wird nicht der Artikel hinterlegt, sondern nur die ID der aktuellen Version. Diese wird dem Anfragenden zurückgegeben, welcher diese Variante lädt. Möchte ein Nutzer ein Dokument ändern, lädt er zunächst die aktuelle Version. An dieser führt er die gewünschten Änderungen durch und speichert das Dokument. Dabei wird über den jetzigen Inhalt eine neue Version-ID generiert. An die für diese ID zugehörigen Knoten wird eine Nachricht zum Speichern des Dokumentes geschickt. Da noch die Änderungen bekannt gegeben werden müssen, damit zukünftige Anfragen an das Dokument mit der neuen Version beantwortet werden, wird gleichzeitig eine Nachricht (valueManage) an den für die Titel-ID zuständigen Peer „Master“ genannt) geschickt. Diese beinhaltet die sich durch die Änderung ergebene Version-ID und die ID der Version, auf deren Grundlage die Änderungen passierten. Der verantwortliche Peer ist hierbei der jeweils (einzelne) an der Titel-ID nächste Peer. Der Empfänger der Nachricht prüft, ob er wirklich der für die Titel-ID zuständige Knoten ist. Hierzu verwendet dieser den Algorithmus zur Suche von Knoten. Ist er dies, kann er Änderungen ablehnen, in dem er die „alte“ Version-ID gegen die für ihn noch aktuelle Version-ID prüft. Sind diese unterschiedlich wird die neue Version nicht übernommen. Um Dokumente vor missbräuchlichen Änderungen zu schützen werden die letzten drei Versionen referenziert. 79 80 in PeerWeb gilt l = 6, siehe 5.1.5.3 vgl. [MAYM-MAZI-2002] Kapitel 2.5 „Efficent key re-publishing“ 44 Dar. 6.2 – Nachrichtenaufkommen bei Änderung eines Dokuments Peer 18804C ändert dabei das Dokument mit der Titel-ID 8E4446 zu Version 40E1BE. Die folgenden Nachrichten werden dabei verwendet: 1 – valueStore, 2 – valueManage (an Master für die Titel-ID), 3 – valueManage (von Master an Replikate der Versionsgeschichte). Die mit 2A gekennzeichneten Verbindungen stehen für ein alternatives Routing, welches verwendet werden würde, wenn keine Superpeers vorhanden wären. Weiterhin wurden nur Verbindungen aus dem Leaf-Set und zu Superpeers berücksichtigt. Bei Annahme der Änderung propagiert der Master diese, wie bei einem normalen Speichervorgang, an weitere Peers, welche seine Nachbarn sein werden. Hierzu wird ebenso eine valueManage-Nachricht benutzt. Die Empfänger prüfen ebenso die Zuständigkeit, erkennen jedoch, dass sie nur ein Replikat der Versionshistorie führen und übernehmen somit die Änderungen. 45 6.1.5. Speichermanagement Um Speicherplatz zu schonen, können Daten mit Verfallsdatum versehen werden. Wird dieses erreicht, wird die dazugehörige Datei automatisch gelöscht. Zudem können Dokumente priorisiert werden. Dies soll erreichen, dass bei knappen Speicher auf einem Peer, dieser zunächst weniger wichtige Daten, wie alte Versionen, löscht. Weiterhin hat der Knoten selber die Möglichkeit eine Priorisierung durchzuführen. Hierfür werden die Daten anhand der Entfernung ihrer (Titel oder Version) ID zu der Peer-ID sortiert. Je weiter ein Datum hierbei entfernt ist, desto wahrscheinlicher ist seine Löschung. Dies begründet sich darin, dass mit zunehmender Entfernung zu diesem Peer die Entfernung zu einem anderen Peer sinkt, welcher somit selbiges Datum eher behält. Kommt es zum Fall einer Löschung, wird zunächst versucht, das Datum erneut zu verteilen. Weiterhin merkt sich der Peer, dass er das Dokument bereits in Besitz hatte, es also potentiell noch im Netzwerk vorhanden ist. Diese Liste von verdrängten Daten ist wichtig zur Beantwortung temporär nicht vorhandener Daten. 6.1.6. Suche Werden die IDs der Artikel über ihre Titel generiert und nach der ID im Netzwerk abgelegt, ist eine Suche zumindest nach vollständig bekannten Titeln einfach und effizient. Die Suche nach Artikeln, deren Titel nur zu einem Teil bekannt ist, bleibt jedoch erschwert. Um dieses Problem zu verringern, werden in Artikeln auch Verweise zu anderen Artikeln gespeichert. So ist es möglich über ähnliche Artikel auf einen bestimmten zu stoßen. Zudem führt jeder Peer eine Liste mit Zuordnungen von Namen zu IDs. Diese wird beiläufig, zum Beispiel durch weitergeleitete Dokumente, aufgebaut. Eine Suche nach Fragmenten eines Titels wäre so durch ein teilweises Fluten des Netzwerks möglich. Da auch hier Super- 46 Dar. 6.3 – Nachrichtenfluss bei Anforderung eines Dokuments Hierbei fordert Peer DC1DE7 das Dokument mit der Titel-ID 8E4446 an (1 – valueLookup). Er erhält die Antwort, dass die aktuelle Version unter die ID 40E1BE besitzt. Daraufhin wird per (2) valueLookup eine Anfrage nach dieser ID gestellt. peers mit hoher Wahrscheinlichkeit mehr Speicher zu Verfügung stellen, ist die Wahrscheinlichkeit der Beantwortung einer Anfrage durch sie recht hoch. Ist die gesuchte ID bekannt, wird die Anfrage, wie in Kapitel 5.1.5.6 beschrieben, weitergereicht. Kann der finale Knoten die Suche nicht beantworten, kommt die im vorherigen Abschnitt vorgestellte Liste verdrängter Daten ins Spiel. Falls kein Eintrag in ihr für die gesuchte ID vorhanden ist, ist die Wahrscheinlichkeit, dass es das gesuchte Datum gibt, recht gering. Somit wird eine 404-„Not Found“-Nachricht zurückgeschickt. Wenn hingegen ein Eintrag zu der angefragten ID vorhanden ist, wird der anfragende Peer gemerkt und zunächst mit einer 202-„Accepted“-Nachricht geantwortet. Somit wird die Anfrage für eine Woche gespeichert. Sollte in dieser Zeit Traffic über den Knoten laufen, der auf den Speicherort des angefragten Dokumentes hinweist, wird die Anfrage entsprechend 47 beantwortet. Dies geschieht in dem Fall mit einer 302-„Found“-Nachricht. Kann die Anfrage nach Ablauf der Woche nicht beantwortet werden, wird 410-„Gone“ versendet. Der Eintrag zum verdrängten Dokument wird eine Woche nach der letzten Nachricht mit Bezug auf dieses Dokument gelöscht. 6.1.7. Cache Die Verwendung von Caching-Funktionen kann die Geschwindigkeit enorm erhöhen. So können Anfragen eventuell schon vor dem Erreichen des eigentlichen Speicherortes eines Datum beantwortet werden. Da so auch weniger Nachrichten notwendig sind, verringert sich auch die Last auf das Netzwerk. Ein weiterer Vorteil ist die zusätzliche Speicherung von Daten innerhalb des Netzwerkes. Ist der für ein Datum eigentlich zuständige Knoten nicht erreichbar, ist die Verfügbarkeit des Datums zwar nicht zwangsläufig gegeben, sie erhöht sich jedoch. Es ergeben sich aber auch Nachteile. So muss potentiell mehr Speicher zur Verfügung gestellt werden. Auch entspricht die zurückgegebene Version einer Information nicht unbedingt der aktuellen Version. Lösungen für dieses Problem sind immer mit zusätzlichem Nachrichtenaufwand verbunden. Eine Invalidierung der im Cache befindlichen Kopien durch den zuständigen Peer 81 ist dabei nur über ein Fluten des Netzwerks möglich, da Kopien nicht lokalisiert werden können. Die Verwendung von versionierten Caches kann auch nicht garantieren, dass veraltete Versionen erkannt werden. Weiterhin ergeben sich zusätzliche Fragen zum Umgang mit vollen Caches. Hier stehen mehrere Lösungen parat. Die einfachste ist das Löschen eines zufälligen Datums, da sie kein Speichern von zusätzlichen Informationen, wie Anfragestatistiken, benötigt. Dies kann jedoch bei populären Inhalten dazu führen, dass dasselbe Datum sofort wieder angefragt wird. Somit geht der Vorteil der höheren Geschwindigkeit bei Anfragen unter Umständen verloren. Auf der anderen Seite kann es die Verfügbarkeit von selten angefragten Dokumenten erhöhen. 81 Peer der das Datum ändert oder auf dem das Datum gespeichert ist 48 Die Löschung des am längsten nicht verwendeten Datums (least recently used – LRU) benötigt nur wenig zusätzlichen Speicheraufwand. Dieses Verfahren bietet jedoch nicht optimale Resultate, da es nicht die Zugriffshäufigkeit beachtet. Das LFU-Verfahren (least frequently used – am wenigsten verwendet) berücksichtigt hingegen die Anzahl von Zugriffen. Es beinhaltet den Nachteil, dass Daten mit einem einmalig hohem Anfrageaufkommen lange im Cache verbleiben. Durch die Struktur des Netzwerkes ergibt sich zudem eine weitere Verdrängungsstrategie. So kann die Entfernung des im Cache befindlichen Datums zur eigenen ID betrachtet werden. Das so am weitesten entfernte Datum wird gelöscht. Dies bietet den Vorteil, dass die Wahrscheinlichkeit einer Anfrage nach eben diesem Datum an diesen Peer berücksichtigt wird. PeerWeb verwendet eine Kombination aus Entfernung, dem letzten Zugriff und der Zugriffshäufigkeit. Wobei die Wahrscheinlichkeit die sich aus dem Zeitpunkt des letzten Zugriffs ergibt, den Faktor zwei erhält. 6.2. Datenhaltung privater Daten Der Speicherort für private und sensible Daten ist nicht diskussionswürdig, da er besonders geschützt werden muss und somit bei vertrauenswürdigen Personen liegen sollte. Nun sind dennoch nicht alle privaten Daten gleich schützenswert. So ist es sogar von Vorteil, wenn die Liste der Freunde von Person A für dessen Freund Person B einsehbar ist. Dadurch entsteht die Möglichkeit, dass beide sich auch Nachrichten schicken können, wenn der andere offline ist und diese dennoch bei vertrauenswürdigen Personen zwischengelagert werden sollen. Die Einordnung der Profil- und sonstigen Daten nach Sicherheitsbedarf, wird dabei dem Nutzer überlassen, ebenso die Quantität des Speicherplatzes für Freunde. Zur Einstellung der Sicherheit der Daten stehen folgende Optionen zu Auswahl: • von Freunden einsehbar • nur vom Besitzer einsehbar – im Ganzen bei Freunden gespeichert • nur vom Besitzer einsehbar – in mehrere Teile geteilt 49 Eine von den Daten abhängige Klassifizierung der Freunde nach vertrauenswürdig / nicht vertrauenswürdig (Freund A darf Datum I speichern, aber Datum II nicht) ist zunächst nicht vorgesehen. Eine generelle Einteilung in Zusammenhang mit den vorgestellten Sicherheitsklassen von Daten ist jedoch ohne weiteres umsetzbar. 7. Freundschaften Da Personen in Netzwerken organisiert sind, liegt es nahe, dass PeerWeb auch Verbindungen zwischen Menschen unterstützt. Um die Entstehung von Freundschaftsbeziehungen in PeerWeb für das System einfach und dennoch sehr sicher zu gestalten, werden diese über einen vom Nutzer gewählten Weg außerhalb von PeerWeb geschlossen. Dazu tauschen die Freunde ihre öffentlichen Schlüssel sowie eine Liste von Knoten, welche sie benutzen, aus. Dieser Austausch kann über E-Mail oder andere Kanäle erfolgen. Auch ein Austausch über bereits gemeinsame Freunde wäre denkbar. 7.1. Einwahl von anderem Rechner Eine Einwahl in das Netzwerk beschreibt den Vorgang, dass sich ein Nutzer anmeldet. Die Einwahl für den dafür benutzten Knoten ändert sich nicht. Der einfachste Weg ist die Mitnahme der Nutzerdaten von einem Knoten zum anderen. Hierfür kann eine verschlüsselte Datei dienen, welche an Knoten A erzeugt wird und über E-Mail oder einen USB-Stick zu Knoten B gelangt, wo sie eingelesen wird. Dies stellt jedoch Mehraufwand für den Nutzer da. Bequemer wäre es, wenn er sich, wie von anderen Netzwerken gewohnt, ohne diese Datei von jedem beliebigen Rechner aus anmelden könnte. Ein solcher Vorgang würde die Akzeptanz des Netzwerks fördern 82. 82 Annahme des Verfassers 50 Das Prinzip hierzu fußt auf der Tatsache, dass auch verschlüsselte Dokumente in dem öffentlichen Teil von PeerWeb abgelegt werden können. Da aber somit wichtige Daten bei Fremden abgelegt werden, muss der Nutzer diesem Verfahren aktiv zustimmen. Über die Logindaten des Nutzers (Name und Passwort) wird ein symmetrischer Schlüssel sowie eine ID erzeugt. Nun werden die für die Verbindungserzeugung zu Freunden benötigten Daten symmetrisch verschlüsselt. Die so erhaltene Datei wird unter der erzeugten ID im Netzwerk abgelegt. Zudem erhalten die Freunde weitere Teile der Nutzerdaten, wie auch den privaten Schlüssel des Nutzers. Da diese Daten zum Identitätsdiebstahl einladen, werden sie, unabhängig von dem Vertrauen des Nutzers in seine Freunde, über die sicherste Methode an diese verteilt. Möchte sich nun der Nutzer A von einem anderen Rechner aus anmelden, kann der Speicherort der Daten und der dazugehörige Schlüssel rekonstruiert werden. Somit können Verbindungen zu Freunden aufgebaut werden. Da aber der Nutzer seinen privaten Schlüssel nicht besitzt, kann er nicht automatisiert von seinen Freunden verifiziert werden. Daher wird zwischen einem Freund B und A eine gesicherte Verbindung aufgebaut. Dies könnte bei direkten Verbindungen zum Beispiel mittels DiffieHellman-Verfahren geschehen. Anschließend werden ein oder mehrere – je nach Einstellungen – vom Freund (bzw. dessen Knoten) ausgewählte Nachrichten an A geschickt. Diese muss A korrekt beantworten. Ist so die Identität des Nutzers bestätigt, erhält dieser den bei B gespeicherten Teil seiner Daten. Dieses Verfahren wird so lange mit weiteren Freunden wiederholt, bis die Mindestanzahl zur Wiederherstellung der Daten erreicht ist. 7.2. Suche nach eingeloggten Freunden Um die Suche nach Freunden zu erleichtern, werden Freunde mit Knoten assoziiert. Geht ein Benutzer A online, so sucht er nicht direkt nach seinen Freunden (diese müssen bereits online sein), sondern nach Knoten, von denen sich die Freunde bereits einmal angemeldet haben. Wird ein solcher Knoten gefunden, wird der dort angemeldete Nutzer B verifiziert. Hierzu wird ein zufälliger String mit dem öffentlichen Schlüssel 51 des potentiellen Freundes B verschlüsselt und dem Knoten zugesandt. Ist der Freund dort wirklich angemeldet, kann diese Nachricht entschlüsselt werden. Der Zufallsstring wird mit dem öffentlichen Schlüssel des Initiators A verschlüsselt und zurückgeschickt. Dieser Prozess funktioniert jedoch nicht, wenn beide Freunde an dem jeweils anderen unbekannten Knoten angemeldet sind. Ist hingegen der Nutzer an einem für Freunde neuen Peer angemeldet, muss er lediglich den Vorgang regelmäßig durchführen. Für die Sicherheit des Verfahrens ist es von Vorteil, wenn Freunde ihren Freunden mitteilen, wie vertrauensvoll der Knoten ist, von dem sie sich gerade angemeldet haben. Weiterhin ist es von Vorteil, Freunde davon zu unterrichten, dass der Nutzer sich nicht ein weiteres Mal von diesen Knoten aus anmelden wird. Beide Fälle werden von Freunden gleichbehandelt, indem sie die PeerID nicht mit dem Freund verbinden. 8. Fazit und Ausblick Die vorliegende Arbeit zeigt, dass Peer-to-Peer-Netzwerke im Browser mittlerweile möglich sind, auch wenn sie einige Anpassungen benötigen und bei möglichst hoher Kompatibilität sehr komplex werden. Allerdings kann auch heute noch nicht vollständig auf einen Server verzichtet werden, da dieser für die Einwahl benötigt wird. Im Rahmen dieser Arbeit wurde bereits ein Teil umgesetzt, dieser befindet sich auf der CD im Anhang und umfasst das Speichern und Wiederaufrufen von Dokumenten im Netzwerk. Auch das Routing ist bereits umgesetzt. Das Programm PeerWeb soll zunächst weiter umgesetzt werden, bis eine erste Version, nach den hier vorgestellten Funktionen fertig gestellt ist. Hierzu ist ein Team von drei bis vier Personen angedacht. Anschließend ist eine Lizenzierung unter einer Open-Source-Lizenz geplant. Ab diesem Zeitpunkt könnte die Entwicklung für Interessierte geöffnet werden. Bis dahin muss auch der Arbeitstitel PeerWeb geändert werden, da dieser bereits belegt ist. 52 8.1. Sicherheit & Anonymität Die bisherige Arbeit an PeerWeb hatte ein leicht benutzbares, stabiles sowie effizientes System als Ziel. Die Sicherheit und auch Anonymität wurde hierbei weniger berücksichtigt, eine spätere Implementierung von bekannten Verfahren jedoch bedacht. Dennoch müssen an einigen Stellen gesonderte Überlegungen angestellt werden. 8.1.1. Onion-Routing Ein leicht umsetzbarer Sicherheitsaspekt ist die Verschleierung von Absender, Empfänger und Inhalt von Nachrichten. Um dies zu integrieren werden nur noch öffentliche und private Schlüssel (z.B. durch RSA) für Knoten benötigt 83. Würde Onion-Routing verwendet, ließe sich die Peer-ID über den öffentlichen Schlüssel generieren. 8.1.2. Herkunft von Dokumenten Noch ist für den Leser der Autor eines Artikels nicht ersichtlich. Es könnten jedoch Artikel mit Identitäten unterschrieben werden. Hierzu können die durch das Onion-Routing benötigten Schlüssel verwendet werden. Da somit nur der ausstellende Knoten bekannt ist nicht aber der Nutzer, ist eine digitale Unterschrift durch den Nutzer sinnvoller. Dadurch wird allerdings seine Identität auch für Nicht-Freunde bekannt. Hier ist daher noch Raum für Überlegungen zu einer sinnvollen Kombination zweier Identitäten eines Nutzers – einer für Freunde und eine zum Erstellen von Dokumenten. 83 vgl. [MAHL-SCHI-2007] Kapitel 11.2; Seite 214 – „Onion Routing“ 53 8.2. Steigerung Nutzerakzeptanz Mittels eines besonders gestellten Peers, welcher schon als Server bezeichnet werden kann, ließe sich die Akzeptanz des durchschnittlichen Nutzers sicher steigern. 8.2.1. Suchmaschinen Da die Suchmaschine Google bei ihrer Indexierung kein JavaScript berücksichtigt, kann der Inhalt von PeerWeb nicht erfasst werden. Dies ist zwar auf der einen Seite eine einfache Möglichkeit die Schwierigkeit versteckte Daten zu finden hoch zu halten, auf der anderen Seite geht somit aber ein großes Nutzeraufkommen verloren. Gäbe es einen Server, der dem Googlebot die Daten zur Verfügung stellt, werden automatisch mehr Nutzer erreicht. Dies begründet sich in den dadurch möglichen Zufallstreffern. Weiterhin würde diese Vorgehensweise die Suche nach Artikeln deutlich vereinfachen, da der Marktführer hierfür benutzt werden kann. Somit läge jederzeit ein komplettes Verzeichnis der Daten bereit. Natürlich dürften Nutzer die Daten nicht vom Server laden, sondern würden diese über das Netzwerk erhalten. 8.2.2. Import von Daten Eine einfache Möglichkeit den potentiellen Nutzern den Umzug zu PeerWeb zu erleichtern ist ein automatischer Import seiner Daten von anderen sozialen Netzwerken. Da Facebook eine offene API hat, muss der Nutzer nur diesen Vorgang bei PeerWeb anstoßen und den Zugriff auf seine Daten bei Facebook bestätigen. Wie sicher jedoch eine solche Vorgehensweise ist, muss geklärt werden. Ungeklärt ist außerdem ob dieser Vorgang auch ohne Server funktioniert. 54 8.3. weitere Verbesserungen Mittels der in 6.1.4 vorgestellten Methode zur Versionsverwaltung könnten auch Änderungen zurückgenommen werden, wenn diese als nachteilig empfunden werden. So bräuchte der „Master“ nur entsprechende Nachrichten der Nutzer zählen. Hat die Anzahl eine bestimmte Masse erreicht, wird die Änderung zurückgenommen. Auch ein System aus gut/schlecht Bewertungen 84 könnte herangezogen werden. Dies hätte den Vorteil, dass nicht nur negative Äußerungen berücksichtigt werden. Ebenso ist eine Kommentar-/Diskussionsmöglichkeit umsetzbar, ohne dass eine Änderung des Artikels deren Inhalt löscht. 84 analog zu Bewertungen von Videos bei YouTube 55 I Literaturverzeichnis [ADFL-2007] livedocs.adobe.com: „Externalinterface“, Adobe, 12. Oktober 2007, siehe: http://livedocs.adobe.com/flash/9.0_de/ActionScriptLangRefV3/flash/external/ExternalInterface.html (letzter Zugriff: 12.01.2013) [ADOB-2010] Jozsef Vass: „Cirrus service for developing endto-end applications using RTMFP in FLash Player 10“, Adobe, 1. Juni 2011, siehe: http://www.adobe.com/devnet/flashplayer/articles/rtmfp_ cirrus_app.html (letzter Zugriff: 13.01.2013) [BAYE-2002] Thomas Bayer: „REST Web Services Eine Einführung“, Orientation in Objects, 27. November 2002, siehe: http://www. oio.de/public/xml/rest-webservices.pdf (letzter Zugriff: 12.01.2013) [BERN-1990] Tim Berners-Lee: “Information Management: A Proposal“, CERN, Mai 1990, siehe: http://www.w3.org/History/1989/ proposal.html (letzter Zugriff: 12.01.2013) [BERN-CONN-1993] Tim Berners-Lee, Daniel Connolly: „Hypertext Markup Language (HTML)“, IETF, Juni 1993, siehe: http://www.w3.org/ MarkUp/draft-ietf-iiir-html-01.txt (letzter Zugriff: 12.01.2013) [BIDE-2011] Eric Bidelman: „A Beginner’s Guide to Using the Application Cache“, HTML5 Rocks, 27. Mai 2011, siehe: http://www. html5rocks.com/en/tutorials/appcache/beginner/ (letzter Zugriff: 12.01.2013) [BUSH-1945] Vannevar Bush: „As We May Think“, in: „the Atlantic“, Juli 1945; siehe: http://www.theatlantic.com/magazine/archive/1945/07/as-we-may-think/303881/2/?single_page=true (letzter Zugriff: 12.01.2013) [CANI-2013] 12.01.2013) siehe: http://caniuse.com/ (letzter Zugriff: [CLAR-SAND-WILE-HONG-2001] Ian Clarke, Oskar Sandberg, Brandon Wiley, Theodore W. Hong: „Freenet: A Distributed Anonymous Information Storage and Retrieval System“, 2001, siehe: http://homepage. cs.uiowa.edu/~ghosh/freenet.pdf (letzter Zugriff: 12.01.2013) 56 [CROC-2006] D. Crockford, „The application/json Media Type for JavaScript Object Notation (JSON)“, IETF, Juli 2006, siehe: https:// tools.ietf.org/html/rfc4627 (letzter Zugriff: 12.01.2013) [CROS-WALL-2007] Scott A. Crosby, Dan S. Wallach: „An Analysis of BitTorrents’s Two Kademlia-Based DHTs“, Department of Computer Science, Rice University, Juni 2007, siehe: http://www.cs.rice. edu/~scrosby/tr/BTMeasure-Main.pdf (letzter Zugriff: 12.01.2013) [DUTT-2012] Sam Dutton, „Getting Started with WebRTC“, HTML5 Rocks, 23. Juli 2012, siehe: http://www.html5rocks.com/en/tutorials/webrtc/basics/ (letzter Zugriff: 12.01.2013) [FIEL-2000] Roy Thomas Fielding: „Architectural Styles and the Design of Network-based Software Architectures“, 2000, siehe: https://www.ics.uci.edu/~fielding/pubs/dissertation/fielding_ dissertation_2up.pdf (letzter Zugriff: 12.01.2013) [FIRE-2006]lxr.mozilla.org: „mozilla/dom/src/storage/nsDOMStorage.cpp“, Mozilla, siehe: http://lxr.mozilla.org/mozilla/source/dom/src/storage/nsDOMStorage.cpp (letzter Zugriff: 12.01.2013) [FREE-2012] freenetproject.org: „Freenet Frequently Asked Questions“, siehe: https://freenetproject.org/faq.html (letzter Zugriff: 12.01.2013) [GOLZ-2000] Karl-Heinz Golzio: „Basiswissen Judentum“, Gütersloher Verlagshaus, 2000, 2. Auflage [GOOG-2012] developers.google.com: „Managing HTML5 Offline Storage“, siehe: https://developers.google.com/chrome/whitepapers/storage (letzter Zugriff: 12.01.2013) [IDBS-2012] N. Parashuram: „IndexedDBShim“, siehe: https:// github.com/axemclion/IndexedDBShim (letzter Zugriff: 12.01.2013) [IETF-2011] A. Barth, U. C. Berkeley: „HTTP State Management Mechanism“, IETF, April 2011, siehe: https://tools.ietf.org/html/ rfc6265 (letzter Zugriff: 12.01.2013) [MAHL-SCHI-2007] Peter Mahlmann, „Peer-to-Peer-Netzwerke“, Springer, 2007 Christian Schindelhauer: 57 [MAYM-MAZI-2002] Petar Maymaounkov, David Mazières: „Kademlia: A Peer-to-peer Information System Based on the XOR Metric“, in: Peter Druschel, Frans Kaashoek, Antony Rowstron, „Workshop Report for IPTPS’02 1st International Workshop on Peer-to-Peer Systems 7–8 March 2002 — MIT Faculty Club, Cambridge, MA, USA“, Springer, 2002, Seite 53-65; siehe auch: http://pdos.csail.mit.edu/~petar/papers/maymounkov-kademlia-lncs.pdf (letzter Zugriff: 12.01.2013) [MBID-2012] developer.mozilla.org: „Basic Concepts About IndexedDB“, Mozilla Developer Network, 26. Dezember 2012, siehe: https://developer.mozilla.org/en-US/docs/IndexedDB/Basic_Concepts_ Behind_IndexedDB (letzter Zugriff: 12.01.2013) [MFAP-2012] developer.mozilla.org: „File System API“, Mozilla Developer Network, 14. März 2012, siehe: https://developer.mozilla.org/en-US/docs/DOM/File_API/File_System_API (letzter Zugriff: 12.01.2013) [MIDB-2013] developer.mozilla.org: „IndexedDB“, Mozilla Developer Network, 4. Januar 2012, siehe: https://developer.mozilla.org/ en-US/docs/IndexedDB (letzter Zugriff: 12.01.2013) [MINT-2011] te 42 f., Heise Stefan Mintert: „Fünf Viertel“, ix, Juni 2011, Sei- [MSDN-2012] msdn.microsoft.com: „Introduction to Web Storage (Internet Explorer)“, Microsoft, 26. Oktober 2012, siehe: http:// msdn.microsoft.com/en-us/library/cc197062(VS.85).aspx (letzter Zugriff: 12.01.2013) [NELS-1965] faculty.vassar.edu: „Ted nelson regarding “hyper-text“ 1965“, http://faculty.vassar.edu/mijoyce/Ted_sed.html (letzter Zugriff: 12.01.2013) [NURS-PAUL-REYN-IZUR-2009]Nurzhan Nurseitov, Michael Paulson, Randall Reynolds, Clemente Izurieta: „Comparison of JSON and XML Data Interchange Formats: A Case Study“, ISCA 22nd International Conference on Computer Applications in Industry and Engineering, CAINE ‘09, San Francisco, CA, November 2009, siehe: http://www.cs.montana. edu/izurieta/pubs/caine2009.pdf (letzter Zugriff: 12.01.2013) 58 [OPER-2012] Shwetank Dixit: „Web Storage: easier, more powerful client-side data storage“, Opera, 5. März 2012, siehe: http://dev. opera.com/articles/view/web-storage/ (letzter Zugriff: 12.01.2013) [PILG-2011] Mark Pilgrim: „Dive Into HTML5“, 2011, siehe: http://diveintohtml5.info/storage.html (letzter Zugriff 12.01.2013) [ROWS-DRUS-2001] Antony Rowstron, Peter Druschel: „Pastry: Scalable, decentralized object location and routing for large-scale peer-to-peer systems“, IFIP/ACM International Conference on Distributed Systems Platforms (Middleware), Heidelberg, Germany, Seite 329-350, November 2001; siehe auch: http://www.freepastry.org/PAST/ pastry.pdf (letzter Zugriff: 12.01.2013) [STAT-2010] Statista: „Anteil installierter Plug-ins in Browsern in Deutschland (Stand: Dezember 2010)“, Statista, 1. Dezember 2010, siehe: http://de.statista.com/statistik/daten/studie/36626/ umfrage/anteil-installierter-plug-ins-in-browsern/ (letzter Zugriff: 12.01.2013) [STAT-2011] Statista: „Anteil installierter Plug-ins in Browsern im Januar 2011“, Statista, 18. Januar 2011, siehe: http://de.statista. com/statistik/daten/studie/152142/umfrage/anteil-installierter-plugins-in-browsern/ (letzter Zugriff: 12.01.2013) [TNSF-2010] TNS: „Digital Life“, TNS, Dezember 2010, siehe: http://2010.tnsdigitallife.com/ (dargestellt im Flash-Objekt am Anfang der Seite) (letzter Zugriff: 12.01.2013) [UDEM-2012] Udemy: „Code Wars: Ruby vs Python vs PHP [Infographic]“, Udemy, 16. November 2012, siehe: http://www.udemy. com/blog/modern-language-wars/ (letzter Zugriff: 16.01.2013) [W3FA-2012] Eric Uhrhane: „File API: Directories and System“, W3C, 17. April 2012, siehe: http://www.w3.org/TR/file-systemapi/ (letzter Zugriff: 12.01.2013) [W3HI-2000] www.w3.org: „A Little History of the World Wide Web“, http://www.w3.org/History.html (letzter Zugriff: 12.01.2013) [W3HT-1997] W3C: „HTML 3.2 Reference Specification“, W3C, 14. Januar 1997, siehe: http://www.w3.org/TR/REC-html32-19970114 (letzter Zugriff: 12.01.2013) 59 [W3HT-2012] Robin Berjon, Trevis Leithead, Erika Doyle Navara, Edward O’Connor, Silvia Pfeiffer: „HTML5“, W3C, 17. Dezember 2012, siehe: http://www.w3.org/TR/html5/ (letzter Zugriff 12.01.2013) [W3ID-2012] Nikunj Mehta, Jonas Sicking, Eliot Graff, Andrei Popescu, Jeremy Orlow: „Indexed Database API“, W3C, 24. Mai 2012, siehe: http://www.w3.org/TR/IndexedDB/ (letzter Zugriff: 12.01.2013) [W3ST-2011] Ian Hickson: „Web Storage“, W3C, 8. Dezember 2011, siehe: http://www.w3.org/TR/webstorage/ (letzter Zugriff: 12.01.2013) [W3WD-2010] Ian Hickson: „Web SQL Database“, W3C, 18. November 2010, siehe: http://www.w3.org/TR/webdatabase/ (letzter Zugriff: 12.01.2013) [W3WR-2012] Adam Bergkvist, Daniel C. Burnett, Cullen Jennings, Anant Narayanan: „WebRTC 1.0: Real-time Communication Between Browsers“, W3C, 21. August 2012, siehe: http://www.w3.org/TR/ webrtc/ (letzter Zugriff: 12.01.2013) [WEBH-2013] WebHits: „Web-Barometer“, WebHits, siehe: http://www.webhits.de/deutsch/index.shtml?webstats.html (Zugriff am 19.11.2012 und 09.01.2013) [WHAT-2013] WHATWG: „HTML“, WHATWG, siehe: http:// www.whatwg.org/specs/web-apps/current-work/multipage/introduction.html (letzter Zugriff: 12.01.2013) [WSDL-2001] Erik Christensen, Francisco Curbera, Greg Meredith, Sanjiva Weerawarana: „Web Service Description Language (WSDL) 1.1“, W3C, 15. März 2001, siehe: http://www.w3.org/TR/wsdl (letzter Zugriff: 12.01.2013) [WSOJ-2012] wikipedia.org: „SOAPjr“, Wikipedia, 5. April 2012, siehe: https://en.wikipedia.org/wiki/SOAPjr (letzter Zugriff: 12.01.2013) [XLAT-2010] XLattice, „Kademlia: A Design Specification“, XLattice, 13. Februar 2010, siehe: http://xlattice.sourceforge.net/components/protocol/kademlia/specs.pdf (letzter Zugriff: 12.01.2013) 60 II Darstellungsverzeichnis II Darstellungsverzeichnis Dar. 2.1 – Benötigte Verbindungen zum Aufbau einer RTCPeerConnection [DUTT-2012] 10 Dar. 4.1 – Verteilung relevanter Browserplugins (auf Grundlage von [STAT-2010], [STAT-2011], [WEBH-2013]) 16 Dar. 5.1 – Netzwerkstruktur in PeerWeb 25 Dar. 5.2 – Durchschnittliche Freundesanzahl bei Facebook 2010 (auf Grundlage von [TNSF-2010]) 27 Dar. 5.3 – Routing-Tabelle für Peer 1114C5 aus dem Beispielnetzwerk (Dar. 5.1) 28 Dar. 5.4 – Routingalgorithmus in Pseudocode (nach [MAHLSCHI-2007] Seite 105, [ROWS-DRUS-2001] Kapitel 2.2) 30 Dar. 5.5 – Nachrichtenfluss bei Verbindungsaufbau zwischen Peers 32 Dar. 5.6 – Beispielnachricht 36 Dar. 6.1 – Übersicht Speichernutzung in PeerWeb 41 Dar. 6.2 – Nachrichtenaufkommen bei Änderung eines Dokuments 45 Dar. 6.3 – Nachrichtenfluss bei Anforderung eines Dokuments 47 61 III Abkürzungsverzeichnis AJAX Asynchronous JavaScript and XML API Application Programming Interface CSS Cascading Style Sheet DB Database DOM Document Object Model HTML Hypertext Markup Language HTTP Hypertext Transfer Protocol ICE Interactive Connectivity Establishment ID Identifikator JSON JavaScript Object Notation NAT Network Address Translation p2p Peer-to-Peer REST Representational State Transfer RTC Real Time Communication SOAP früher: Simple Object Access Protocol, heute: Eigenname SQL Structured Query Language STUN Session Traversal Utilities for NAT TURN Traversal Using Relays around NAT URL Uniform Resource Locator W3C World Wide Web Consortium WHATWG Web Hypertext Application Technology Working Group WSDL Web Services Description Language XML Extensible Markup Language 62 IV Anhang Anwendungsfalldiagramm 63 Klassendiagramm 64 Aktivitätsdiagramm „Einwahl“ 65 weitere Anhänge Dieser Bachelorarbeit liegt eine CD mit folgendem Inhalt bei: • • • • • • /Grafiken — verwendete Grafiken /Belege — Teile der im Literaturverzeichnis angegebenen Quellen als PDF-Dokumente /peerWeb — Git-Repository des Projektes /peerWeb/Peer — Quelltext der Peersoftware /peerWeb/SuperPeer — Quelltext des Superpeers /jsdoc — generierte JavaScript Dokumentation Installation Die jeweils aktuelle Version von peerWeb wird ab dem 1.2.2013 unter http://peerweb.mar-mar.de erreichbar sein. Für die Verwendung von peerWeb sollten die Browser Chrome 25 oder Firefox 18 (oder höher) benutzt werden. Soll die Seite auf dem eigenen System eingerichtet werden, muss ein Webserver vorhanden sein und der Quelltext des Peers in das entsprechende Verzeichnis kopiert werden. Anschließend brauch nur wie gewohnt die Seite im Browser geöffnet werden. Zudem kann ein eigener Superpeer zur Verfügung gestellt werden. Hierfür ist eine aktuelle Ruby-Version (1.9.3) mit dem Gem em-websocket erforderlich. Das Gem wird über gem install em-websocket installiert. Um den Superpeer auszuführen, wechselt man in das Verzeichnis in dem die Datei des Superpeers liegt und gibt folgenden Befehl ein: „ruby superpeer.rb --host <IP-Adresse> --port <Portnummer>“. IPAdresse und Portnummer müssen entsprechend angegeben werden. Der Superpeer dient zur Zeit nur für die Weiterleitung von Nachrichten. So speichert er noch keine Dokumente, wodurch keine weitere Konfiguration nötig ist. Damit sich ein Peer zu dem Superpeer verbindet, reicht ein Eintrag in der Datei „defaultHelpers.json“. Dieser muss jedoch vor dem Start des Peers getätigt werden. Weiterhin stehen z.Z. nur Verbindungen per Websocket zu dem Superpeer zur Verfügung. 66 V Eidesstattliche Erklärung Hiermit erkläre ich an Eides Statt, dass ich die vorliegende Arbeit selbst angefertigt habe. Die aus fremden Quellen direkt oder indirekt übernommenen Gedanken sind als solche kenntlich gemacht. Dies gilt auch für die in der Arbeit gelieferte Zeichnungen, Skizzen, bildliche Darstellungen und dergleichen. Die Arbeit wurde bisher keiner Prüfungsbehörde vorgelegt und auch noch nicht veröffentlicht. Unterschrift Marten Schälicke 67