Institut für Angewandte Mikroelektronik und Datentechnik Entwurf und Evaluation eines Kad-basierten P2PSystems für Android-Plattformen Projektbericht Bearbeiter: B.Sc. Arne Wall Betreuer: M.Sc. Michael Rethfeldt Dr.-Ing. Peter Danielis Aufgabenstellung 2 Aufgabenstellung Entwurf und Evaluation eines Kad-basierten P2P-Systems für Android-Plattformen Bestehende Client-Server-Lösungen, die als Basis für eine Vielzahl von Internet-Diensten dienen, enthalten eine zentrale Instanz, die einen Single Point of Failure darstellt. Peer-toPeer (P2P)-Netzwerke wie das Distributed Hash Table-basierte Kad-Netzwerk stellen eine Alternative in diesem Bereich dar und weisen positive Eigenschaften wie hohe Zuverlässigkeit und Skalierbarkeit auf. Sie sind als Netzwerktechnologie für die Vernetzung von einer Vielzahl von Geräten mit unterschiedlichen Betriebssystemen (BS) geeignet, wobei das Android-BS vor allem auf mobilen Geräten an Bedeutung gewinnt. Die Aufgabe dieser Projektarbeit ist es, ein Kad-basiertes Netzwerk für Android-Plattformen zu entwerfen und zu implementieren. Dabei sollen nützliche Anwendungen für das KadNetzwerk untersucht werden und schließlich soll eine anschauliche Demonstration von einem Netzwerk aus angeschlossenen Kad-Knoten auf Android-Plattformen vorgenommen werden. Eine detaillierte Diskussion der erzielten Ergebnisse ist einzubeziehen. Zusammenfassend sind folgende Aufgaben zu lösen: Analyse der Standes der Technik in Bezug auf P2P-Technologie und KadNetzwerk Ableitung von nützlichen Anwendungen für das Kad-Netzwerk auf AndroidPlattformen Entwurf der Architektur eines Kad-Knotens für Android-Plattformen Umsetzung des Kad-Knotens für Android-Plattformen Leistungsbewertung und Demonstration von einem Netzwerk aus verbundenen Kad-Knoten Inhaltsverzeichnis 3 Inhaltsverzeichnis AUFGABENSTELLUNG ............................................................................................................................... 2 INHALTSVERZEICHNIS ............................................................................................................................. 3 ABBILDUNGSVERZEICHNIS ..................................................................................................................... 4 TABELLENVERZEICHNIS ......................................................................................................................... 5 ABKÜRZUNGSVERZEICHNIS ................................................................................................................... 6 1 2 3 EINLEITUNG ........................................................................................................................................ 7 1.1 MOTIVATION ....................................................................................................................................... 7 1.2 AUFBAU DER ARBEIT ........................................................................................................................... 8 GRUNDLAGEN..................................................................................................................................... 9 2.1 P2P-NETZWERKE ................................................................................................................................. 9 2.2 KADEMLIA ......................................................................................................................................... 16 2.3 FREERTOS ........................................................................................................................................ 19 2.4 JAVA .................................................................................................................................................. 19 2.5 PROJEKTKONTEXT ............................................................................................................................. 20 IMPLEMENTIERUNG ...................................................................................................................... 23 3.1 WESENTLICHE UNTERSCHIEDE ZWISCHEN C++ UND JAVA ................................................................ 23 3.2 SYSTEMAUFRUFE VON FREERTOS .................................................................................................... 24 3.3 GRUNDLEGENDE SOFTWAREARCHITEKTUR ....................................................................................... 26 3.4 KAD-CLIENT ...................................................................................................................................... 29 4 ERGEBNISSE UND DISKUSSION ................................................................................................... 30 5 ZUSAMMENFASSUNG UND AUSBLICK ...................................................................................... 31 LITERATURVERZEICHNIS ..................................................................................................................... 32 Abbildungsverzeichnis 4 Abbildungsverzeichnis Abbildung 1: Server-Client-Konzept am Beispiel von FTP [12] ............................................................... 10 Abbildung 2: Dezentrale, vollständig vermaschte P2P-Netzwerkstruktur [12] ....................................... 11 Abbildung 3: Vergleich logisches Overlay / physikalisches Underlay [12] ............................................... 12 Abbildung 4: P2P-Netzwerktypen [14] ........................................................................................................ 14 Abbildung 5: Distributed Hash Table Ring [12] ......................................................................................... 15 Abbildung 6: Suchkomplexität O(log2(N)) durch binären Baum [12] ..................................................... 17 Abbildung 7: Iterativer Suchvorgang [12] .................................................................................................. 18 Abbildung 8: Rekursiver Suchvorgang [12]................................................................................................ 18 Abbildung 9: Java Abstraktion [21] ............................................................................................................ 20 Abbildung 10: Projektverlauf ...................................................................................................................... 22 Abbildung 11: Systemaufrufe ....................................................................................................................... 24 Abbildung 12: Netzwerkaufbau ................................................................................................................... 26 Abbildung 13: Kommunikation zwischen Threads [12] ............................................................................ 27 Abbildung 14: Paketverarbeitung [12] ........................................................................................................ 28 Abbildung 15: Kad-Client auf Windows Rechner ...................................................................................... 29 Tabellenverzeichnis 5 Tabellenverzeichnis Tabelle 1: Klassifizierung von P2P-Netzwerken [13] ................................................................................. 13 Abkürzungsverzeichnis Abkürzungsverzeichnis Abkürzung Bedeutung ARM Advanced Reduced Instruction Set Computer Machines DDoS Distributed Denial of Service DHT Distributed Hash Table DLNA Digital Living Network Alliance DNS Domain Name System IP Internet Protocol JVM Java Virtual Machine MD5 Message-Digest Algorithm 5 OS Operating System P2P Peer-to-Peer PC Personal Computer RT Real Time SPoF Single Point of Failure TCP Transmission Control Protocol UDP User Datagram Protocol VM Virtual Machine 6 Einleitung 7 1 Einleitung Ein Trend in der modernen Informationstechnik ist die zunehmende Gerätevernetzung. Dies zeigt sich in sogenannten Smart-Cities. Drahtlose Sensornetzwerke gewinnen an Bedeutung, da sie Informationen über Feinstaubbelastung, Lärm, Temperatur und Helligkeit liefern. Der Straßenverkehr innerhalb einer Smart-City lässt sich durch intelligente Verkehrsleitsysteme optimieren. Dem Alltagsnutzer allgegenwärtig sind Informationssysteme an Bahnhöfen, Flughäfen und öffentlichen Plätzen. Innerhalb einer Smart-City kommuniziert somit eine große Anzahl von Geräten miteinander. Die Skalierbarkeit solcher Gerätesysteme ist von großer Bedeutung. Eine weitere Entwicklung betrifft die Automatisierungstechnik. Hierbei sollen beispielsweise durch eine zunehmende Gerätevernetzung industrielle Fertigungsprozesse optimiert werden. Es finden sich viele Geräte zum Anlagen Monitoring. Logistikzentren werden für eine effiziente Warenauslieferung stärker vernetzt. Ein deterministisches Zeitverhalten solcher Systeme ist von grundlegender Bedeutung. Außerdem ist eine hohe Ausfallsicherheit von Systemen in der Industrieautomatisierung wichtig. Weiterhin werden Geräte verschiedener Hersteller im Bereich der Heimautomatisierung miteinander vernetzt. Ein Beispiel ist die Vernetzung von Multimediageräten via DNLA [1]. Dadurch ist es möglich, Multimediainhalte zwischen Geräten verschiedener Hersteller von Smartphones, Smart-TVs und Desktop PCs auszutauschen. Windows [2], Linux [3] und OS-X Rechner [4], Windows Phones [5], Android [6] und iOS [7] Geräte, Smart-TVs und andere Haushaltsgeräte kommunizieren miteinander. Die Interoperabilität zwischen verschiedenen Hardware- und SoftwarePlattformen muss gewährleistet sein. 1.1 Motivation Häufig basieren solche Anwendungen auf zentralisierten Architekturen. Dabei tauschen viele Clients Daten mit einem Server aus, der einen Single Point of Failure (SPoF) darstellt. Ein weiterer Nachteil solcher Systeme ist die schlechte Skalierbarkeit. Eine wachsende Anzahl von Clients kann nicht mehr so gut bewältigt werden. Die Netzwerkanbindung des Servers stellt einen Flaschenhals dar und sämtliche Anfragen muss dieser Server bearbeiten. Einleitung 8 Daraus resultiert die Anfälligkeit für Distributed Denial of Service (DDoS) Attacken, bei denen ein Angreifer versucht, das System mit vielen Anfragen von vielen Clients auszulasten. Häufig wird versucht, solchen Szenarien durch eine schnellere Netzwerkanbindung und mehr Rechenkapazität entgegenzuwirken. Um diesen Problemen zu begegnen, empfiehlt sich die Verwendung von dezentralen Architekturen wie sie Peer-to-Peer-Netzwerke (P2P) aufweisen. Die Anwendungen befinden sich oberhalb der P2P-Schicht. Das P2P-Netzwerk dient der Verwaltung der einzelnen Geräte. Das Beitreten neuer Knoten in ein bestehendes Netzwerk, das Suchen anderer Geräte und der Dateiaustausch werden unabhängig von der Anwendung durchgeführt. Das P2P-Protokoll kann somit als eine Art Middleware aufgefasst werden. Eine Anwendung oberhalb der Middleware nutzt deren Vorteile. In dieser Arbeit wurde das P2P-Protokoll „Kademlia“ [8] mit dessen C++-Implementierung „Kad“ verwendet. Da C++ [9] eine plattformabhängige Sprache ist, soll „Kad“ in die plattformunabhängige Sprache Java [10] portiert werden. Für verschiedene Betriebssysteme lassen sich dann P2PAnwendungen, basierend auf Kademlia, entwickeln. Selbst Android-Geräte [6] sollen künftig dem P2P-Netzwerk beitreten können. 1.2 Aufbau der Arbeit Zunächst wird in Abschnitt 2 auf P2P-netzwerktechnische Grundlagen eingegangen und die Wahl auf das P2P-Netzwerkprotokolls „Kademlia“ begründet. Da die Implementierung „Kad“ von Kademlia auf dem Echtzeitbetriebssystem FreeRTOS basiert, soll dieses kurz beschrieben werden. Anschließend wird auf die plattformunabhängige Sprache Java eingegangen. Weiterhin soll diese Projektarbeit in den Projektkontext eingeordnet werden. Abschnitt 3 beschreibt die Portierung von Kad in die Sprache Java. Dabei wird auf die relevanten Unterschiede zwischen C++ und Java eingegangen. Weiterhin findet sich eine Analyse, welche Systemaufrufe die vorliegende Implementierung verwendet. Außerdem beschreibt Abschnitt 3 die Softwarearchitektur von „Java-Kad“ und ein Tool zum Debuggen und Testen der Portierung. Abschnitt 4 beschreibt den aktuellen Stand der Arbeit. Anknüpfende Untersuchungen / Arbeiten skizziert Abschnitt 5. Grundlagen 9 2 Grundlagen Im Rahmen dieser Arbeit wird das P2P-Protokoll „Kademlia“ zur Gerätevernetzung verwendet. Dieses Kapitel erläutert zunächst allgemeine P2P-netzwerktechnische Grundlagen. Anschließend findet sich eine Erläuterung zum gewählten P2P- Netzwerkprotokoll (Kademlia). Weiterhin beschreibt dieses Kapitel das der Kademlia-C++Implementierung „Kad“ zugrundeliegende Echtzeitbetriebssystem FreeRTOS. Anschließend findet sich ein Abschnitt, der die Wahl auf die Sprache „Java“ zur Portierung begründet. Der Projektkontext dieser Arbeit soll ebenfalls betrachtet werden. 2.1 P2P-Netzwerke Häufig ist in Computernetzwerken eine zentralisierte Architektur zu finden. Server und Clients bilden dabei die grundlegenden Gerätetypen. Im Zentrum befindet sich ein Server, der von vielen Clients kontaktiert wird. Ein Anwendungsbeispiel (Abbildung 1) ist das File Transfer Protokoll (FTP) [11]. Ein zentraler FTP-Server stellt Dateien zur Verfügung. Weiterhin können Clients Dateien auf dem Server speichern. Eine solche zentralisierte Netzwerktopologie weist einen serverseitigen Flaschenhals auf. Die Netzwerkanbindung des Servers kann maximal ausgelastet sein, so dass weitere Anfragen von Clients nicht mehr beantwortet werden können. Es kommt zu einem Ausfall der Dienstverfügbarkeit (Denial of Service) [12]. Grundlagen 10 ftp://username:password@host:port/path Server Client Abbildung 1: Server-Client-Konzept am Beispiel von FTP [12] Im Gegensatz zum Server-Client-Prinzip steht das P2P-Paradigma (Abbildung 2). Server und Clients werden nicht mehr getrennt voneinander betrachtet. Ein Peer kann sowohl Server- als auch Client-Funktionalität annehmen. Soll eine große Datenmenge, wie beispielsweise ein Film, vom Netzwerk bezogen werden, so können mehrere Knoten (Peers) die Daten bereitstellen. Die Netzwerklast lässt sich besser verteilen. Eine Architektur dieser Art weist keinen SPoF mehr auf. Fallen ein oder mehrere Knoten aus, so kann das gesamte Netzwerk weiterarbeiten. Dies ist möglich, da sich Daten redundant im Netzwerk speichern lassen. Durch die erhöhte Ausfallsicherheit von P2P-Netzwerken sind solche Netzwerkarchitekturen für industrielle Anwendungen denkbar [12]. Grundlagen 11 Abbildung 2: Dezentrale, vollständig vermaschte P2P-Netzwerkstruktur [12] Abbildung 2 zeigt eine Form der logischen Verknüpfung von Knoten. Diese Schicht wird als „logisches Overlay“ bezeichnet. Demgegenüber steht der physikalische Netzwerkaufbau, auch als physikalisches Underlay benannt. Knoten, die auf der logischen Verknüpfung benachbart sind, können in dem physikalischen Underlay durch eine netzwerktechnische Distanz voneinander getrennt sein [12]. große Grundlagen 12 5 4 1 3 2 logisches Overlay 4 3 1 physikalisches Underlay 2 5 Abbildung 3: Vergleich logisches Overlay / physikalisches Underlay [12] Abbildung 3 zeigt, dass die Knoten 1 und 2 im logischen Overlay direkt verbunden sind und somit eine geringe netzwerkstechnische Distanz aufweisen. Das P2P-Netzwerk ist vollständig vermascht. Das physikalische Underlay hingegen beschreibt die reale Verknüpfung der Rechner. Hierbei weisen die Knoten 1 und 2 eine große Distanz auf, da sich mehrere Netzwerkgeräte (z.B. Switches oder Router) zwischen ihnen befinden. P2PNetzwerke lassen sich anhand ihres logischen Overlays klassifizieren (Tabelle 1) [12]. Grundlagen 13 Unstrukturiert Strukturiert Zentral Dezentral Hybrid DHT basiert - Zentrale Instanz - zentrale Instanz - Gruppenbildung - keine Verwendung managet Netzwerk nicht vorhanden von mehreren einer zentralen - Managementeinheit - Rechner lassen Knoten Instanz verweist auf Knoten sich aus dem - Gruppen werden - Gesamtnetzwerk - Management stellt Netzwerk nehmen, durch Super-Peers bleibt nach Ausfall SPoF dar ohne dass das vertreten beliebiger Rechner Gesamtnetzwerk - Netzwerk bleibt intakt. ausfällt bei Ausfall eines beliebigen Rechners bestehen Bsp.: Napster Bsp.: Gnutella 0.4 Bsp.: JXTA Bsp.: Kademlia Tabelle 1: Klassifizierung von P2P-Netzwerken [13] Die zwei Hauptgruppen sind die unstrukturierten und die strukturierten Netzwerke. Weiterhin lässt sich die unstrukturierte Gruppe in zentralisierte, dezentralisierte und hybride Netzwerke klassifizieren. Bei einem unstrukturierten P2P-Netzwerk erfolgt im Gegensatz zu den strukturierten Netzwerken keine systematische Bindung von Daten an bestimmte Knoten. Abbildung 4 zeigt die schematische Darstellung der einzelnen P2P-Netzwerktypen. Bei einem unstrukturierten zentralisierten Ansatz organisiert ein zentraler Server die Verbindungen zwischen allen Peers. Der Server, welcher einen SPoF darstellt, fehlt bei einem unstrukturierten dezentralen P2P-Netzwerk. Weiterhin existiert eine hybride Form zwischen zentralisierten und dezentralisierten unstrukturierten Netzwerken. Dabei werden die Peers in Gruppen zusammengefasst, die durch jeweils einen Super-Peer verwaltet werden. Der Super-Peer trägt die Kommunikation zwischen den einzelnen Gruppen [12], [14]. Grundlagen 14 a) unstrukturiert, zentralisiert (Verbindungen zum zentralen Server in Rot markiert) c) unstrukturiert, hybrid (Super-Peers in Rot markiert) b) unstrukturiert, dezentralisiert d) strukturiert, DHT-Ring Abbildung 4: P2P-Netzwerktypen [14] In einem strukturierten Distributed Hash Table (DHT) -basierten P2P-Netzwerk erfolgen eine Zuordnung von Daten zu den Knoten und eine feste Adressierung von Daten und Knoten. Bei einem DHT-basierten Verfahren existiert ein Ring, der den Adressraum mit nBit darstellt (Abbildung 5). Jeder Knoten erhält über den Hashwert, beispielsweise gebildet über seine IP-Adresse, seinen Platz auf den DHT-Ring. Um eine Zuordnung der Daten zu erreichen wird ebenfalls der Hashwert über z.B. den Dateinamen gebildet. Befindet sich dieser Hashwert im Bereich um einen Knoten, so ist dieser Knoten für die Verwaltung dieses Datums zuständig. Es lassen sich neben Daten auch Services den Peers zuordnen. Es entsteht eine Service-orientierte Architektur [15] [12]. Grundlagen 15 2n-1 0 Peer Datum/Service Abbildung 5: Distributed Hash Table Ring [12] Da bei einem DHT-basierten P2P-Netzwerk keine zentrale Instanz, die zu einem SPoF führt, vorhanden ist und die Daten strukturiert im Netzwerk abgelegt werden, fiel die Wahl auf den Vertreter „Kademlia“. Grundlagen 16 2.2 Kademlia 2002 entwickelten Petar Maymounkov und David Mazieres von der University of New York Kademlia. Dieses Protokoll basiert auf einer Distributed Hash Table (DHT). Über die DHT können Daten in strukturierter Form abgelegt und abgerufen werden [12]. Das Netzwerk organisiert sich über die DHT selber. Verschiedene Anwendungen können auf Kademlia aufsetzen und dessen Vorteile (einfache Integration neuer Knoten, dezentrale Verwaltung, geringe Suchkomplexität) nutzen [12]. Wenn ein neuer Knoten einem bestehenden Kademlia-Netzwerk beitritt, führt er den Bootstrap-Vorgang aus. Dabei wird ein vorher bekannter, dem Netzwerk angehöriger, Knoten kontaktiert. Dieser antwortet mit zufälligen Einträgen aus seiner Routingtabelle. Die Routingtabelle enthält unter anderem Informationen über Hashwert und zugehörige IPAdresse eines Knotens. Der neu beigetretene Knoten besitzt nach dem Bootstrap-Vorgang Informationen über Kontakte und ist somit in das Kademlia-Netzwerk eingebunden. Knoten haben eine Lebensdauer, bei deren Ablaufen dieser Knoten angesprochen wird. Wenn der Knoten nicht antwortet, wird die Routingtabelle durch Entfernen des entsprechenden Eintrags aktualisiert. Kademlia weist im Gegensatz zu unstrukturierten zentralisierten Systemen keinen SPoF auf. Durch die ebene Hierarchie kann jeder Knoten durch einen anderen Knoten ersetzt werden [12]. Die C++-Implementierung von Kademlia, „Kad“, nutzt den MD4-Algorithmus um Hashwerte zu berechnen. Der Hashwert eines Knotens ergibt sich beispielsweise über dessen IP-Adresse. Dem Hashwert entsprechend erhält der Knoten seinen Platz auf dem DHT-Ring. Soll ein Datum im Kad-Netzwerk gefunden werden, so wird die XOR-Distanz zwischen Hashwert des Datums und des Knotens gebildet. Liegt die XOR-Distanz in der Suchtoleranz eines Knotens (Bereich um einen Knoten herum), so ist dieser Knoten für die Verwaltung dieses Datums zuständig. Dieses Verfahren wird als Prefix-Matching-Verfahren bezeichnet. Eine Übereinstimmung vieler führender Bits ergibt eine kleine Distanz. Ein Vorteil vom strukturierten P2P-Netzwerk Kademlia ist die Suche von Daten, die nie zu einem FalseNegative-Ergebnis führt, wenn die Suchtoleranz genügend groß ist [12]. Netzwerke, die auf DHT basieren, weisen eine geringe Suchkomplexität von 𝑂(log 2 ( 𝑛)) auf. Dies wird durch eine Routingtabelle ermöglicht, die sich in einem binären Baum organisiert (Abbildung 6). Die Kontakte eines Knotens befinden sich in dessen Routingtabelle. Dieses Routing bezieht sich, im Gegensatz zum Routing auf IP-Ebene, auf die Anwendungsebene von Kademlia [12]. Grundlagen 17 XOR-Distanz in einem 4-Bit Adressraum 1111 0000 1 0 1 0 1 Knoten 0 1 0 Kontakte des Knotens k-Bucket Abbildung 6: Suchkomplexität O(log2(N)) durch binären Baum [12] Um Knoten in einem Kademlia-Netzwerk zu finden, kann ein iterativer (Abbildung 7) oder ein rekursiver (Abbildung 8) Suchvorgang durchgeführt werden. Der Zielhashwert ist entweder der Hashwert des gesuchten Knotens oder liegt im Bereich der Suchtoleranz des Zielknotens. Beim iterativen Suchvorgang kontaktiert der suchende Knoten sukzessive andere Knoten. Dabei antwortet jeder Knoten mit einem Kontakt aus seiner Routingtabelle, der im nächsten Iterationsschritt angesprochen wird. Dieser Vorgang wird solange wiederholt, bis der Zielknoten erreicht ist. Alternativ können Knoten über den rekursiven Suchvorgang erreicht werden. Dabei leitet der vom suchenden Knoten angesprochene Knoten die Suchanfrage direkt an den nächsten Knoten weiter. Erst der Zielknoten schickt eine Antwort an den suchenden Knoten. Ein Vorteil ist die geringere Suchlatenz, da im Gegensatz zum iterativen Suchalgorithmus keine Pakete von allen Knoten zum suchenden Knoten gesendet werden. Um eine erfolgreiche Suche zu gewährleisten, sollte kein Knoten innerhalb der Suchkette ausfallen [12]. Grundlagen 18 1 2 3 4 Zielknoten 5 Suchender Knoten 6 Abbildung 7: Iterativer Suchvorgang [12] 2 1 3 Zielknoten Suchender Knoten 4 Abbildung 8: Rekursiver Suchvorgang [12] Kad wurde in der Sprache C++ implementiert. Innerhalb von Kad finden sich Betriebssystemaufrufe des Echtzeitbetriebssystems FreeRTOS. Dadurch ist die Software an eine feste Softwareplattform gebunden. Außerdem existiert eine Hardwareabhängigkeit, da FreeRTOS nur auf bestimmten Architekturen ausgeführt werden kann. Der folgende Abschnitt beschreibt FreeRTOS. Grundlagen 19 2.3 FreeRTOS FreeRTOS [16] ist ein von Real Time Engineers Ltd. stammendes Echtzeitbetriebssystem. Es unterstützt 35 Architekturen. Programme basierend auf FreeRTOS lassen sich in Threads aufteilen. So ist es beispielsweise möglich, einen Thread zum Empfang von Netzwerkpaketen aufzusetzen. Über verschiedene Kommunikationsmechanismen, wie Message Queues, Semaphoren und Mutexe, können andere Threads die empfangenen Pakete weiterverarbeiten. Den einzelnen Threads lassen sich Prioritäten zuweisen, sodass sich über ein prioritäts-basiertes Scheduling ein zeitlich deterministisches Programmverhalten erzielen lässt. Weiterhin beinhaltet FreeRTOS den lwip-Stack. Dies ist ein „leichtgewichtiger“ TCP/IP-Stack zur Netzwerkkommunikation [17]. Da Kad durch die Programmierung in C++ an die Verwendung der entsprechenden Betriebssystemaufrufe (Threadmanagement, Semaphoren, Mutexe, Netzwerkkommunikation) von FreeRTOS gekoppelt ist, soll Kad zur Erhöhung der Plattformunabhängigkeit in die Programmiersprache Java portiert werden. 2.4 Java Java eignet sich als Programmiersprache für die Gerätevernetzung, da sie eine plattformunabhängige Sprache ist (Abbildung 9). Der Java-Quellcode wird zunächst in einen Byte-Code übersetzt und anschließend auf einer Java virtual machine (virtuelle Java Maschine, kurz: JVM) ausgeführt. JVMs sind für verschiedene Systeme verfügbar. Somit ist es beispielsweise möglich, die Java-Anwendung auf einem Windows-Rechner zu entwickeln und zu testen und auf einem Linux-Rechner, wie dem Einplatinen-Computer Raspberry Pi [18], laufen zu lassen. Neben der Unabhängigkeit vom verwendeten Betriebssystem besteht eine Unabhängigkeit von der Hardwareplattform. Weiterhin bietet das mobile Betriebssystem Android die Möglichkeit, die Apps in Java zu entwickeln. Diese Apps laufen in einer virtuellen Maschine (VM) namens Dalvik [19]. Ab Android der Version 4.4 ist eine VM mit verbesserter Performance, genannt ART [20], verfügbar. Grundlagen 20 Java Quelltext Compiler Java Bytecode Java Virtual Machine Betriebssystem Hardware Abbildung 9: Java Abstraktion [21] 2.5 Projektkontext Diese Arbeit steht im Kontext eines größeren Projektes zur P2P-basierten Gerätevernetzung. Abbildung 10 zeigt den Verlauf mit dessen Phasen. 2007 begann die Entwicklung eines verteilten DNS (P-DONAS [22]), eines Systems zur verteilten Berechnung (DuDE [23]) sowie einer Architektur, die eine verteilte Speicherung ermöglicht. Die Softwareentwicklung erfolgte in der Programmiersprache C++ auf einem Windowsrechner, basierend auf einer x86-Architektur. Eine Ausführung der Software auf einem x86-64 Prozessor ist ebenfalls möglich. In der nächsten Projektstufe im Jahr 2009 wurde der Anwendungsfall „P-DONAS“ auf eine andere Hardwareplattform übertragen. Dabei kamen Virtex 4/5 [24] Entwicklungsboards zum Einsatz. Diese basieren auf einem PowerPC [25], auf dem ein Linux-ähnlicher Xilkernel [26] ausgeführt wird. In der dritten Projektstufe (2012) ist es möglich, Anwendungen echtzeitfähig zu machen. Das P2P-Netzwerk basiert auf dem Echtzeitbetriebssystem „FreeRTOS“. Der zeitlich deterministische Datenaustausch zwischen einzelnen Knoten erfolgt über Zeitschlitze. Die Zeitsynchronisierung lässt sich in dezentraler Form durchführen [27]. dafür notwendige Grundlagen 21 Zur Entwicklung von echtzeitfähigen Anwendungen, wie HaRTKad [28] (zur Industrieautomatisierung), und nicht echtzeitfähigen Anwendungen, wie MultiKad [29] (Smart City/Home) und Geräte-Discovery/Eventing, CoHaRT (HartKad mit CoAP Block Transfer zur Dateiübertragung), werden ZedBorads [30] mit einem ARM-Prozessor [31] genutzt. Phase vier verfolgt die Verwendung von Kad auf Raspberry Pi’s mit einem ARMProzessor als Hardwareplattform und einem RT-Linux als Softwareplattform. Dabei handelt es sich um ein echtzeitfähiges Linux mit einem Preemptive-Patch[32], der EchtzeitScheduling und Unterbrechbarkeit von Kernel-Routinen ermöglicht. Die Anwendungssoftware samt P2P-Netzwerk wird nach wie vor in der Sprache C++ entwickelt. Da die Software bislang jeweils an eine spezielle Hardwareplattform und an ein Betriebssystem gebunden war, soll mit dieser Arbeit eine Plattformunabhängigkeit erreicht werden. Dies lässt sich durch die Verwendung der plattformunabhängigen Sprache Java erzielen. Dazu soll die C++-Implementierung des P2P-Protokolls Kademlia namens Kad in Java portiert werden. Allerdings verliert das System durch die Verwendung einer Java virtual machine (virtuelle Java Maschine) die Echtzeitfähigkeit. Herkömmliche Java virtual machines sind nicht Echtzeitfähig, da nicht mehr benötigter Speicher durch einen „Garbage Collector“ freigegeben wird. Der Garbage Collector arbeitet sporadisch, sodass keine zeitlich deterministische Ausführung einer Java-Anwendung möglich ist. Die Zukunftsvision beschreibt neben Unabhängigkeit gegenüber einer Hardware und eines Betriebssystems die Echtzeitfähigkeit. Dieses Ziel lässt sich durch die Verwendung einer echtzeitfähigen virtuellen Maschine für Java erreichen. Abbildung 10: Projektverlauf ZedBoard (ARM) Virtex 4/5 (PowerPC, Microblaze) Desktop-PC (x86/x64) Nein Geräteklasse/ (Architektur) Echtzeitfähigkeit Anwendungen C++ C++ C++ Programmiersprache Ja (soft) Raspb. Pi (ARM) - Smart City/Home: - Geräte Discovery (MultiKad) - Eventing - Industrieautomatisierung (HaRTKad) - CoAP Block Transfer (CoHaRT) - Verteiltes Netzwerkmanagement Nein unabhängig Java unabhängig RT Linux (Preemp.Patch Kernel) C++ 2015 2014 - DNS (P-DONAS), verteilte Berechnung (DuDE), verteilte Speicherung (PSP) Ja (hart) FreeRTOS Xilkernel/ Linuxlike Windows OS Nein 2012 2009 2007 Alle bisherigen Anwendungen Ja (über RT VM) unabhängig Java unabhängig Vision Grundlagen 22 Implementierung 23 3 Implementierung Dieses Kapitel beschreibt die Implementierungsdetails der Portierung von Kad (C++) in die Sprache Java. Dazu werden zunächst die relevanten Unterschiede zwischen C++ und Java erläutert. Die von Kad verwendeten Systemaufrufe von FreeRTOS sollen in Abschnitt 3.2 aufgezeigt und die äquivalenten Verwendungen in der JVM beschrieben werden. Anschließend erläutert Abschnitt 3.3 die grundlegende Softwarearchitektur. Abschnitt 3.4 beschreibt das zum Debuggen und Testen verwendete Komandozeilen-Tool. 3.1 Wesentliche Unterschiede zwischen C++ und Java C++ und Java sind objektorientierte Sprachen, dennoch unterscheiden sie sich in einigen Merkmalen. An dieser Stelle sollen nur die für die Portierung wesentlichen Unterschiede betrachtet werden. In C++ erfolgt die Verwaltung der einzelnen Quellcodedateien über Header-Dateien [33]. In einer Header-Datei können weitere Header eingefügt sein. Java ermöglicht typische Header-Datei-Funktionen über Interfaces [34]. Ein Interface beinhaltet die Methodendeklarationen einer Klasse. Unter Java lässt sich der Quellcode über Packages strukturieren. Ein Package (Paket) enthält Klassen und Typen [35]. Bei der Portierung von C++ zu Java wurde darauf geachtet eine übersichtliche Codestruktur beizubehalten. Wenn ein Programm während der Laufzeit Speicher benötigt, fordert es diesen über eine malloc-Funktion an [36]. Solange genügend freier Speicher vorhanden ist, kann der Speicher über malloc reserviert werden. Wird der Speicher nicht mehr benötigt, muss die Freigabe explizit im Quellcode angegeben werden [37]. In Java lässt sich neuer Speicher über „new“ allokieren. Nicht mehr benötigter Speicher muss nicht explizit freigegeben werden. Die Freigabe managet ein sogenannter „Garbage Collector“ [38], welcher Bestandteil der Java Laufzeitumgebung ist. Durch das nicht-deterministische Zeitverhalten des Garbage Collectors ist keine Echtzeitfähigkeit möglich. Die Sprache C++ sieht zwei Möglichkeiten zur Parameterübergabe an Methoden vor: „Call by Value“ und „Call by Reference“. Bei einer Call by Value - Übergabe erfolgt nur ein Austausch des Wertes einer Variablen. Innerhalb der mit Call by Value aufgerufenen Methode wird mit einer Kopie der Variablen gearbeitet. Wird die Methode über ein Call by Reference - Verfahren aufgerufen, so wird die Variable selber übergeben. Aufrufende und aufgerufene Methode arbeitet jeweils mit derselben Variablen. Implementierung 24 Java sieht nur einen Call by Reference - Aufruf vor. Soll sichergestellt werden, dass aufrufende und aufgerufene Methode mit der gleichen Variablen arbeiten, so muss der aufgerufenen Methode eine Kopie übergeben werden. 3.2 Systemaufrufe von FreeRTOS Da Kad Funktionalitäten von FreeRTOS aufruft, ist Kad an diese Plattform gebunden. Die Systemaufrufe müssen in äquivalente Aufrufe der Java-Laufzeitumgebung (Java Runtime Environment) portiert werden. Java Runtime Environment FreeRTOS Threads Semaphoren / Mutexe Sockets komplexe Datentypen Zeitmessung Abbildung 11: Systemaufrufe Abbildung 11 zeigt, welche Hauptfunktionalitäten in FreeRTOS von Kad verwendet werden. Das Programm unterteilt sich in einzelne Threads. Zur Synchronisierung zwischen den Threads finden Semaphoren bzw. Mutexe Verwendung. Die Netzwerkkommunikation erfolgt über Sockets. Um Daten abzulegen, finden sich komplexe Datentypen, wie Warteschlangen, Maps und Listen. Um Zeiten zu messen, finden sich in Kad entsprechende FreeRTOS-Aufrufe. Alle genannten Funktionen sollen näher erläutert werden: Um das Programm zu strukturieren und eine parallele Ausführung zu ermöglichen, wurde Kad in einzelne Threads unterteilt. Eine genauere Beschreibung der Softwarearchitektur findet sich in 3.3. Eine Java-Klasse, die den auszuführenden Code beinhaltet, muss das Interface „java.lang.Runnable“ [39] implementieren. Implementierung 25 Das Interface schreibt vor, dass die Klasse eine Implementierung für eine run-Methode liefern muss. In der run-Methode befindet sich die Funktionalität des Threads. Beim Erstellen eines Threads wird dem Thread-Konstruktor ein Objekt übergeben, dass die runMethode enthält. Der Thread als instanziiertes Objekt kann über die Methode „start()“ [40] ausgeführt werden [35]. Wenn einzelne Threads auf gemeinsame Daten zurückgreifen, muss der Zugriff synchronisiert werden. Dazu lassen sich Semaphoren verwenden. Die Semaphore zählt, wie viele Teilnehmer maximal auf die Ressource zugreifen dürfen. Ist die maximale Zahl erreicht, müssen alle anderen Teilnehmer, die ebenfalls auf die Ressource zurückgreifen wollen, warten. Ein Mutex ist ein Sonderfall eines Semaphors, da bei einem Mutex nur maximal ein Teilnehmer (Thread) auf die Ressource zugreifen darf. Die in FreeRTOS verwendeten Semaphoren und Mutexe lassen sich ebenfalls in Java verwenden. Für Semaphoren steht die Klasse „java.util.concurrent.Semaphore“ [41] zur Verfügung. Wenn ein Semaphoren-Objekt instanziiert wird, so muss im Konstruktor die Anzahl an maximal auf die Ressource zugreifenden Teilnehmern definiert werden. Ist dieser Wert eins, handelt es sich um einen Mutex. Die Methodenaufrufe zum Belegen und Freigeben eines Semaphors wurden angepasst [42]. Damit die Software über das Netzwerk Pakete austauschen kann, sind Sockets notwendig. Diese sind durch das Transportprotokoll (TCP [43] oder UDP [44]), die eigene IP-Adresse [45] und den Port definiert. Die Original-Implementierung von Kad nutzt zum Arbeiten mit Sockets den lwIP-Stack. Unter Java findet sich die Klasse java.net.DatagramSocket, um UDP-Sockets aufzusetzen und zu verwalten [46]. Eine Datenübertragung über TCP wird in Kad nicht genutzt. Ankommende Pakete werden innerhalb von Kad in eine Warteschlange eingeordnet. Als First-In-First-Out-Speicher (FIFO-Speicher) wird eine „Linked List“ genutzt. Neue Elemente werden an das Ende der Liste angefügt. Das Lesen und das damit verbundene Entfernen eines Elements von der Liste geschehen beim ersten Listenelement. Java liefert dafür die Klasse java.util.LinkedList [47]. Weiterhin finden sich in Kad „Hash-Maps“ als komplexe Datentypen. Dabei wird einem Wert ein Schlüssel (Hashwert) zugeordnet. Es entsteht die Hash-Map, ein Paar aus zwei Elementen (Wert und Hashwert) [48]. Für Echtzeitanwendungen [27] sind Zeitmessungen notwendig. Die ursprüngliche KadImplementierung greift auf einen Mikrosekundentimer von FreeRTOS zu. Um Zeitmessungen in Java durchzuführen, liefert Java den aktuellen Wert der Systemzeit in der Einheit „Nanosekunden“ [49]. Die Zeitwerte lassen sich in Mikrosekunden umrechnen. Implementierung 26 3.3 Grundlegende Softwarearchitektur Kad-Funktionalität Kad-Netzwerk User-Interface KadClient Abbildung 12: Netzwerkaufbau Die zu portierende Kad-Software besteht aus einem Teil zur Kommunikation mit dem KadNetzwerk und einer Schnittstelle zur Kommunikation mit einem Client, der sich außerhalb des Kad-Netzwerkes befindet (Abbildung 12). Anfragen, die vom Client an einen Knoten gesendet werden, müssen ausgewertet werden. Dazu bildet der Knoten die XOR-Distanz zwischen seinem eigenen Hashwert und den Zielhashwert. Wenn das Ergebnis innerhalb der Suchtoleranz liegt, wird die Anfrage direkt vom Knoten an den Client zurückgeschickt. Ein Ergebnis außerhalb der Suchtoleranz bewirkt, dass eine Suche innerhalb des Kad Netzwerkes angestoßen wird. Implementierung 27 Thread-Generierung Start Thread-Generierung Nein Nein Semaphor für Empfang gesetzt? PaketEmpfang Schreiben des Pakets in die Warteschlange Warteschlange Ja 1 Lese Paket aus Warteschlange Semaphor für Senden gesetzt? Warteschlange 1 2 3 Setzen der Semaphoren für den Empfang PaketVerarbeitung (Abbildung 14) Schreiben des zu sendenden Pakets in die Warteschlange Thread für den PaketEmpfang Ja Lese Paket aus Warteschlange 2 3 Sende Paket Thread für das PaketSenden Setzen der Semaphor für das Senden an Nutzer oder Kad Threads für die PaketVerarbeitung Thread-Terminierung Thread-Terminierung Ende Thread-Terminierung Abbildung 13: Kommunikation zwischen Threads [12] Abbildung 13 beschreibt die einzelnen Threads zur Paketverarbeitung genauer. Dabei empfängt ein Thread die Pakete über einen UDP-Socket und schreibt sie in eine Warteschlange. Das Setzen eines Semaphors signalisiert einem anderen Thread, dass ein neues Paket aus der Warteschlange gelesen werden soll. Für jedes empfangene Paket wird ein neuer Thread für dessen Auswertung gestartet. Nachdem das Paket der Warteschlange entnommen wurde, erfolgt die Paketverarbeitung. Daraufhin wird ein Antwortpaket erstellt und über eine weitere Warteschlange einem Sende-Thread übergeben. Ein Semaphor steuert den Lesevorgang aus der Warteschlange. Der Sende-Thread verschickt das gelesene Paket über einen UDP-Socket. Implementierung 28 Start Bestimmung der XORDistanz zu eigenem Knoten Opcode == Request Read? Ja Distanz <= Suchtoleranz Ja Antwortpaket mit Zufallszahl erstellen Ende Nein Opcode == Request Store Distanz <= Suchtoleranz Ja Ja Antwortpaket erstellen Ende Nein Nein Nein Ende Suche des zuständigen Knotens an KadNetzwerk weiterleiten Ende Abbildung 14: Paketverarbeitung [12] Abbildung 14 zeigt die Paketverarbeitung jedes einzelnen Pakets. Jeder Thread für die Paketverarbeitung führt die dargestellte Routine durch. Nachdem ein Paket empfangen wurde, erfolgt eine Auswertung des Opcodes. Dieser beschreibt die Art der Pakete. In dem implementierten Anwendungsfall finden sich zwei verschiedene Opcodes: eine Anfrage zum Lesen (Request Read) eines Wertes und eine Anfrage zum Speichern (Request Store) eines Wertes. Nachdem der Opcode bekannt ist, wird bestimmt, ob der Knoten für die Anfrage zuständig ist, oder die Anfrage an das Kad Netzwerk weitergeleitet werden muss. Ist der angesprochene Knoten zuständig, antwortet er auf einen Request Read mit einer Zufallszahl. Bei einem Request Store sendet der Knoten das abzuspeichernde Datum an den Absender zurück. Dieses Übertragungsprotokoll ist unabhängig vom Kad-Protokoll und dient für Testzwecke, bzw. eine Instrumentierung des Kad-Clients. Implementierung 29 3.4 Kad-Client Wie in Abbildung 12 dargestellt, kommuniziert ein Client mit dem Kad-Netzwerk. Zum Testen wurde ein Kommandozeilentool (Abbildung 15) implementiert, welches UDPDatagramme an einen Kad-Knoten sendet. Die UDP-Datagramme können benutzerdefiniert erstellt werden. Abbildung 15: Kad-Client auf Windows Rechner Über den Client lässt sich die UDP-Payload Byte-weise definieren. Die ersten zwei Byte beschreiben den Opcode. Im dargestellten Beispiel bedeutet eine „80“ den hexadezimalen Wert „0x80“, welcher eine Anfrage zum Lesen eines Wertes aus dem Kad-Netzwerk kodiert. Zwei weitere Bytes geben in dezimaler Form die Anzahl der zu lesenden Werte an. In diesem Fall sind es zwei. Die nächsten vier Bytes beschreiben den Zielhashwert (im Beispiel: 0x6466) in hexadezimaler Form. Durch Variation der Pakete konnten verschiedene Testfälle erprobt werden. Ergebnisse und Diskussion 30 4 Ergebnisse und Diskussion In dieser Arbeit wurde begonnen, die C++ Implementierung von Kademlia namens Kad in die Sprache Java zu portieren. Die Kommunikation zwischen Rechnern außerhalb des KadNetzwerks und einzelner Kad-Knoten konnte erfolgreich umgesetzt werden. Es ist möglich, Anfragen zum Speichern und Lesen von Werten zu dekodieren. Jeder Knoten ist in der Lage anhand der XOR-Distanz zwischen dem Zielhashwert und dem eigenen Hashwert zu bestimmen, ob der Knoten selbst für die Anfrage zuständig ist, oder ob die Anfrage an das Kad-Netzwerk weitergeleitet werden muss. Um die Performance der Implementierung abzuschätzen, wurde die Dauer der MD5Hashwert-Berechung ermittelt. Wird die C++-Implementierung von Kad, basierend auf FreeRTOS, auf einem ZedBorad verwendet, so ergibt sich eine Dauer von ca. 30 Mikrosekunden. Die Java-Kad-Software benötigt eine Ausführungszeit von ca. 30 Millisekunden auf einem Windows-PC. Die deutlich höhere Ausführungszeit der MD5Berechung auf dem PC lässt sich auf die Verwendung der Java virtual machine zurückführen. Während der Arbeit konnten relevante Unterschiede zwischen den Sprachen C++ und Java ermittelt werden. Weiterhin erfolgte eine Analyse der verwendeten Betriebssystemfunktionalitäten von FreeRTOS. Alle Systemaufrufe, wie das Starten und Beenden von Threads, die Interthreadkommunikation mittels Semaphoren und Mutexen, die Netzwerkkommunikation über Sockets und die mikrosekunden-genaue Zeitmessung, lassen sich in äquivalente Aufrufe der Java-Laufzeitumgebung portieren. Zusammen mit diesen Systemaufrufen und der Verwendung von komplexen Datentypen kann der bestehende Quellcode zur Kommunikation innerhalb des Kad-Netzes portiert werden. Zusammenfassung und Ausblick 31 5 Zusammenfassung und Ausblick Durch die Verwendung von Java wird eine Plattformunabhängigkeit erreicht. Alle Geräte, afür die eine Java Laufzeitumgebung verfügbar ist, können einen Kad-Knoten darstellen und einem Kad-Netzerk beitreten. Anwendungen, basierend auf Kademlia, nutzen die Eigenschaften, wie einfache Integration neuer Knoten in ein bestehendes Netzwerk, gute Skalierbarkeit durch geringe Suchkomplexität und hohe Ausfallsicherheit durch eine dezentrale Organisierung. Werden vernetzte Geräte im Industriebereich eingesetzt, ist neben einer hohen Ausfallsicherheit auch eine Echtzeitfähigkeit erforderlich. Diese geht durch die Verwendung einer herkömmlichen Java-Laufzeitumgebung anstelle eines Echtzeitbetriebssystems, wie FreeRTOS, verloren. Zukünftige Arbeiten müssen untersuchen, inwiefern sich eine Echtzeitfähigkeit mit einer geeigneten Laufzeitumgebung, ggf. oberhalb einer echtzeitfähigen Betriebssystemumgebung für Java realisieren lässt. Da Android Apps ebenfalls auf einer Java VM ausgeführt werden (Dalvik bzw. künftig ART), ist eine Android-Portierung der Java-Kad-Software anzustreben. Eine Recherche hat ergeben, dass die Aufrufe innerhalb der Java-Kad-Software zum Starten und Verwalten von Threads, die Verwendung von Semaphoren und Mutexen und die Nutzung und Verwaltung von Sockets ebenfalls unter Android verfügbar sind und der Portierungsauswand daher als gering einzuschätzen ist. Geräte, wie Android-Telefone, lassen sich unter anderem über eine WLAN-Verbindung miteinander vernetzen. Der bislang wenig bekannte WLAN-Standard IEEE 802.11s [50] bietet die Möglichkeit, WLAN-Mesh-Netzwerke ohne zentrale Instanz zu errichten. Dieser Standard definiert die physikalische und die MAC-Schicht der Vernetzung. Basierend auf diesen Netzwerkschichten können die physikalisch vermaschten Geräte über Kademlia ebenfalls dezentral auf Anwendungsschicht organisiert werden. Es entstehen, wie in 2.1 beschrieben, die zwei Schichten: physikalisches Underlay und logisches Overlay. Zukünftige Arbeiten untersuchen die Berücksichtigung netzwerktechnischer Nähe im logischen P2P-Overlay sowie den sinnvollen Einsatz verteilter P2P-Anwendungen oberhalb von physikalischen WLAN-Mesh-Netzwerken. Literaturverzeichnis 32 Literaturverzeichnis [1] Digital Living Network Alliance, “Webpage: DLNA for Industry.” [Online]. Available: http://www.dlna.org/. [Accessed: 26-Aug-2014]. [2] Microsoft, “Webpage: Windows - Microsoft Windows.” [Online]. Available: http://windows.microsoft.com/de-de/windows/home. [Accessed: 26-Aug-2014]. [3] Linux Foundation, “Webpage: The Linux Foundation.” [Online]. Available: http://www.linuxfoundation.org/. [Accessed: 26-Aug-2014]. [4] Apple Inc., “Webpage: Apple – OS X Mavericks – Noch mehr Möglichkeiten mit neuen Apps und Features.” [Online]. Available: https://www.apple.com/de/osx/. [Accessed: 26-Aug-2014]. [5] Microsoft, “Webpage: Windows Phone (Deutschland).” [Online]. Available: http://www.windowsphone.com/de-DE. [Accessed: 26-Aug-2014]. [6] Google, “Webpage: Android Developers.” [Online]. Available: http://developer.android.com/index.html. [Accessed: 22-Jul-2014]. [7] Apple Inc., “Webpage: Apple – iOS 7.” [Online]. Available: https://www.apple.com/de/ios/. [Accessed: 26-Aug-2014]. [8] P. Maymounkov and D. Mazières, “Kademlia: A Peer-to-Peer Information System Based on the XOR Metric,” New York University. [9] “Standard ISO/IEC 14882:2011, C++.” [Online]. Available: http://www.iso.org/iso/catalogue_detail.htm?csnumber=50372. [10] Oracle, “Webpage: java.com: Java + Sie.” [Online]. Available: https://www.java.com/de/. [Accessed: 22-Jul-2014]. [11] A. Bhushan, “RFC 354: THE FILE TRANSFER PROTOCOL,” 1972. [12] P. Danielis, “Dissertation: Peer-to-Peer Technologie in Teilnehmerzugangsnetzen,” Universität Rostock, 2012. [13] R. S. Jörg Eberspächer, “Peer-to-Peer Systems and Applications,” 28th ed., Berlin Heidelberg: Springer Verlag, 2005, pp. 35–56. [14] R. Gubitz, “Masterarbeit; Entwurf eines echtzeitfähigen Peer-to-Peer-Clients,” Universität Rostock, 2013. [15] Microsoft, “Understanding Service-Oriented Architecture.” [Online]. Available: http://msdn.microsoft.com/en-us/library/aa480021.aspx. [Accessed: 24-Sep-2014]. Literaturverzeichnis 33 [16] Bitwise Group, “FreeRTOS - Market leading RTOS (Real Time Operating System) for embedded systems supporting 34 microcontroller architectures,” 2013. [Online]. Available: http://www.freertos.org/index.html. [Accessed: 08-Jul-2013]. [17] A. Dunkels, “Design and Implementation of the lwIP TCP / IP Stack,” Swedish Institute of Computer Science, 2001. [18] Raspberry Pi Foundation, “Webpage: Raspberry Pi Documentation.” [Online]. Available: http://www.raspberrypi.org/documentation/hardware/README.md. [Accessed: 08-Sep-2014]. [19] Google, “Webpage: dalvik - Code and documentation from Android&#39;s VM team - Google Project Hosting.” [Online]. Available: https://code.google.com/p/dalvik/. [Accessed: 08-Sep-2014]. [20] Google, “Webpage: Introducing ART | Android Developers.” [Online]. Available: https://source.android.com/devices/tech/dalvik/art.html. [Accessed: 08-Sep-2014]. [21] Oracle, “Webpage: Introduction to Java in Oracle9i.” [Online]. Available: http://docs.oracle.com/cd/B10501_01/java.920/a96656/intro.htm. [Accessed: 08Sep-2014]. [22] P. Danielis, J. Skodzik, C. Lorenz, D. Timmermann, T. Bahls, and D. Duchow, “Paper: P-DONAS : A Prototype for a P2P-based Domain Name System in Access Networks,” Rostock. [23] J. Skodzik, P. Danielis, V. Altmann, J. Rohrbeck, D. Timmermann, T. Bahls, and D. Duchow, “Paper: DuDE: A distributed computing system using a decentralized P2P environment,” Ieee, Rostock, Oct. 2011. [24] Xilinx, “Virtex-4 FPGA User Guide,” 2008. [25] Xilinx, “PowerPC Processor Reference Guide,” 2003. [26] Xilinx, “Documentation: Xilkernel,” 2006. [Online]. Available: http://www.xilinx.com/ise/embedded/edk91i_docs/xilkernel_v3_00_a.pdf. [Accessed: 08-Sep-2014]. [27] J. Skodzik, P. Danielis, V. Altmann, and D. Timmermann, “Time Synchronization in the DHT-based P2P Network Kad for Real-Time Automation Scenarios,” 2nd IEEE WoWMoM Workshop on the Internet of Things: Smart Objects and Services (IoT-SoS) 2013, Madrid, Spain, 2013. [28] J. Skodzik, P. Danielis, V. Altmann, and D. Timmermann, “HaRTKad: A Hard Real-Time Kademlia Approach,” 11th IEEE Consumer Communications & Networking Conference (CCNC), 2014. [29] V. Altmann, J. Skodzik, P. Danielis, J. Müller, F. Golatowski, and D. Timmermann, “A DHT-based Scalable Approach for Device and Service Discovery,” 12th IEEE International Conference on Embedded and Ubiquitous Computing (EUC), 2014. Literaturverzeichnis 34 [30] “ZedBoard documentations,” 2013. [Online]. Available: http://www.zedboard.org/documentation. [Accessed: 06-Jul-2013]. [31] ARM Ltd., “Webpage: ARM - The Architecture For The Digital World.” [Online]. Available: http://www.arm.com/. [Accessed: 17-Sep-2014]. [32] J. Mitschang, “Harte Echtzeit unter Linux Fallstudie RTAI vs. RT-Preempt,” Fraunhofer IESE, Kaiserslautern, 2007. [33] cplusplus.com, “Webpage: Headers and Includes: Why and How - C++ Forum.” [Online]. Available: http://www.cplusplus.com/forum/articles/10627/. [Accessed: 11-Sep-2014]. [34] Oracle, “What Is an Interface? (The Java Tutorials, Learning the Java Language, Object-Oriented Programming Concepts).” [Online]. Available: http://docs.oracle.com/javase/tutorial/java/concepts/interface.html. [Accessed: 24Sep-2014]. [35] C. Ullenboom, Java ist auch eine Insel, Das umfassende Handbuch. Galileo Computing, 2011, p. 1482. [36] cplusplus.com, “Webpage: malloc - C++ Reference.” [Online]. Available: http://www.cplusplus.com/reference/cstdlib/malloc/. [Accessed: 11-Sep-2014]. [37] cplusplus.com, “Webpage: free - C++ Reference.” [Online]. Available: http://www.cplusplus.com/reference/cstdlib/free/. [Accessed: 11-Sep-2014]. [38] Sun Microsystems, “Memory Management in the Java HotSpot(TM) Virtual Machine,” 2006. [39] Oracle, “Webpage: Runnable (Java Platform SE 7 ).” [Online]. Available: http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html. [Accessed: 11Sep-2014]. [40] Oracle, “Webpage: Thread (Java Platform SE 7 ).” [Online]. Available: http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html. [Accessed: 11-Sep2014]. [41] Oracle, “Webpage: Semaphore (Java Platform SE 7 ).” [Online]. Available: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html. [Accessed: 11-Sep-2014]. [42] C. Ullenboom, Java 7 - Mehr als eine Insel, Das Handbuch zu den Java SEBibliotheken. Galileo Computing, 2012, p. 1433. [43] Darpa Internet Program, “RFC 793: Transmission Control Protocol,” California, 1981. [44] J. Postel, “RFC 768: User Datagram Protocol,” 1980. Literaturverzeichnis 35 [45] Information Sciences Institute and University of Southern California, RFC 791: INTERNET PROTOCOL DARPA INTERNET PROGRAM PROTOCOL SPECIFICATION. http://tools.ietf.org/pdf/rfc791.pdf, 1981. [46] Oracle, “Webpage: DatagramSocket (Java Platform SE 7 ).” [Online]. Available: http://docs.oracle.com/javase/7/docs/api/java/net/DatagramSocket.html. [Accessed: 11-Sep-2014]. [47] Oracle, “Webpage: LinkedList (Java Platform SE 7 ).” [Online]. Available: http://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html. [Accessed: 11Sep-2014]. [48] Oracle, “Webpage: HashMap (Java Platform SE 7 ).” [Online]. Available: http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html. [Accessed: 11Sep-2014]. [49] Oracle, “Webpage: System (Java 2 Platform SE 5.0).” [Online]. Available: http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/System.html. [Accessed: 11Sep-2014]. [50] W. Steven, J. Kruys, K. J. Kim, and J. C. Zuniga, “IEEE 802.11s Tutorial, Overview of the Amendment for Wireless Local Area Mesh Networking,” Dallas, 2006. Anhang Verwendete Java-Klassen Klassenname Package Thread java.lang.Thread Semaphore java.util.concurrent.Semaphore DatagramSocket java.net.DatagramSocket DatagramPacket java.net.DatagramPacket InetAddress java.net.InetAddress MessageDigest java.security.MessageDigest System java.lang.System Eidesstattliche Erklärung Hiermit erkläre ich an Eides statt, dass ich die vorliegende Arbeit selbstständig und ohne Benutzung anderer als der angegebenen Hilfsmittel angefertigt habe. Die aus den Quellen direkt oder indirekt übernommenen Gedanken sind als solche kenntlich gemacht. Die Arbeit hat mit gleichem bzw. in wesentlichen Teilen gleichem Inhalt noch keiner anderen Prüfungsbehörde vorgelegen. Ort, Datum Unterschrift