Paper - Lehre und Forschung Thorsten Strufe

Transcrição

Paper - Lehre und Forschung Thorsten Strufe
Fakultät für Informatik und Automatisierung
Institut für Praktische Informatik
Fachgebiet Telematik
DIPLOMARBEIT ZUR ERLANGUNG DES
AKADEMISCHEN GRADES DIPLOMINFORMATIKER
Thema:
Ezientes Routing in kooperativen
Multimedia-Streaming-Systemen
vorgelegt der Fakultät für Informatik und Automatisierung
der Technischen Universität Ilmenau von
Verfasser:
Thomas Sesselmann
geboren am:
25. Februar 1980
Inv.-Nr.:
2005-03-21/015/IN99/2253
verantwortlicher Hochschullehrer:
Prof. Dr.-Ing. Dietrich Reschke
betreuender wiss. Mitarbeiter:
Dipl.-Inf. Thorsten Strufe
Ort und Abgabe der Diplomarbeit:
Ilmenau, den 21. Juni 2005
1. Kurzfassung
Die Diplomarbeit Ezientes Routing in kooperativen Multimedia-Streaming-Systemen beinhaltet die Entwicklung eines eigenen Routings für ein Multimedia-StreamingSystem.
Nach der Untersuchung existierender Ansätze konnten die Anforderungen für ein geeignetes Routing festgelegt werden. Das Routing klassiziert die ihm bekannten Peers
nach ihrer Lokalität. Diese wird anhand virtueller Positionskoordinaten im Peer-toPeer-Netzwerk berechnet und teilt für jeden Peer die bekannten Peers in Horizonte
ein. Nach der Implementierung des entworfenen Routings soll eine Integration in das
Multimedia-Streaming-System
ekStream
erfolgen und die Funktionalität durch einen
Test gezeigt werden.
2005-03-21/015/IN99/2253
3
1. Kurzfassung
4
2005-03-21/015/IN99/2253
Inhaltsverzeichnis
1. Kurzfassung
Inhaltsverzeichnis
2. Einleitung
3. Grundlagen
3
8
9
11
3.1.
Kooperatives System
3.2.
Routing
3.3.
Multicast
3.4.
Multicastrouting
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
3.5.
Lokalität . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
3.6.
Peer-to-Peer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
3.6.1.
Organisationsformen für verteilte Systeme
. . . . . . . . . . . .
18
3.6.2.
Ziele von P2P-Systemen
. . . . . . . . . . . . . . . . . . . . . .
19
3.6.3.
Lookup in P2P-Systemen . . . . . . . . . . . . . . . . . . . . . .
20
3.7.
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
Multimedia-Streaming
. . . . . . . . . . . . . . . . . . . . . . . . . . .
4. Verwandte Ansätze
4.1.
4.2.
4.3.
4.4.
4.5.
4.6.
Host-Based Multicast . . . . . .
CoopNet . . . . . . . . . . . . .
SplitStream . . . . . . . . . . .
Layered Peer-to-Peer Streaming
Service Adaptive Multicast . . .
PeerCast . . . . . . . . . . . . .
2005-03-21/015/IN99/2253
21
23
. . . . . . . . . . . . . . . . . . . . . .
23
. . . . . . . . . . . . . . . . . . . . . .
24
. . . . . . . . . . . . . . . . . . . . . .
25
. . . . . . . . . . . . . . . . . . . . . .
26
. . . . . . . . . . . . . . . . . . . . . .
27
. . . . . . . . . . . . . . . . . . . . . .
28
5
Inhaltsverzeichnis
4.7.
Scattercast . . . . . . .
End System Multicast
Zigzag . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
28
. . . . . . . . . . . . . . . . . . . . . . . . . . .
29
. . . . . . . . . . . . . . . . . . . . . . . . . . .
29
4.10. Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
4.8.
4.9.
5. Anforderungen
35
5.1.
Allgemeine Anforderungen an das System
. . . . . . . . . . . . . . . .
35
5.2.
Funktionale Anforderungen
. . . . . . . . . . . . . . . . . . . . . . . .
36
5.3.
Nicht funktionale Anforderungen
. . . . . . . . . . . . . . . . . . . . .
6. Entwurf
39
6.1.
P2P-Streaming-Modell
. . . . . . . . . . . . . . . . . . . . . . . . . . .
39
6.2.
Lokalität . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
40
6.2.1.
Vivaldi
6.2.2.
Eigene Abwandlung des
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
45
6.3.
Routing
6.4.
Lokalisierung
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
46
6.4.1.
Fluten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
46
6.4.2.
Registrieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47
6.4.3.
Eigene Ideen . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47
7.1.
Architektur von
7.2.
Routing
7.3.
7.4.
Vivaldi -Ansatzes .
41
. . . . . . . . . . . .
7. Implementierung
6
36
ekStream
49
. . . . . . . . . . . . . . . . . . . . . . . . .
49
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
51
7.2.1.
Schnittstellen
7.2.2.
Statisches Routing
7.2.3.
Einfaches dynamisches Routing
7.2.4.
Lokalitätsbewusstes dynamisches Routing
Lokalisierung
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
52
53
54
. . . . . . . . . . . .
62
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
7.3.1.
Schnittstellen
7.3.2.
Einfache Lokalisierung
Admission Control
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
. . . . . . . . . . . . . . . . . . . . . . .
72
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
76
7.4.1.
Schnittstellen
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.4.2.
Statisches Admission Control
. . . . . . . . . . . . . . . . . . .
77
77
2005-03-21/015/IN99/2253
Inhaltsverzeichnis
7.4.3.
Einfaches Admission Control . . . . . . . . . . . . . . . . . . . .
8. Test
78
81
8.1.
Testumgebung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
81
8.2.
Verlauf des Tests
84
8.3.
Auswertung der Logdateien
8.4.
Ergebnisse des Tests
8.5.
Auswertung und Ausblick
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
84
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
85
. . . . . . . . . . . . . . . . . . . . . . . . .
9. Schlussbemerkung
91
93
9.1.
Bewertung und Ausblick
. . . . . . . . . . . . . . . . . . . . . . . . . .
93
9.2.
Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
94
Literaturverzeichnis
Abbildungsverzeichnis
Tabellenverzeichnis
Abkürzungsverzeichnis
Thesen
Eidesstattliche Erklärung
A. Anhang
95
99
101
103
105
107
109
A.1. Übersicht über die Logdateien . . . . . . . . . . . . . . . . . . . . . . .
109
A.2. Datendatei für die Skripte
. . . . . . . . . . . . . . . . . . . . . . . . .
110
A.3. Perlskript zum sortierten Zusammenfügen zweier Logdateien . . . . . .
111
A.4. Perlskript zum Erzeugen der Dierenz zwischen zwei Logdateien . . . .
113
A.5. Perlskript zum sortierten Zusammenfügen aller Logdateien
. . . . . . .
115
A.6. Perlskript zum Teilen der kompletten Logdatei . . . . . . . . . . . . . .
117
A.7. Perlskript zum Berechnen der Abstände vieler Vektoren in einer Datei .
118
A.8. Perlskript zum Berechnen der Abstände zweier Knoten zu jedem Zeitpunkt119
A.9. Ausschnitt aus einer Logdatei
. . . . . . . . . . . . . . . . . . . . . . .
A.10.Vorgehen zum Ausführen eines Tests
A.10.1. Herunterladen des Projekts
2005-03-21/015/IN99/2253
120
. . . . . . . . . . . . . . . . . . .
122
. . . . . . . . . . . . . . . . . . . .
122
7
Inhaltsverzeichnis
A.10.2. Kompilieren der Testdateien . . . . . . . . . . . . . . . . . . . .
122
A.10.3. Kongurieren des Datenstroms
. . . . . . . . . . . . . . . . . .
123
A.10.4. Starten der Testdateien . . . . . . . . . . . . . . . . . . . . . . .
123
A.10.5. Starten des
8
mplayers
. . . . . . . . . . . . . . . . . . . . . . . .
124
2005-03-21/015/IN99/2253
2. Einleitung
Diese Diplomarbeit beschäftigt sich mit dem Thema Multimedia-Streaming. Dabei
werden besonders die Einüsse der Lokalität auf die Ezienz des Routings und des
Streamings betrachtet.
Mit der zunehmenden Verbreitung von Breitband-Internetzugängen haben viele die
Möglichkeit, Multimedia-Daten aus dem Internet zu beziehen. Dabei existieren eine
Menge Anwendungsmöglichkeiten, wie zum Beispiel das Streaming eines groÿen Ereignisses im Internet. Denkbar wäre da ein Konzert oder die Fuÿball-Weltmeisterschaft
2006.
Die Diensteanbieter haben dabei allerdings einen immensen Bandbreitenbedarf. Um
dies zu verdeutlichen, wird hier ein Rechenbeispiel mit einem Nachrichtenstream gezeigt. Der Stream hat eine Bitrate für Video von
Server ist mit
j
100M bit/s
396kbit/s
k
300kbit/s und 96kbit/s für Audio. Der
100M bit/s an das Internet angebunden. So können idealerweise maximal
= 252
Senken bedient werden. Für mehr Nutzer ist eine gröÿere Ausgangs-
kapazität notwendig. Ein weiterer Rechner mit weiteren
100M bit/s
kann das Problem
nur lösen, wenn der Flaschenhals nicht am Gateway des Providers liegt oder er müsste
an einem anderen Standort aufgestellt werden.
Die einfachste Möglichkeit wäre die Verwendung von IP-Multicast, das für die Kommunikationen an viele Empfänger gedacht ist. Allerdings wird IP-Multicast von den
meisten Routern im Internet nicht geroutet (siehe Abschnitt 3.3) und stellt daher keine
Lösung dar.
Einen Ausweg bietet ein Content Distribution Network (CDN). Hierzu werden viele Server global verteilt und über ein Netzwerk verbunden. Der Nutzer wird dann
zu einem freien Server weitergeleitet. Anbieter für solche Systeme sind zum Beispiel
2005-03-21/015/IN99/2253
9
2. Einleitung
Akamai1 , Speedera 2
und
Mirror Image Internet 3 .
Der Nachteil von solchen Systemen
sind die hohen Kosten, da die Kapazitäten bei den Anbietern gemietet werden müssen
(In [Heidenreich (2004) S.40] ist dieser Ansatz näher erläutert.). Somit kommt diese
Lösung nur für groÿe Firmen in Frage.
In dieser Diplomarbeit wird eine weitere Möglichkeit untersucht, dieses Problem zu
lösen. Die Teilnehmer werden in einem Peer-to-Peer-Netzwerk organisiert und arbeiten
kooperativ. Daher bieten alle Teilnehmer, die schon Daten empfangen haben, diese auch
anderen Teilnehmern wieder an. Hierbei existiert das Problem, dass die meisten Nutzer
Asymmetric Digital Subscriber Line
als breitbandigen Anschluss ADSL (
) verwenden
und daher zwar den kompletten Stream empfangen können, aber nur einen Bruchteil
der notwendigen Bandbreite wieder zur Verfügung stellen können.
Als Gesamtziel kann die eziente Nutzung der Ressourcen gesehen werden. Dies wird
durch einen Multisource-Ansatz, bei dem mehrere Teilnehmer einem gemeinsam die
Daten liefern können, erreicht. Ebenso wird versucht, lokalitätserhaltende Topologien
aufzubauen, um die Netzwerkressourcen zu schonen.
Die Arbeit gliedert sich wie folgt: Zuerst werden einige Grundlagen im Kapitel 3 gelegt
und anschlieÿend einige existierende Ansätze (Kapitel 4) vorgestellt. Darauf folgend
werden die Anforderungen (Kapitel 5) für das eigene System festgelegt und danach
die Komponenten Routing und Lokalisierung entworfen (Kapitel 6). Diese Komponenten werden dann im Kapitel 7 in das existierende System
ekStream 4
integriert und in
Kapitel 8 getestet. Abschlieÿend erfolgt eine Bewertung der Arbeit (Kapitel 9).
1 http://www.akamai.com
2 http://www.speedera.com
3 http://www.mirror-image.com
4 http://www.ekstream.org
10
2005-03-21/015/IN99/2253
3. Grundlagen
In diesem Kapitel werden die grundlegenden Begrie, die für das weitere Verständnis
dieser Arbeit notwendig sind, erläutert.
3.1. Kooperatives System
In einem kooperativen System stellt jeder Knoten seine Ressourcen, insbesondere die
von ihm empfangenen Daten, anderen Knoten zur Verfügung. Auf diese Art wird die
Gesamtkapazität des Systems erhöht, da nicht alle Senken ihre Daten von einem Server
beziehen müssen.
3.2. Routing
Im Internet sind Router die tragenden Elemente, da sie einzelne Netze miteinander
verbinden. Sie arbeiten auf Schicht 3 (Netzwerkschicht) des ISO/OSI-Referenzmodells
und wählen den Weg eines Paketes über das Netzwerk. Routen können statisch festgelegt werden, wie dies zum Beispiel bei dem Default-Gateway eines jeden Rechners der
Fall ist. In der Regel legen die Router im Internet ihre Routen allerdings dynamisch
fest bzw. ändern sie dynamisch, um eigenständig auf Änderungen (zum Beispiel Ausfall
eines Routers oder Überlastung einer Verbindung) reagieren zu können.
Die prinzipielle Aufgabe eines Routing-Verfahrens ist, die Entscheidung zu
fällen, zu welchem Ausgang ein eingegangenes Paket weitergeleitet werden
soll. Die primären Ziele sind hierbei ein allgemein hoher Netzdurchsatz und
eine geringe mittlere Paketverzögerung. Generell wird dabei versucht, ein
2005-03-21/015/IN99/2253
11
3. Grundlagen
Datenpaket von der Quelle zum Ziel über den Pfad mit den geringsten Kosten zu leiten. Als Kosten können hierbei z. B. die aktuelle Auslastung oder
Verzögerung einer Verbindung, die Kapazität oder Fehlerrate einer Verbindung, die tatsächlichen Kosten der Übertragung über eine Verbindung etc.
angesetzt werden. Die Entscheidung über das Kostenmodell liegt im Allgemeinen bei einem Netzbetreiber. [Krüger und Reschke (2004) S.156]
3.3. Multicast
Multicast ist eine Gruppenkommunikation, dabei werden die gleichen Daten an mehrere
Empfänger gleichzeitig verschickt. Bei Unicast ist immer nur die Übertragung von
einem Sender zu einem Empfänger möglich.
Üblicherweise wird mit Multicast die Multicast-Funktionalität des IP-Protokolls bezeichnet, womit das eziente Senden von Daten an viele Empfänger zur gleichen Zeit
in IP-Netzwerken möglich wird. Dazu werden spezielle Multicast-Adressen aus dem IPAdressbereich verwendet. Dabei liegt der Vorteil darin, dass die Daten auf jedem Link
jeweils nur einmal geschickt werden müssen und erst bei den angeschlossenen Routern
und Switchen dupliziert werden.
IP-Multicast wird von den meisten Routern im Internet allerdings aus verschiedenen
Gründen nicht geroutet (aus [Weber (2004)] und [Banerjee und Bhattacharjee (2002)]):
•
Es wird eine erweiterte Router-Software benötigt, die für jede Multicast-Adresse
einen extra Eintrag über ihren Zustand verwaltet. Die Komplexität des Routings
erhöht sich dadurch enorm bei gleichzeitigem Verlust der Skalierbarkeit.
•
Ein Angreifer könnte über Multicast viele Empfänger gleichzeitig überuten und
1
so leicht das Netzwerk überlasten (DoS -Attacke).
•
Die Trac-Berechnung, basierend auf der eingehenden oder ausgehenden Bandbreite, müsste angepasst werden.
•
Jeder Gruppe muss dynamisch eine Adresse aus dem globalen IP-MulticastAdressraum zugeordnet werden. Eine skalierbare und zuverlässige Verteilung der
1 Denial
12
of Service
2005-03-21/015/IN99/2253
3.3. Multicast
Adressen ist ein Problem.
•
Die Realisierung einer sicheren Übertragung ist auch deutlich schwieriger, da
die sichere Verteilung eines Sitzungsschlüssels an alle Gruppenmitglieder sehr
komplex ist.
•
Die Umsetzung von höheren Funktionen wie Flusskontrolle, Sicherheit oder Zuverlässigkeit ist deutlich schwieriger als bei Unicast.
•
Die Entwicklung von Multicastanwendungen scheitert meist an der nicht vorhandenen Infrastruktur. Des Weiteren besteht ohne entsprechende Anwendungen
kein Bedarf für die aufwändige Infrastruktur.
Auf Grund dieser Probleme sind viele Ansätze entstanden, einen Multicast auf der
Anwendungsebene zu implementieren. Die Aufgaben der Router, die Pakete zu vervielfältigen und weiterzuleiten, fällt den einzelnen Knoten (Mitgliedern der MulticastGruppe) zu. Diese Knoten werden dabei über ein selbstorganisierendes virtuelles Netz
miteinander verbunden, das sozusagen über das physikalische Netzwerk gelegt wird,
weshalb es Overlay-Netz heiÿt. Weiterleitungen von einem Knoten zu einem Anderen
können nur über Wege in diesem Overlay-Netz gehen. Im Weiteren wird der Multicast
auf der Anwendungsebene (Application-Layer-Multicast) Overlay-Multicast genannt.
In Abbildung 3.1 ist der Unterschied zwischen Unicast, IP-Multicast und OverlayMulticast dargestellt. Dieses Beispiel zeigt einen Server, der einen über Videokamera
aufgenommenen Stream anbietet und fünf andere Rechner, die auf diesen Stream zugreifen wollen. In Abbildung 3.1(a) ist die zugrunde liegende Netzstruktur mit drei
Routern zu sehen (grau). Nun werden die Knoten über ein virtuelles Netz verbunden,
das Overlay-Netz (rot). Die gepunkteten Pfeile (blau) in Abbildung 3.1(b) (Unicastübertragung), 3.1(c) (Übertragung mit IP-Multicast) und 3.1(d) (Übertragung mit
Overlay-Netz) symbolisieren die Datenübertragung. Dabei ist zu sehen, dass der Server
bei der Unicastübertragung unter hoher Last steht, da er alle Anfragen zu bearbeiten hat und jedem einzelnen Client antworten muss. Daher hat auch der Link nahe
der Quelle eine sehr groÿe Auslastung. Deswegen ist zu erkennen, dass IP-Multicast
die eektivste Datenübertragung bezüglich des Ressourcenverbrauchs (Serverlast und
Bandbreite im Netz) ist. Um bewerten zu können, wie gut eine bestimmte Implementierung von Overlay-Multicast ist, werden einige wichtige Performance-Metriken nach
2005-03-21/015/IN99/2253
13
3. Grundlagen
(a) Physikalische
Overlay-Netz
Topologie
und
(c) Übertragung mit IP-Multicast
(b) Übertragung mit Unicast
(d) Übertragung mit Overlay-Multicast
Abbildung 3.1.: Übertragung mittels Unicast, IP-Multicast und Overlay-Multicast
[Banerjee und Bhattacharjee (2002)] eingeführt:
Stress : Stress
wird pro Link oder Router der Topologie deniert und ist die Anzahl
der identischen Pakete, die über den Link oder Knoten gesendet werden. Bei IPMulticast existieren keine redundanten Pakete, daher ist der
Stress
für alle Links
im Netzwerk eins.
Stretch: Stretch ist pro Mitglied deniert und entspricht dem Verhältnis zwischen der
Länge des Pfades zur Quelle über das Overlay-Netzwerk und dem Pfad einer
direkten Unicast-Verbindung. Bei der klassischen Client/Server-Topologie ist der
Stretch
14
eins bei jedem Mitglied und damit optimal, da jeder Client zum Server
2005-03-21/015/IN99/2253
3.4. Multicastrouting
eine eigene direkte Unicast-Verbindung hat.
Kontroll-Overhead:
Jeder Knoten tauscht mit seinem Nachbarn im Overlay-Netzwerk
Aktualisierungsnachrichten aus. Diese Nachrichten werden als Kontroll-Overhead
bezeichnet und sind eine wichtige Metrik für die Skalierbarkeit.
Der
Stress
muss klein sein, damit die Knoten und Links nicht überlastet werden. Aller-
dings sollte auch der
Stretch
niedrig sein, damit die Ende-zu-Ende-Verzögerung gering
gehalten wird. Das Problem ist jedoch, dass dies zwei konkurrierende Ziele sind, sodass
ein guter Mittelweg gefunden werden muss.
Obwohl Overlay-Multicast ebenfalls Probleme besitzt, überwiegen die Vorteile. Er kann
einfach an die jeweilige Anwendung angepasst werden und funktioniert ohne den besonderen Support der Internet-Service-Provider.
3.4. Multicastrouting
Die Aufgabe des Multicastroutings ist es, ein möglichst ezientes Overlay-Netz aufzubauen.
Prinzipiell gibt es keine Einschränkungen für den Aufbau eines solchen Overlay-Netzwerkes. In Abbildung 3.2 sind die drei prinzipiellen Topologieformen veranschaulicht,
entweder ein Baum
2
wie in Abbildung 3.2(a), oder ein Netz. Das Netz kann entweder
kreisfrei (Abbildung 3.2(b)) sein oder Kreise enthalten (Abbildung 3.2(c)).
Während die Router im Internet stabil sind, können die Knoten jederzeit dem Netzwerk
beitreten oder es verlassen. Die groÿe Schwierigkeit besteht darin, dass diese Knoten
die Funktionalität der Router nachbilden sollen und derzeitige Routingalgorithmen im
Internet nicht auf eine solch starke Dynamik ausgelegt sind. Dies macht das Management des Netzwerkes bedeutend schwieriger und muss beim Aufbau des Overlay-Netzes
berücksichtigt werden.
2 In
diesem Fall wird auch vom Multicast-Baum gesprochen.
2005-03-21/015/IN99/2253
15
3. Grundlagen
(a) Multicastbaum
(b) Netz ohne Kreise
(c) Netz mit Kreisen
Abbildung 3.2.: Topologieformen für das Overlay-Netz
3.5. Lokalität
Verschiedene Hosts im Internet sind typischerweise über viele dazwischen liegende Router verbunden. Dabei ist die Verbindung zwischen ihnen im Allgemeinen stabiler, hat
eine kleinere Verzögerung und meist auch mehr Bandbreite, je weniger Komponenten
bzw. Router zwischen ihnen liegen. Daher liegt es nahe, die Lokalität im Peer-to-PeerNetzwerk zu berücksichtigen, um das Netzwerk weniger zu belasten und die Vorteile
der besseren Verbindung zu nutzen. Im Extremfall sind zwei Knoten innerhalb eines
lokalen LANs und könnten so sinnvollerweise die Daten nur einmal über ihren Uplink
beziehen.
Da so das Schicken der Daten über unnötig lange Pfade vermieden wird, kann auch
16
2005-03-21/015/IN99/2253
3.5. Lokalität
(a) Overlay-Netzwerk mit Berücksichtigung der Lokalität
Abbildung 3.3.: Einuss
der
Lokalität
(b) Overlay-Netzwerk ohne Berücksichtigung der Lokalität
auf
die
Netzwerk-Ezienz
des
Overlay-
Netzwerks
die Belastung der darunter liegenden Netzwerkstruktur vermieden werden, wie in Abbildung 3.3 zu sehen ist. Das lokalitätserhaltende Overlay-Netzwerk ist in Abbildung 3.3(a)
und das nicht lokalitätserhaltende Overlay-Netzwerk in Abbildung 3.3(b) veranschaulicht. Dabei sind die Router und die physikalischen Verbindungen grau dargestellt. Die
roten Pfeile stellen die logischen Verbindungen zwischen den Knoten im Overlay-Netz
dar und die blau gepunkteten Pfeile zeigen die Datenübertragung durch das physikalische Netzwerk.
Die Bestimmung der Lokalität kann dabei nicht über exakte geographische Entfernungen geschehen, da diese sehr schwer zu ermitteln und unter Umständen auch nicht
optimal sind. Besser und einfacher ist es, die Lokalität anhand von geeigneten be-
3
stimmbaren Netzwerkparametern, wie zum Beispiel Anzahl der Hops
und gemittelte
Antwortzeiten, zu bestimmen. [Strufe (2003)]
3 Die
Anzahl der Hops entspricht die Anzahl der Router entlang des Pfades zwischen zwei Endsystemen.
2005-03-21/015/IN99/2253
17
3. Grundlagen
3.6. Peer-to-Peer
Unter Peer-to-Peer (P2P) wird die Kommunikation unter Gleichgestellten verstanden.
In einem Peer-to-Peer-Netzwerk gibt es keine eindeutigen Server oder Clients, jeder
Client muss auch als Server auftreten. Aus diesem Grund wird auch nur von Peers oder
Knoten gesprochen. Ein wesentlicher Vorteil von P2P-Netzen ist, dass keine konkrete
oder feste Struktur existiert und somit das Netzwerk sehr ausfallsicher ist. P2P weist
eine n:m Kommunikationsbeziehung im Gegensatz zu Client/Server, wie zum Beispiel
bei einem Webserver, mit 1:n auf.
3.6.1. Organisationsformen für verteilte Systeme
Die Topologien von verteilten Systemen sind:
Zentralisiert:
Hierbei existiert eine zentrale Instanz, an die alle anderen Knoten ih-
re Anfragen senden. Diese Topologie ist keine P2P-Struktur, da nicht jeder die
gleichen Aufgaben übernehmen kann. Damit der zentrale Server diese Anfragen
(Lookup) beantworten kann, müssen die Ressourcen/Dienste bei ihm zuvor angemeldet werden. Somit stellt es sich als erheblich einfacher heraus, alle Ressourcen/Dienste im System bekannt zu machen. Allerdings ist dabei kein absolutes
Wissen möglich, sondern nur ein zeitlich begrenzter Ausschnitt. Diese zentrale
Struktur beinhaltet jedoch wieder die Schwachstelle, dass die Anfragen den Server überlasten können und somit der Server die Leistungsfähigkeit insbesondere
auch die Skalierbarkeit des Gesamtsystems bestimmt. Im schlimmsten Fall fällt
dieser zentrale Server aus und das gesamte restliche Netz ist funktionsunfähig, da
4
alle von ihm abhängig sind. Ein Beispiel für diese Struktur ist Napster .
Dezentralisiert:
Bei einem voll dezentralisierten System müssen alle Funktionen von
den Knoten selbst organisiert werden. Insbesondere können Dienste oder Ressourcen nicht registriert werden, weswegen ein Lookup-Service bedeutend schwieriger
zu realisieren ist. Dafür fallen aber auch alle Nachteile einer zentralen Architektur
weg, wie zum Beispiel beim Ausfall eines zentralen Servers. Ein Vertreter dieser
5
Struktur ist Gnutella .
4 http://www.napster.com
5 http://rfc-gnutella.sourceforge.net
18
2005-03-21/015/IN99/2253
3.6. Peer-to-Peer
Hybrid:
Bei der hybriden Architektur wird versucht, die Vorteile der zentralen und der
dezentralen Architektur zu vereinen. Meist existieren hierbei zwei Knoten-Typen,
die normalen Nodes und die Supernodes. Die meist ressourcenstärkeren Supernodes übernehmen dabei die anspruchsvollen Aufgaben wie Koordination der
Sucher und die Verwaltung der Knoten. Einfache Knoten können so ihre Ressourcen/Dienste bei den Supernodes registrieren, und auch dort nach Ressourcen
nachfragen. Die Supernodes übernehmen in diesem Fall also die Aufgabe des zentralen Servers, werden allerdings je nach Bedarf neu gewählt und koordinieren
6
sich untereinander. Ein Beispiel für diese Architektur ist FastTrack .
3.6.2. Ziele von P2P-Systemen
Die Ziele beim Einsatz von P2P-Systemen werden in [Heidenreich (2004)] genauer beschrieben, wobei hier nur die wichtigsten kurz beschrieben werden sollen.
Kostenteilung/-reduktion:
Da bei der klassischen Client/Server-Struktur, alle Cli-
ents von einem Server bearbeitet werden müssen, kann an dieser Stelle schnell
eine Überlastung auftreten. Die P2P-Architektur versucht die Last oder Kosten,
wie zum Beispiel Speicherplatz, Rechenkapazität oder Bandbreite auf mehrere
Knoten zu verteilen.
Zusammenfassen von Ressourcen:
Es können Ressourcen aller Peers zusammenge-
fasst werden, um eine gemeinsame Aufgabe zu erfüllen. Beispiele hierfür wären
das verteilte Rechnen von SETI@Home
7
8
oder Find-a-Drug .
Verbesserte Skalierbarkeit und Zuverlässigkeit:
Da Dienste nicht nur von einem
Server bereitgestellt werden, sondern auch von anderen Knoten, wird eine erheblich bessere Skalierbarkeit und auch Ausfallsicherheit erreicht.
Hohe Dynamik:
Peer-to-Peer-Systeme sind darauf ausgelegt, dass einzelne Knoten
sehr dynamisch handeln können und sind demnach auch in der Lage mit solchen
Situationen umzugehen.
6 http://www.fasttrack.nu
7 Zum
8 Zum
Finden von Spuren extraterrestrischen Lebens (http://setiathome.ssl.berkley.edu).
Finden von Heilmitteln für verschiedene Krankheiten (http://www.find-a-drug.org).
2005-03-21/015/IN99/2253
19
3. Grundlagen
Ad-hoc-Kommunikation:
Durch das grundsätzliche Fehlen eines zentralen Servers ist
es möglich mit P2P-Systemen einfach eine Ad-hoc-Kommunikation aufzubauen.
3.6.3. Lookup in P2P-Systemen
Da bei P2P-Systemen Ressourcen und Objekte sehr dynamisch beitreten und wegfallen
können, ist die Lokalisation dieser besonders schwierig. Um solche Objekte und Ressourcen aufzuspüren, ist ein so genannter Lookup-Dienst erforderlich, welcher aus zwei
Stufen besteht:
•
Lokalisierungsdienste bilden Bezeichner9 auf Referenzen10 ab
•
Namensdienste bilden Namen11 auf Bezeichner ab
Um nun solche Namens- und Lokalisierungsdienste zu realisieren, existieren grundsätzlich zwei Möglichkeiten für die Suche:
•
Speicherung und Abfrage in einer zentralen Registrierung
•
Durchsuchen des gesamten Systems
12
Das Durchsuchen des gesamten Systems wird zum Beispiel über ein Fluten
des Netz-
werkes mit Anfragen realisiert. Jeder Knoten muss eine an sie gestellte Anfrage lokal
überprüfen und an alle weiteren bekannten Knoten (auÿer dem Anfragenden) weiterleiten. Auf diese Art wird der gesamte Suchraum abgedeckt. Diese Suche führt dann
allerdings zu einem, auf die Anzahl der teilnehmenden Knoten bezogen, exponentiellen
Kommunikationsaufkommen und belastet so bei vielen Anfragen das System stark.
Eine bessere Variante ist eine Registrierung der Ressourcen. Bei der zentralen und
hybriden Architektur ist leicht ein Server zu nden, der für die jeweilige Registrierung
zuständig ist (selbst bei der hybriden Architektur hat ein Knoten nur einen oder eine
9 Ein
Bezeichner dient der eindeutigen Identizierung einer Ressource.
Hilfe einer Referenz kann die durch den Bezeichner festgelegte Ressource im Netzwerk adressiert
bzw. gefunden werden.
11 Ein Name dient meist der Adressierung mehrerer Ressourcen, die aber unterschiedliche Bezeichner
haben können.
12 Wie dies etwa bei Gnutella realisiert wird.
10 Mit
20
2005-03-21/015/IN99/2253
3.7. Multimedia-Streaming
sehr kleine Anzahl von Supernodes). Nun muss allerdings bei der hybriden Architektur
auch eine weitere Suche unter den Supernodes möglich sein. Dabei entsteht dasselbe
Problem wie bei der vollständig dezentralen Architektur, nur mit weniger Knoten und
deshalb weniger Aufwand. [Strufe (2003)]
3.7. Multimedia-Streaming
Der Begri Multimedia ist sehr vielschichtig, in dieser Arbeit soll aber darunter vordergründig die Verknüpfung von Audio und Video verstanden werden.
Als Streaming wird die kontinuierliche Übertragung eines Datenstromes von einer Quelle zur Senke bezeichnet. Zumeist bietet das Format (Kodierung) der übertragenen Daten die Möglichkeit, sie bereits anzuzeigen (nutzen), bevor sie vollständig übertragen
worden sind.
Bei dem Spezialfall Multimedia-Streaming, werden Multimedia-Daten in Form eines
Streams verschickt.
Dabei besitzen die Multimedia-Daten besondere Eigenschaften:
•
Es handelt sich meist um groÿe Datenmengen, die selbst komprimiert eine hohe
Bandbreite benötigen.
•
Es ist notwendig, dass die Daten zeitgenau abgespielt werden, da es sonst zu
Verfälschungen der Informationen kommt.
•
Der Aufbau der Daten ist strukturiert.
•
Es herrscht eine strikte zeitliche Abhängigkeit der Daten.
Daraus ergeben sich spezielle Anforderungen beim Multimedia-Streaming:
•
Die Daten müssen rechtzeitig vor dem Abspielzeitpunkt empfangen werden.
•
Die Daten müssen in einem Format kodiert sein, sodass die Nutzung ohne vollständige Daten ermöglicht wird (nicht streng abhängige Daten).
2005-03-21/015/IN99/2253
21
3. Grundlagen
•
Die Bandbreite muss groÿ genug sein, um mindestens so viele Daten pro Zeitraum
empfangen zu können, wie zum Abspielen pro Zeitraum notwendig ist (Datenrate
der Daten
≤
Bandbreite des Übertragungskanals).
Die Rechtzeitigkeitsanforderung stellt immer noch eine Herausforderung dar, da die
Standardkommunikationsprotokolle wie TCP/IP nicht für Zeitschranken ausgelegt sind.
Bei der Entwicklung dieser Protokolle wurde mehr Wert auf die Zuverlässigkeit gelegt.
Prinzipiell existieren zwei verschiedene Arten von Streaming-Methoden:
Live-Streaming:
Hierbei werden an der Quelle kontinuierlich neue Daten erzeugt. Zum
Beispiel wird per Kamera ein Fuÿballspiel aufgenommen und direkt mit Hilfe eines
Rechners digitalisiert und encodiert. Dies wird dann als Stream übertragen.
Video-on-Demand:
Im Gegensatz zum Live-Streaming sind vom Anfang an alle Da-
ten vorhanden und gespeichert. So ist es möglich zu einem beliebigen Zeitpunkt
(on demand) einen Stream anzufordern und sogar bei einem beliebigen Oset
anzufangen. Theoretisch ist es möglich, während des Streamings mehr Daten anzufordern, als gerade verbraucht werden können, wenn die verfügbare Bandbreite
des Übertragungsmediums gröÿer als die Datenrate des Streams ist.
Für den Nutzer besteht kaum ein Unterschied zwischen Live-Streaming und Videoon-Demand. Jedoch ist der Unterschied, dass bei Live-Streaming die Daten so schnell
wie möglich angezeigt werden sollen, während bei Video-on-Demand viel mehr Daten
im Voraus heruntergeladen bzw. gepuert werden können. Somit kann ein Fehler bei
der Übertragung bei Video-on-Demand eher durch nochmaliges Senden ausgeglichen
werden, als bei Live-Streaming.
22
2005-03-21/015/IN99/2253
4. Verwandte Ansätze
Es existieren in der derzeitigen Forschung viele Anwendungen von Multimedia-Streaming in P2P-Netzwerken. In diesem Kapitel sollen nun einige Ansätze mit unterschiedlichen Lösungsmöglichkeiten vorgestellt werden.
Alle Ansätze stellen fest, dass Multicast in der Netzwerkschicht nicht anwendbar ist
(Begründung siehe Abschnitt 3.3) und daher eine Lösung auf der Anwendungsebene
entwickelt werden muss.
Anfangs werden mit
Host-Based Multicast
und
CoopNet
in den Abschnitten 4.1 und
4.2 zwei zentrale Ansätze vorgestellt und darauf folgen die verteilten Ansätze. Die
Abschnitte 4.3 und 4.4 beschreiben die zwei Systeme
to-Peer Streaming, die wie CoopNet
SplitStream
und
den Stream in mehrere Teilströme unterteilen und
dann auf unterschiedlichen Pfaden an den Empfänger senden. Mit
Multicast
Layered Peer-
Service Adaptive
(siehe Abschnitt 4.5) folgt nun ein Ansatz mit verteilten Hash-Tabellen und
Landmark-Vektoren. Bei
PeerCast,
im Abschnitt 4.6 vorgestellt, ist die Kernentwick-
lung eine Zwischenschicht zwischen Anwendung und Netzwerk.
Scattercast
und
End
System Multicast (siehe Abschnitt 4.7 und 4.8) verwenden ein Reverse-Path-Forwarding
Algorithmus, um Verteilungsbäume für die Daten aufzubauen. Zum Schluss wird im
Abschnitt 4.9
Zigzag
vorgestellt, dass auf einem hierarchischen Modell mit Clustern
basiert.
4.1.
Beim
Host-Based Multicast
Host-Based Multicast
[Roca und El-Sayed (2001)] (HBM) wird eine Gruppen-
kommunikation auf der Anwendungsebene entwickelt. Dabei wird zwischen den
Core-
Members, als Hauptteil der Verteilungsstruktur, und den Non-Core-Members, als einfache Blattknoten in der Topologie, unterschieden. Das Overlay-Netz wird von einem
2005-03-21/015/IN99/2253
23
4. Verwandte Ansätze
zentralen
Rendezvous-Point
Members
benachrichtigt. Dieser
berechnet, der dann die
Rendezvous-Point
Core-Members
und die
Non-Core-
kennt alle Mitglieder und ihre Ent-
fernungen zueinander (Für die Denition der Entfernung können unterschiedliche Metriken verwendet werden.). Diese Abstände werden periodisch von den
und den
Non-Core-Members
berechnet und dem
Rendezvous-Point
Core-Members
mitgeteilt.
HBM besitzt, bedingt durch die zentrale Architektur, eine begrenzte Skalierbarkeit und
muss ein groÿes Vertrauen in die Verfügbarkeit des
Rendezvous-Point
haben. Auf der
anderen Seite ist dies eine einfache Lösung mit wenig Last auf der Knotenseite und ohne
Probleme mit Abhängigkeiten, die bei verteilten Algorithmen auftreten. Auÿerdem wird
eine relativ gute Topologie in Abhängigkeit zur Genauigkeit der Entfernungsmessung
erzeugt, die besondere Knoteneigenschaften berücksichtigen kann.
4.2.
Bei
CoopNet
Cooperative Networking (CoopNet ) [Padmanabhan u. a. (2002)] [Padmanabhan u. a.
(2003)] wird das Client-/Server-Modell nicht durch ein P2P-Netzwerk ersetzt, sondern
ergänzt. Nur wenn der Server in Zeiten groÿer Belastung nicht mehr in der Lage ist, die
Anfragen selbst zu bedienen, baut er eine Verteilungsstruktur auf, bei der alle Clients
kooperieren müssen, um ihn zu entlasten. Es wird davon ausgegangen, dass die Clients
dem Netzwerk nur zur Verfügung stehen, solange sie selbst Daten empfangen wollen.
Dies kann eine kurze Zeit von z. B. wenigen Minuten sein.
Die kooperative Verteilungsstruktur besteht aus mehreren Bäumen, die vom Server
verwaltet werden. Der Datenstrom wird mit Hilfe von
Multiple Description Coding
[Goyal (2001)] (MDC) in Teildatenströme aufgeteilt und auf je einem Baum an die
Clients verteilt. Um Redundanz zu erreichen, müssen die inneren Knoten jedes Baumes
unterschiedlich sein, idealerweise wird jeder Knoten nur in einem Baum als innerer
Knoten und sonst immer als Blattknoten verwendet. Als Quelle ist der Server auch die
Wurzel jedes Baumes.
Der Ausfall eines Knotens führt auf diese Art nur zum Verlust eines Teildatenstromes
für seine Kinderknoten. Dadurch nimmt nur vorübergehend die Qualität des Streams
ab und führt nicht zum kompletten Verlust.
Durch die zentrale Struktur ist die Verwaltung des Netzwerkes einfach, da der Server
24
2005-03-21/015/IN99/2253
4.3. SplitStream
alle Ressourcen kennt. Der Knotengrad jedes Knotens wird durch seine verfügbare
ausgehende Bandbreite beschränkt. Bei dem Beitritt eines Knotens meldet sich dieser
einfach beim Server und erhält von ihm eine Liste von Vaterknoten (für jeden Baum
genau einen Knoten). Die Auswahl der Vaterknoten durch den Server kann zufällig
oder deterministisch erfolgen, um die Bäume unterschiedlich aufzubauen.
Es stört wenig, dass der Server ein
Single Point of Failure
bei der Verwaltung des
Netzwerkes darstellt, denn er ist gleichzeitig Quelle der Daten und ohne Quelle ist die
Verteilungsstruktur überüssig. Allerdings wird auf diese Art die Skalierbarkeit des
Netzwerkes eingeschränkt, da durch die alleinige Verwaltung der Verteilungsbäume ein
groÿer Kontroll-Overhead bei dem Server herrscht.
4.3.
SplitStream
SplitStream
[Castro u. a. (2003)] ist ein System zum Verteilen von bandbreitenintensi-
ven Daten mit Hilfe von Multicast auf der Anwendungsebene. Dabei wird versucht, die
Unausgewogenheit von internen Knoten und Blattknoten in einem Multicast-Baum zu
lösen.
Ein baumbasierter Multicast passt leider von Natur aus nicht gut in eine kooperative
Umgebung, denn ein ezienter Multicast-Baum hat eine möglichst geringe Höhe und
damit wenig interne Knoten und viele Blattknoten. Die internen Knoten müssen viel
Arbeit in die Aufteilung und Weiterleitung der Daten stecken und die Blattknoten nehmen nicht aktiv an der Kooperation teil. Deshalb wird bei
geteilt (in
SplitStream
der Datenstrom
Stripes ) und jeder Teil über einen separaten Multicast-Baum geschickt. Nun
wird versucht, jeden Knoten nur in einen Multicast-Baum als inneren Knoten zu verwenden. Dadurch wird die Last gleichmäÿig auf alle Knoten verteilt.
Für Streaming-Daten wird dabei MDC verwendet. Wodurch auch die Robustheit des
Systems gegen einen Knotenausfall verbessert werden kann. Jeder Knoten ist nur einmal
interner Knoten und bei seinem Ausfall fehlt seinen Kindern nur ein kleiner Teil des
Datenstromes. Dadurch ist die Qualität zwar bis zur Reparatur dieses Baumes etwas
geringer, aber der Stream kann weiterhin abgespielt werden.
SplitStream beruht auf dem strukturierten P2P-Overlay-Netzwerk
Pastry
[Rowstron
und Druschel (2001)] und dem darauf aufgebauten Application-Layer-Multicast-System
2005-03-21/015/IN99/2253
25
4. Verwandte Ansätze
Scribe
[Castro u. a. (2002)]. Nach eigenen Angaben ist die Konstruktion des Multicast-
Baumes balanciert und die Verzögerung und der
Stress
relativ klein.
Allerdings ist die Verwaltung dieser vielen Multicast-Bäume sehr komplex und aufwändig, da die Pfade unabhängig voneinander sein sollen und jeder Knoten nur einmal
innerer Knoten sein darf. Der Kontroll-Overhead steigt ebenfalls, weil jeder Baum extra
verwaltet werden muss.
4.4.
Layered Peer-to-Peer Streaming
Layered Peer-to-Peer Streaming [Cui und Nahrstedt (2003)] stellt eine P2P-Lösung zum
Verteilen von On-Demand-Multimedia-Daten dar. Es wird davon ausgegangen, dass
Nutzeranfragen asynchron ankommen und die Peers heterogene Netzwerkbandbreiten
besitzen.
Cache-and-Relay (zwischenspeichern und weiterleiten) und
Layer-encodiertes Streaming. Durch den Layer-encodierten Stream wird es den Peers
Die Schlüsseltechniken sind
1
ermöglicht, unterschiedliche Qualitäten eines Streams je nach der eigenen Leistungsfähigkeit (z. B. der eingehenden Bandbreite) zu empfangen.
Jeder Peer speichert den empfangenen Stream in einem lokalen Ringpuer und kann
Peers, die später diese Daten anfordern, als Quelle bedienen. Ein Peer kann verschiedene
Layer von unterschiedlichen Peers parallel empfangen.
Es wird ein
greedy
Ansatz vorgestellt, der immer die maximal mögliche, ausgehende
Bandbreite der Quelle mit der geringsten Anzahl an Layern verwendet. Damit erhält
ein Peer die maximal mögliche Anzahl an Layern. Der Algorithmus wird von jedem
Empfängerknoten selbst berechnet.
Nach eigenen Angaben wird eine eziente Nutzung der Bandbreitenressourcen der
Sender-Peers, eine Skalierbarkeit durch die Bandbreitenersparnis beim Server und eine
optimale Streaming-Qualität von allen Peers erreicht. Allerdings wird bei dem System
nur auf die Verteilung der Daten eingegangen und nicht auf die Verwaltung der Peers.
1 Der
Stream besteht aus {l0 , l1 , l2 , . . . , lL } Layern mit l0 als Basislayer und den restlichen Layern als
Erweiterungslayer. Die Layer bauen aufeinander auf und Layer li kann nur decodiert werden, wenn
alle vorhergehenden Layer (l0 bis li−1 ) ebenfalls vorhanden sind. Mit der Anzahl der Layer kann
die Qualität des Streams beeinusst werden.
26
2005-03-21/015/IN99/2253
4.5. Service Adaptive Multicast
4.5.
Service Adaptive Multicast
Ein weiterer Ansatz für Multimedia-Streaming mit Overlay-Multicast ist
daptive Multicast
Service A-
[Banerjee u. a. (2003)] (SAM).
SAM geht davon aus, dass verschiedene Nutzer die Daten auf unterschiedliche Weise
erhalten wollen. Zum Beispiel benötigt ein Nutzer die Daten verschlüsselt oder den
Audio-Stream in einer anderen Sprache, wobei ein anderer Nutzer einen transcodierten
Stream benötigt.
In SAM existiert eine globale Informationsbasis in Form einer skalierbaren, fehlertoleranten und verwaltungsfreien
verteilten Hash-Table
2
(DHT ). Dabei ndet eine DHT-
Topologie wie bei CAN [Ratnasamy u. a. (2001)] Verwendung. Mit Hilfe von einem
Landmark-Clustering wie in [Ng und Zhang (2001)] wird für jeden Knoten ein Lokalitätsvektor (Landmark-Vektor ) erzeugt. Anhand dieser Vektoren, können die Entfernungen zwischen zwei Knoten bestimmt werden. Da einfaches Landmark-Clustering
jedoch bei nahen Knoten relativ ungenau ist, wird hierarchisches Landmark-Clustering
verwendet. Zusätzlich erfolgt eine Adaptierung des Vektors mit Hilfe von Round Trip
Times (RTT). Bei hierarchischem Landmark-Clustering wird zuerst die grobe Position
mit Hilfe von globalen Landmarks bestimmt und dann durch lokalen Landmarks verfeinert. Mit diesen Lokalitäts-Informationen, die in der globalen DHT gespeichert sind,
wird ein Multicast-Baum erzeugt.
Nach eigenen Angaben besitzt SAM sehr schnelle Algorithmen zum Erstellen und Verändern des Baumes, bei denen zudem meist nur lokale Änderungen notwendig sind. Bei
dem Erzeugen von neuen Pfaden wird möglichst auf existierende nahe Pfade zurückgegrien. Die Mechanismen sind daher sehr skalierbar und können so mit einer sehr
groÿen Anzahl an Service-Anbietern und auch Service-Empfängern umgehen.
Bei SAM sind zwar mehrere Service-Anbieter vorgesehen, aber das kooperative Senden
von Daten von mehreren Sendern zu einem Empfänger wurde nicht realisiert. Jeder
Empfänger kann eigene Anforderungen an die Daten haben (z. B. nur einen AudioStream) und ist so möglicherweise inkompatibel zu anderen Knoten, die wiederum
andere Anforderungen aufweisen (z. B. Audio- und Video-Stream). Auf die daraus
resultierenden Probleme, dass dadurch nur noch eine ungenügende Anzahl von anbie-
2 Distributed
Hash Table
2005-03-21/015/IN99/2253
27
4. Verwandte Ansätze
tenden Knoten existiert, wird nicht eingegangen.
4.6.
PeerCast
PeerCast [Deshpande u. a. (2002)] ist eine Live-Streaming Architektur über ein dynamisches P2P-Netzwerk. Ein Peering-Layer ermöglicht einen ezienten Aufbau und Pege
des Overlay-Netzes. Die Overlay-Struktur ist ein (Multicast-)Baum mit der Quelle als
Wurzel.
Das
Peering-Layer
ist hierbei die Kernentwicklung und bendet sich zwischen der
Transport- und Anwendungsschicht. Die Knoten koordinieren sich innerhalb dieses
Peering-Layers
selbst und pegen den Multicast-Baum. Existierende Anwendungen
müssen nicht geändert werden, um mit Hilfe dieses
Peering-Layers
Streaming zu be-
treiben.
Es ist auf einfache Art und Weise möglich mit hunderten autonomen und kurzlebi-
3
gen Knoten eine hochdynamische Gruppe zu bilden. Die nach Ausfall eines Knotens
abgetrennten Teile des Netzes werden wieder in den Baum eingegliedert, ohne dass
zu groÿe Datenverluste entstehen. Da jeder Knoten seine Ressourcen (Rechenleistung,
Speicher, Bandbreite) selbst am besten kennt, entscheidet jeder Knoten für sich wie
viele Clients er bedienen kann.
Ein neuer Knoten wird von der Wurzel des Baumes an immer weiter nach unten geleitet,
bis er einen Server gefunden hat, der noch über freie Kapazitäten verfügt. Für die
Auswahl des Kindknotens können verschiedene Methoden angewendet werden. Neben
der zufälligen oder
Round-Robin
Methode steht noch
4
wobei versucht wird anhand der Position
Smart-Placement
zur Verfügung,
im Netzwerk die Knoten weiterzuleiten.
Das kombinierte Senden von Daten von mehreren Servern an einen Knoten ist hier
nicht möglich und es existiert nur eine geringe Berücksichtigung der Lokalität.
3 im
Minutenbereich
Knoten wird zu dem Kindsknoten weitergeleitet, zu dem er die kürzeste Latenzzeit hat.
4 Der
28
2005-03-21/015/IN99/2253
4.7. Scattercast
4.7.
Scattercast
Scattercast
[Chawathe (2003)] ist ein Ansatz für Live-Streaming von einem auf ei-
ne Anwendung anpassbaren hybriden Overlay-Netzwerks mit
Scattercast Proxys.
Die
Proxys werden über ein Netz von Unicast-Verbindungen untereinander verbunden. Ein
Distance Vector Multicast Routing Protocol (DVMRP) [RFC 1075 (1988)] berechnet
dann einen Source-Routed-Reverse-Shortest-Path-Tree für jede Quelle. Die Clients verbinden sich dann zu einem lokalen Proxy und beziehen von ihm ihre Daten. An dieser
Stelle kann dann lokal auch Netzwerk-Multicast verwendet werden.
4.8.
End System Multicast
[Chu u. a. (2002)] haben mit
End System Multicast
5
(ESM ) einen Ansatz für eine
Gruppenkommunikation auf der Anwendungsebene entwickelt. Für die Realisierung
von ESM wurde das
Narada -Protokoll entwickelt, das die Endsysteme in einer selbst-
organisierenden Overlay-Struktur auf einer voll dezentralisierten Weise verwaltet.
Alle Gruppenmitglieder werden in einem Overlay-Netz verwaltet und sobald ein Sender
Daten an eine Menge von Empfängern senden will, wird ein Spannbaum aufgebaut.
Der Spannbaum wird mit Hilfe einer eigenen Version von DVMRP [RFC 1075 (1988)]
erzeugt. Durch die ständige Überwachung der Verbindungen wird die Qualität des
Netzes ständig verbessert, da die Verbindungen gegebenenfalls verändert werden um
einen guten Spannbaum aufzubauen.
Narada ist sehr robust gegenüber Ausfällen von Endsystemen und dynamischen Änderungen von Gruppenmitgliedschaften, da jedes Mitglied eine Liste über alle anderen
Mitglieder einer Gruppe verwaltet. Diese Listen müssen allerdings ständig aktuell gehalten werden, was einen erheblichen Verwaltungsaufwand darstellt und die Skalierbarkeit einschränkt, sodass das ESM auf kleine bis mittlere Gruppengröÿen (einige hundert
Mitglieder) beschränkt ist.
5 http://esm.cs.cmu.edu
2005-03-21/015/IN99/2253
29
4. Verwandte Ansätze
4.9.
Zigzag
Zigzag
[Tran u. a. (2003b)] [Tran u. a. (2003a)] ist eine P2P-Technologie für das Live-
Streaming der bandbreitenintensiven Multimedia-Daten von einer Quelle zu einer groÿen
Menge an Empfängern im Internet. Dies wird über eine Implementierung eines Multicast auf der Anwendungsebene erreicht.
Jeder Knoten wird als ein Peer angesehen, der seine schon erhaltenen Daten weiteren
Knoten zur Verfügung stellen kann. Dabei wird ein Verteilungsbaum (Multicast-Baum)
aufgebaut, dessen Wurzel der Server
6
ist. Die Ende-zu-Ende-Verzögerung wird groÿ,
wenn viele Empfänger vor einem aktuell betrachteten Knoten liegen, also nahe den
Blättern im Baum. Um diese Verzögerung zu verringern, muss die Baumhöhe klein
sein. Mit kleiner Baumhöhe erhöht sich allerdings der Grad der Knoten. Dabei entsteht
ein Engpass bei diesem Knoten und die Verzögerung steigt wieder. Deswegen sollte der
Knotengrad durch eine Konstante beschränkt werden.
Für die Bewertung der Skalierbarkeit eines solchen Systems ist der Kontroll-Overhead
7
ein wichtiges Kriterium. Er sollte möglichst klein und lokal begrenzt (keine ServerInteraktion) gehalten werden.
Zigzag
administrative Organisation und
administrative Organisation organisiert
verwendet zwei verschiedene Strukturen: die
den darauf aufgebauten
Multicast-Baum.
Die
alle Empfänger in einer Hierarchie von Clustern, welche in der Gröÿe beschränkt
sind. Die Wege der Datenübertragung werden im
Multicast-Baum
festgelegt. In Ab-
bildung 4.1 werden diese zwei Strukturen veranschaulicht.
Eine
administrative Organisation
von Peers ist in der Abbildung 4.1(a) zu sehen. Hier-
bei handelt es sich um eine schichtenbasierte Clusterhierarchie, die nach folgenden
Regeln deniert ist (Nachfolgend gilt:
Knoten,
k>3
H
ist die Anzahl der Layer,
N
die Anzahl der
ist eine Konstante.):
•
Layer-0 beinhaltet alle Peers.
•
Peers in Layer-j (j<H−1) sind eingeteilt in Cluster der Gröÿe
[k, 3k].
6 Da
es nur eine Ursprungsquelle gibt, wird sie hier als Server bezeichnet.
Kontroll-Overhead entspricht dem Kommunikationsaufwand, der für die Aufrechterhaltung des
Netzwerkes (insbesondere des Multicast-Baums) notwendig ist.
7 Der
30
2005-03-21/015/IN99/2253
4.9. Zigzag
(a) Administrative Organisation
(b) Multicast-Baum
Abbildung 4.1.:
− 1)
Zigzag -Struktur [Tran u. a. (2003b)]
•
Layer-(H
•
Ein Peer in einem Cluster auf Layer-j wird zum
hat nur einen Cluster der Gröÿe
[2, 3k].
Head
dieses Clusters gewählt.
Dabei wird er automatisch Mitglied in einem Cluster auf Layer-j + 1 (j<H−1) . Der
Server ist
•
Head
aller Cluster, denen er angehört.
Ein Peer in einem Cluster auf Layer-j wird
dieser Peer jedoch nicht schon
der Server auf Layer-(H
− 1),
Head
dieses Clusters, wobei
dieses Clusters sein darf. Die Ausnahme ist
dort ist er
Die Beschränkung der Cluster nach oben mit
2005-03-21/015/IN99/2253
Associate-Head
Head
3k
und
statt
Associate-Head
2k
gleichzeitig.
dient der Vermeidung des
31
4. Verwandte Ansätze
8
erneuten Unterlaufens nach dem Split
Der aus dieser Struktur gewonnene
in zwei Cluster.
Multicast-Baum
ist in Abbildung 4.1(b) zu sehen.
C-Rules (Connectivity Rules) aufgebaut
Peer, der weder ein Head noch ein Associate-Head darstellt.):
Er wird anhand der
•
(ein
Non-Head
ist ein
Ein Peer darf nur auf seinem höchsten Layer ein- und ausgehende Verbindungen
haben.
• Non-Head -Mitglieder
eines Clusters erhalten ihre Daten direkt von ihrem
Asso-
ciate-Head.
•
Associate-Head auf Layer-j , mit Head H , erhält die Daten von einem NonHead auf Layer-(j + 1) (j<H−1) , in dessen Cluster sich H bendet.
Der
Durch die daraus entstehende Zickzack-Struktur (engl. zigzag) hat
Zigzag
seinen Na-
men bekommen. Da ein Knoten auf einem höheren Layer in vielen Clustern
Head
ist,
kann dieser nicht zur Datenverteilung verwendet werden, sonst würden die Peers nahe
dem Server am stärksten ausgelastet sein und der Flaschenhals wäre nah bei der Quelle.
Associate-Head zur Datenverteilung hat den Vorteil der Ausfallsicherheit. Wenn der Head ausfällt, hätte dies keinen Einuss auf die Datenübertragung,
da der Associate-Head noch vorhanden wäre. Fällt dagegen der Associate-Head aus,
könnte der Head schnell einen neuen wählen.
Die Verwendung des
Die denierten Regeln garantieren einen
tengrad von
6k − 3
der Knoten und
k
Multicast-Baum
und einer maximalen Höhe von
mit einem Worst-Case-Kno-
2 logk N + 1 (N
ist die Anzahl
eine Konstante). Dadurch wird auch eine kleine Ende-zu-Ende-
Verzögerung erreicht. Die Eekte der Netzwerkdynamik, wie unvorhersehbares Verhalten der Empfänger, können gut behandelt werden, ohne die Regeln zu verletzen. Der
Kontroll-Overhead ist im Worst-Case
testen und
O(k)[sic!] (O(1))
O(k∗logk (N ))[sic!] (O(log(N ))) für den schlech-
für einen durchschnittlichen Empfänger. Das Beitreten
zum Netzwerk ist schnell und benötigt nur einen kleinen Aufwand, der unabhängig von
N
ist. Insbesondere kann die Fehlerbehandlung lokal erreicht werden, wobei nur eine
konstante Anzahl von existierenden Empfängern beeinusst wird (der Server meist gar
8 Nach
dem Überlauf bei 2k + 1 würde der Cluster in zwei Cluster der Gröÿe k und k + 1 geteilt. Bei
k − 1 würden die Cluster aber wieder zusammengeführt werden müssen.
32
2005-03-21/015/IN99/2253
4.10. Fazit
nicht). Weitere Aspekte wie die Sicherheit und die Heterogenität beim P2P-Streaming
werden in zukünftigen Entwicklungen betrachtet.
4.10. Fazit
Die hier vorgestellten Ansätze versuchen alle auf unterschiedliche Weise das Problem
des Streamings der bandbreitenintensiven Multimedia-Daten an eine groÿe Anzahl an
Empfängern zu lösen. Die groÿe Anzahl an existierenden Ansätzen zeigt die Schwierigkeit, eine allgemeine Lösung zu nden. So sind je nach Zielsetzung unterschiedliche
Ansätze entstanden und da die Entwicklung nicht abgeschlossen ist, werden sicher noch
weitere entstehen.
Alle Systeme erfüllen ihre selbstgestellte Aufgabe gut, allerdings entsprechen ihre Anforderungen nicht den vorliegenden (siehe Kapitel 5) und sind so nur bedingt geeignet.
Ein zentraler Ansatz ist von Natur aus stark in der Skalierbarkeit eingeschränkt und
zudem existiert ein
Single Point of Failure.
Systeme mit MDC- oder Layer-encodiertem Streaming, die mehrere Bäume für jeden
Teilstream verwalten, besitzen eine höhere Robustheit gegen den Ausfall eines Knotens.
Allerdings steigt dabei der Verwaltungsaufwand und die Berechnung von verschiedenen
Bäumen stellt sich als schwierig dar. Andere Systeme, die nur einen Baum als Datenverteilungsstruktur verwenden berücksichtigen auf diese Art nicht, dass mehrere Sender
einen Empfänger versorgen können, um auch Knoten mit ungenügender ausgehender
Bandbreite als Quelle nutzen zu können.
Auÿer
SAM, Scattercast
und
ESM
vernachlässigen die anderen Systeme auÿerdem die
Möglichkeit eines ezienten Routings oder einer ezienten Datenverteilung mit Hilfe
von Lokalitätsbetrachtungen der Knoten. Da auch diese drei Systeme nicht vollständig
unseren Anforderungen entsprechen, ist es notwendig ein eigenes System zu entwickeln.
2005-03-21/015/IN99/2253
33
4. Verwandte Ansätze
34
2005-03-21/015/IN99/2253
5. Anforderungen
Es soll ein Multimedia-Streaming-System entwickelt werden, dass eine groÿe Anzahl
von Nutzern ezient bewältigen kann.
Zuerst werden im Abschnitt 5.1 die allgemeinen Anforderungen an das StreamingSystem vorgestellt. Danach werden im Abschnitt 5.2 und Abschnitt 5.3 die speziellen
Anforderungen für die in dieser Arbeit betrachteten Komponenten Routing und Lokalisierung beschrieben.
5.1. Allgemeine Anforderungen an das System
Streaming:
Das System soll einen oder mehrere Multimedia-Streams (Live oder Video-
On-Demand) an seine Teilnehmer verteilen. Durch die strikte zeitliche Abhängigkeit der Multimedia-Daten, müssen die Daten zudem rechtzeitig bei dem Empfänger ankommen (siehe Abschnitt 3.7).
Skalierbarkeit:
Bei der Erhöhung der Teilnehmeranzahl darf sich der Aufwand (Res-
sourcenverbrauch) nicht zu stark vergröÿern.
Geringe Verzögerung:
Die Verzögerung von der Urquelle
1
zu einem Teilnehmer soll-
te nicht zu groÿ sein. Da allerdings keine Interaktion zwischen den Teilnehmer
besteht, besitzt diese Anforderung eine geringere Priorität.
Eziente Netzwerkauslastung:
Die
Stress - und Stretch -Werte (siehe Abschnitt 3.3)
sollten möglichst klein gehalten werden.
1
Die Urquelle stellt der Server dar, der die Daten zuerst erhält. Typischerweise geschieht dies auÿerhalb des Systems (z. B. von Festplatte oder Kamera).
2005-03-21/015/IN99/2253
35
5. Anforderungen
Stabilität:
Da von einem sehr dynamischen Netzwerk ausgegangen wird, muss ein
Knotenausfall schnell und ezient behandelt werden. Es sollte dabei zu möglichst
wenigen weiteren Ausfällen kommen.
Qualität:
2
Die Anzahl der Paketverluste sowie der Jitter
sollten möglichst klein sein.
5.2. Funktionale Anforderungen
Lokalisierung:
Die Lokalisierung hat die Aufgabe nach vorhandenen Diensten wie zum
Beispiel einem Stream zu suchen. Dem anfragenden Scheduling soll dann eine Vorauswahl an Knoten, die den gesuchten Dienst (hier Stream) besitzen, übergeben
werden.
Routing:
Das Routing hat die Aufgabe ein Signalisierungsnetz aufzubauen und die
Steuerinformationen zwischen den einzelnen Knoten zu verschicken (zu routen).
Dabei muss bei unbekannten Empfängern entschieden werden, an welchen Knoten
die Nachricht geschickt werden soll.
5.3. Nicht funktionale Anforderungen
Eziente Suche:
Die Suche nach Diensten (z. B. Streams) und Anbietern im Netz-
werk sollte mit möglichst wenig Kommunikation verbunden sein.
Mehrere Streams:
Es muss berücksichtigt werden, dass mehrere Dienste im Netzwerk
existieren und speziell auch ein Knoten mehrere anbieten kann. Dies beinhaltet,
dass die Dienste einen eindeutigen Bezeichner erhalten müssen.
Ezienz:
Der Aufbau und die Verwaltung des Overlay-Netzes, als Aufgabe des Rou-
tings, sollte mit möglichst wenig Kommunikations- und Berechnungsaufwand verbunden sein. Da die beschränkende Komponente meist das Netzwerk zwischen
den Knoten darstellt, hat der Kommunikationsaufwand eine sehr hohe Bedeutung. Dazu sollten die
Stress -
und
Stretch -Werte
klein gehalten werden (siehe
Abschnitt 3.3).
2
Jitter (Zittern) beschreibt Schwankungen in der Übertragung oder Verarbeitung der Datenpakete.
36
2005-03-21/015/IN99/2253
5.3. Nicht funktionale Anforderungen
Stabilität:
Das Netzwerk muss trotz des dynamischen Knotenverhaltens (insbesondere
spontanes Verlassen des Netzwerkes) für die restlichen Mitglieder stabil bleiben.
Beständigkeit:
Durch häug ausfallende und sehr lose gekoppelte Knoten, kann es
3
schnell zu einer Fragmentierung
des Netzwerkes kommen, die verhindert werden
muss.
Skalierbarkeit:
Da eine möglichst groÿe Menge an Knoten mit Daten versorgt werden
soll, muss das System bezüglich der Knotenanzahl skalierbar sein. Daher darf
die Kommunikation nicht übermäÿig mit der Knotenanzahl im Netzwerk steigen.
Ideal wäre es, wenn die Knotenanzahl keinen Einuss auf die Verwaltung und das
Verhalten des Netzwerkes hätte, damit das Netzwerk beliebig groÿ sein kann.
Heterogenität:
Es muss berücksichtigt werden, dass die Knoten sehr heterogen bezüg-
lich vieler Eigenschaften, wie Rechenkapazität, Bandbreite und Betriebszeit sind.
Auch kann die ausgehende Bandbreite ungleich der eingehenden Bandbreite, also
asymmetrisch, sein.
Portabilität:
Damit das System universell eingesetzt werden kann, sollte es auf vielen
unterschiedlichen Architekturen oder Betriebssystemen einsetzbar bzw. lauähig
sein.
Lokalität:
Im Abschnitt 3.5 wurde erläutert, dass die Lokalität erheblichen Einuss
auf die Ezienz, bezüglich Netzwerkauslastung und damit auch Skalierbarkeit,
hat. Daher muss das System diese Lokalität berücksichtigen und zum Beispiel bei
der Suche nach Quellen eines Services möglichst nahe Knoten nden.
Vollständige Antwortmengen:
Beim Suchen bzw. Lokalisieren von Diensten (z. B.
Streams) im System sollte die Antwortmenge möglichst vollständig (bezüglich
der jeweiligen Lokalität) sein.
Erweiterbarkeit und Wartbarkeit:
Damit das System nach dieser Diplomarbeit wei-
terentwickelt werden kann und insbesondere auch andere Algorithmen oder Strategien eingesetzt werden können, sollte auf die Erweiterbarkeit und Wartbarkeit
geachtet werden.
3 Das
Netzwerk zerfällt in mehrere Teilnetze.
2005-03-21/015/IN99/2253
37
5. Anforderungen
38
2005-03-21/015/IN99/2253
6. Entwurf
Die Anforderungen aus Kapitel 5 werden nun verwendet, um ein Streaming-Modell zu
entwickeln. Danach wird die genaue Lokalitätsbestimmung im Abschnitt 6.2 vorgestellt,
welche vom Routing im Abschnitt 6.3 verwendet wird. In Abschnitt 6.4 werden einige
Möglichkeiten für die Lokalisierung von Ressourcen vorgestellt.
6.1. P2P-Streaming-Modell
Das Modell beinhaltet eine Menge
P
(Formel 6.1), die aus
N (N ∈ N)
Peers besteht.
Diese Peers agieren auf eine dezentrale lokalitätsbewusste kooperative Weise untereinander.
n
o
P = Pi | 1 ≤ i ≤ N
Dabei ist die Anzahl
N
(6.1)
der Peers dynamisch, da jeder Peer das Netzwerk zu jeder Zeit
verlassen oder ihm beitreten kann.
Alle Peers sind gleichberechtigt, besitzen die gleichen Rechte und Pichten und können
Dienste anfordern und anbieten. Sobald ein Peer
Pi
einen Dienst
a
er sich in der Menge Pr (Formel 6.2) und sobald er den Dienst
Pas (Formel 6.3). Die Mengen Pas und Par sind Teilmengen von
n
= Pra ∈ P | Pra
n
Pas = Psa ∈ P | Psa
Par
Wenn ein Peer einen Dienst
fordert Dienst
bietet Dienst
a
a
an
anfordert, bendet
a anbietet, in der Menge
P (Pas ⊆ P, Par ⊆ P).
o
o
an
a
(6.2)
(6.3)
a nutzt, kann er diesen wieder anderen Peers zur Verfügung
stellen. Insbesondere beim Empfangen eines Streams, als Form eines Dienstes, kann
2005-03-21/015/IN99/2253
39
6. Entwurf
der Peer die empfangenen Daten an andere Peers weiterleiten. Da jeder Peer auch noch
einen individuellen Puer besitzt, ist es sogar möglich, dass er eine gewisse Zeitspanne
an Daten anbietet. Die Gesamtkapazität wird ständig erhöht, da mit den Peers, die
den Dienst nutzen, auch die Anzahl der Peers steigt, die den Dienst anbieten.
Es ist vorgesehen, dass ein Peer
Pra
den Dienst
a
von mehreren Peers
Psa
nutzen kann.
Dies ist besonders bei Diensten in Form von Streams sinnvoll, da so die verwendete
Bandbreite auf mehrere Peers
Psa
aufgeteilt wird und auch bei Ausfall eines Peers
Psa
noch ein Teil der Daten empfangen werden kann. Die Berechnung der Datenanteile für
jeden Peer
Psa
kann beim Peer
Pra
erfolgen, da er seine Dienstanbieter (Quellen) selbst
wählt.
Die Auswahl der Quellen soll unter anderem anhand von Lokalitätskriterien erfolgen,
da nahe Knoten meist eine ezientere Übertragung (geringere Latenz, geringerer Jitter,
höhere Bandbreite) ermöglichen (siehe Abschnitt 3.5). Auf die Auswahl der Lokalitätskriterien wird im folgenden Abschnitt 6.2 eingegangen.
Jeder anbietende Peer
Psa
muss, mit Ausnahme der Urquelle, gleichzeitig die Daten
a
als anfordernder Peer Pr erhalten. Die Urquelle erhält die Daten von auÿerhalb des
Systems, beispielsweise von der Festplatte oder einer Videokamera (je nachdem, ob
Live-Streaming oder Video-on-Demand).
6.2. Lokalität
1
Als einfachstes Kriterium für die relativen Entfernungen (Lokalität) von Knoten in
einem Netzwerk, wie dem Internet, kann die Latenz verwendet werden.
Die Latenz
ergibt sich dabei aus der halben Umlaufzeit (RTT) eines Paketes.
Als erweitertes Kriterium könnte die Anzahl der physikalischen Hops zwischen den
Knoten verwendet werden. Dies ist allerdings schwieriger zu messen, sollte aber in
späteren Forschungsarbeiten weiter untersucht werden.
Da die Grundidee für die Lokalitätsberechnung, im Rahmen dieser Diplomarbeit, von
Vivaldi
[Cox u. a. (2003)] stammt, erfolgt zunächst eine kurze Zusammenfassung dieses
Ansatzes, bevor die eigene Variation erläutert wird.
1 Da absolute geographische Entfernungen nicht geeignet sind, werden relative Entfernungen bezüglich
Netzwerkparametern verwendet.
40
2005-03-21/015/IN99/2253
6.2. Lokalität
6.2.1.
Vivaldi
Vivaldi
[Cox u. a. (2003)] ist ein verteilter Algorithmus zur Berechnung von syntheti-
schen Koordinaten für Internetrechner. Dabei soll die euklidische Distanz der Koordinaten zweier Rechner der Latenz zwischen ihnen entsprechen.
Die Entwickler von
Vivaldi
wurden dabei von
Zhang (2001)] (GNP) angeregt.
Global Network Positioning
[Ng und
GNP demonstriert die Möglichkeit der Berechnung von
synthetischen Koordinaten, um Latenzen im Internet vorauszusagen. Dabei werden die
eigenen Koordinaten anhand von Latenzmessungen zu einer kleinen Anzahl (5 - 20)
von festen Punkten, so genannten
der
Landmarks
Bei
Vivaldi
Landmarks (engl. Grenzsteine), berechnet. Die Wahl
bestimmt dabei erheblich die Genauigkeit der Latenzvorhersagen.
werden keine solchen
voraussetzt, eignet sich
Vivaldi
Landmarks
benötigt. Da es keine feste Infrastruktur
auch für P2P-Netzwerke. Jedes Mal wenn ein Knoten
mit einem anderen kommuniziert, wird die Latenz zu diesem Knoten gemessen und es
werden die Koordinaten angepasst, um den Fehler zu minimieren. Die Anpassung der
Koordinaten erfolgt mit Hilfe einer Lernrate
kleiner wird und minimal
δ , die am Anfang 1.0 beträgt, schrittweise
0.05 ist. Dadurch werden anfangs gute Koordinaten schneller
erreicht und später ein Hin- und Herschwingen vermieden.
Vivaldi
Für
muss die Anwendung bei jedem Kontakt zu einem anderen Knoten La-
tenzinformationen ermitteln und
Vivaldi
übergeben. Auf diese Art ist es nicht nötig,
Vivaldi selbst Messpakete verschickt. Allerdings muss die Anwendung Platz für
Vivaldi -Koordinaten in ihren Paketen, die an andere Knoten geschickt werden,
dass
die
reservieren.
Als sehr vorteilhaft erweist sich, dass die Latenz zu einem Knoten auf Grund der
vorhandenen Koordinaten ohne explizite Messung berechnet werden kann. Sogar die
Latenz zweier anderer Knoten (nicht der eigene) untereinander kann bestimmt werden,
sofern dies notwendig sein sollte.
2005-03-21/015/IN99/2253
41
6. Entwurf
Vivaldi -Ansatzes
6.2.2. Eigene Abwandlung des
Bei
Vivaldi
wurde der Algorithmus nur anhand von Pseudocode erklärt. Hier wird
2
die eigene Abwandlung jedoch mit Hilfe einiger Formeln
erläutert.
Die verwendeten
Parameter sind zum besseren Verständnis in Tabelle 6.1 zusammengefasst.
D
→
−
x
Anzahl der Dimensionen der Lokalitätsvektoren
eigener Lokalitätsvektor des lokalen Knotens
−
→
y
Lokalitätsvektor eines anderen Knotens
RT Tcal
berechnete RTT aus zwei Lokalitätsvektoren
gekürzte Schreibweise für
RT Tmeas
−
→
x
und
(dies ist die ab-
−
→
RT Tcal (→
x ,−
y ))
gemessene RTT zwischen zwei Knoten (bezieht sich auf dieselben Knoten
wie
RT Tcal )
ε
Fehler zwischen berechneter und gemessener RTT
δ
→
−
x0
Lernrate
−
→
x 0δ=1
−
→
y
eigener Lokalitätsvektor nach dem Lernvorgang
eigener Lokalitätsvektor für
δ = 1.0
(dabei würde
ε
vollständig beseitigt
werden)
Tabelle 6.1.: Verwendete Variablen für die Lokalitätsberechnung
Jeder Knoten besitzt seinen eigenen
D-dimensionalen
Lokalitätsvektor, den er anfangs
zufällig wählt.
−
→
x
Der Abstand zweier Lokalitätsvektoren (
und
−
→
y)
soll der RTT entsprechen (siehe
Formel 6.4). Auf diese Weise kann relativ einfach die erwartete RTT (RT Tcal ) ohne
Messung bestimmt werden.
−
→
x = (x1 , x2 , . . . , xD )
→
−
y = (y1 , y2 , . . . , yD )
v
u D
uX
→
−
→
−
→
−
→
−
RT Tcal ( x , y ) = | x − y | = t (xi − yi )2
(6.4)
i=1
2 Die
Unterschiede zu
zu nden.
42
Vivaldi
sind nur bei der Berechnung von δ und den Berechnungszeitpunkten
2005-03-21/015/IN99/2253
6.2. Lokalität
Da die Lokalitätsvektoren anfangs zufällig gewählt werden, müssen sie an die richtige
RTT angepasst werden. Hierzu werden in bestimmten Abständen
τ
RTT-Messungen
3
(RT Tmeas ) zu einigen zufällig ausgewählten bekannten Knoten vorgenommen und der
jeweilige Fehler
ε
nach der Formel 6.5 berechnet.
ε = RT Tcal − RT Tmeas
(6.5)
Jeder Knoten ist dabei nur für seinen eigenen Lokalitätsvektor zuständig und nimmt
die Richtigkeit des anderen Lokalitätsvektors an. In Abbildung 6.1 ist solch ein Lernvorgang zu sehen, wobei der anfängliche lokale Lokalitätsvektor
−
→
x
und der andere
−
→
Lokalitätsvektor y entspricht. Als Erstes wird der Fehler ε, als Dierenz der berechneten und der gemessenen RTT (siehe Formel 6.5), berechnet. Um den Fehler
zu beseitigen, müsste der eigene Lokalitätsvektor
werden. Diese Stelle ist mit
6
−
→
x 0δ=1
−
→
x
um
ε
in Richtung
−
→
y
ε komplett
verschoben
gekennzeichnet.
*A
→
A r−
y
A
*
RT Tcal
→0
−
RT Tmeas
x δ=1
r
*A
→0
−
x
ε
r
A−
A
→
*
Ax
r
AA
ε·δ
-
Abbildung 6.1.: Berechnung des neuen Lokalitätsvektors.
Dabei besitzen allerdings temporär fehlerhafte Messungen einen genauso groÿen Einuss wie korrekte Messungen. Da sich ebenso die Lokalitätsvektoren der anderen Knoten mit groÿer Intensität verändern würden, entstehen so leicht starke Schwingungen.
3 Bei
Vivaldi
wurden die Messungen und damit auch die Mess- und Berechnungszeitpunkte in die
Anwendung verlagert.
2005-03-21/015/IN99/2253
43
6. Entwurf
Um dies zu verhindern, wird mit Hilfe einer Lernrate
δ
nur ein bestimmter Teil des
→0
−
ausgeglichen. Die Berechnung des neuen eigenen Lokalitätsvektors x erfolgt
→
−
→
y −−
x
→
−
der Verschiebungsrichtung des Vektors x .
nach der Formel 6.6. Dabei entspricht
RT Tcal
Fehlers
ε
→
−
→
y −−
x
−
→
→
−
0
·ε·δ
x = x + −
→
→
−
|y − x|
→
−
→
y −−
x
→
=−
x +
·ε·δ
RT Tcal
(6.6)
Die Entfernung nach dem Lernvorgang kann mit Formel 6.7 berechnet werden.
→
→
→
→
x0−−
y | = |−
x −−
y|+ε·δ
|−
(6.7)
= RT Tcal + ε · δ
Nun ist es möglich das Lernen, mit Hilfe der Parameter
δ
und
τ,
dynamisch zu beein-
ussen. Da anfangs die Lokalitätsvektoren noch zufällig sind, sollte
sein, damit der Fehler
ε
τ
klein und
schnell klein wird. Später wird der Parameter
erhöht und der Parameter
δ
τ
δ
groÿ
schrittweise
schrittweise verringert, damit ein Hin- und Herschwingen
vermieden wird. Auch sollten die Lokalitätsvektoren nach einiger Zeit relativ stabile
Werte erreicht haben und sich nur noch gering verändern, sodass sie nicht mehr so oft
aktualisiert werden müssen (τ kann groÿ sein).
4
Nun sollte aber nicht nur von der statischen
Variante ausgegangen werden, auch muss
die dynamische Veränderung der Abstände (RTT) zwischen den Knoten berücksichtigt
werden. Als Beispiel seien hier Funknetze genannt, bei denen sich potenziell alle Teilnehmer hin- und herbewegen können. Daher wird die Lernrate
verringert (wie bei
ε
δ
nicht ständig schrittweise
Vivaldi ), sondern anhand des Fehlers ε dynamisch angepasst. Falls
klein ist, das heiÿt der eigene Lokalitätsvektor einen guten Wert besitzt, wird die
Lernrate
δ
reduziert. Wenn allerdings
ε groÿ ist, wird die Lernrate δ
wieder erhöht, um
einen guten Wert für den eigenen Lokalitätsvektor zu erreichen.
Die Bewegung eines Knotens sollte nur zu einer Anpassung des Lokalitätsvektors von
diesem Knoten führen. Das Problem ist ohne globale Sicht festzustellen, welcher Knoten
4
44
Wenn sich die Latenzen der Knoten untereinander nicht verändern, kann die Situation als statische
Variante beschrieben werden.
2005-03-21/015/IN99/2253
6.3. Routing
sich bewegt hat, wenn nur Entfernungen bekannt sind. Dies wird durch die Betrachtung
des Fehlers
ε erreicht. Aus der Sicht des sich bewegenden Knotens haben sich alle seine
5
Entfernungen zu anderen Knoten verändert . Für einen sich nicht bewegenden Knoten
ist nur die Entfernung zu dem sich bewegenden Knoten anders. Daher sind beim sich
bewegenden Knoten alle Fehler
ε
bei den anderen Knoten fast alle
groÿ, sodass er seine Lernrate
ε
klein sind und so
δ
δ
erhöht. Wohingegen
klein bleibt.
6.3. Routing
Das Routing hat die Aufgabe zu entscheiden, an welches Ziel ein Paket versendet wird.
Diese Entscheidung stellt sich als besonders wichtig dar, wenn keine direkte Verbindung
zu dem Empfänger existiert oder bekannt ist. Dabei trägt das Routing ebenso die
Verantwortung über die Nachbarschaftswahl.
Das Routing soll neue Knoten kennen lernen und nicht mehr erreichbare Knoten vergessen. Eine gröÿere Knotenmenge verringert die Gefahr einer Partitionierung des Netzwerkes, wenn einige Knoten ausfallen. Allerdings ist die Verwaltung und vor allem die
Aktualisierung einer sehr groÿen Knotenmenge sehr aufwändig und birgt einen groÿen
Nachrichtenoverhead in sich. Da auch eine gröÿere Anzahl an bekannten Knoten die
Routingentscheidung unter Umständen vereinfacht, sollte die Gröÿe der Menge an bekannten Knoten sorgsam gewählt werden.
Das Kennenlernen der neuen Knoten gestaltet sich durch die starke Verbreitung von
Firewalls mit
Network Address Translator
[RFC 2663 (1999)] (NAT) schwierig, da die
Netzwerkadresse auf beiden Seiten der Firewall unterschiedlich sein kann. Dabei ist das
Lernen eines Knotens nur mit Hilfe eines dritten Knotens, der beide anderen Knoten
kennt, möglich.
Da beim Routing die Lokalität berücksichtigt werden soll, muss das Routing die Lokalitätsberechnung, die unter Abschnitt 6.2.2 vorgestellt wurde, vornehmen. Allerdings
sollte das Routing im System austauschbar sein. Aus diesem Grund können die Lokalitätsvektoren nicht in jeder Nachricht mitversendet werden (wie bei
Vivaldi ), sondern
es müssen separate Anfragen und Nachrichten versendet werden können.
5 Diese
Veränderung entspricht dem Fehler ε.
2005-03-21/015/IN99/2253
45
6. Entwurf
Die Knoten mit ihren Entfernungen werden anhand von Schwellwerten den Horizonten
zugeordnet. Mit Hilfe dieser Horizonte kann die Lokalisierung (Abschnitt 6.4) eine Vorauswahl für das Scheduling treen. Ebenso kann das Routing bei unbekannten Adressen
mittels der Lokalität entscheiden, zu welchen Knoten das Paket weitergeleitet werden
soll.
Für das Weiterleiten von Paketen stellt sich die Verwendung eines
Time To Live (TTL)-
Feldes als sinnvoll dar. Bei jedem Knoten wird diese TTL um Eins verringert. Wenn
sie Null erreicht, wird das Paket nicht mehr weitergeleitet. Dadurch wird bei Kreisbildungen im Netzwerk verhindert, dass ein Paket unendlich oft weitergeleitet wird und
sinnlos Ressourcen verbraucht werden.
6.4. Lokalisierung
Die Lokalisierung soll Anbieter mit ihren Diensten sowie Replikate im Netzwerk nden
(siehe Grundlagenkapitel Abschnitt 3.6.3).
Da hier ein Streamingsystem betrachtet wird, erscheint die Lokalisierung von Streams
als besonders wichtig. Dabei ist es entscheidend zu wissen, welche Streams existieren
und wer welchen Teil des Streams anbieten kann, um dem Scheduling eine Vorauswahl
an Knoten anbieten zu können.
Diese Informationen müssen hinterlegt und von der Lokalisierung regelmäÿig aktualisiert werden, da sich diese Daten sehr schnell ändern können.
Nach [Strufe (2003)] existieren prinzipiell zwei Möglichkeiten, um nach Diensten in
einem P2P-Netzwerk zu nden: durchsuchen des gesamten des Netzwerkes (z. B. durch
Fluten ) und Registrieren
der Informationen an einer Stelle im Netzwerk.
6.4.1. Fluten
Fluten ist die einfachste Möglichkeit, in einem dynamischen Netzwerk ohne zentrale
6
Stelle zu suchen. In der Version 0.4 von Gnutella
wurde diese einfache Möglichkeit des
Suchens implementiert. Jeder Knoten durchsucht seine eigenen Daten nach der Anfrage
6 http://rfc-gnutella.sourceforge.net/
46
2005-03-21/015/IN99/2253
6.4. Lokalisierung
und leitet sie auch an alle ihm bekannten Knoten, auÿer dem Senderknoten von dem
er die Anfrage erhalten hat, weiter.
Die Vorteile dieser Methode sind die Einfachheit der Implementierung und die Möglichkeit eine unscharfe Suche realisieren zu können, da die Suche lokal vorgenommen
wird. Der Nachteil ist, dass Fluten durch ein exponentiell steigendes Kommunikationsaufkommen [Ritter (2001)] nicht skaliert und somit für groÿe Netze nicht angewendet
werden kann. Ebenso dauert ein Suchvorgang im Netzwerk relativ lange.
6.4.2. Registrieren
Die Registrierung aller Ressourcen stellt eine weitere Möglichkeit dar. Allerdings ist
es nicht praktikabel für sehr groÿe und dynamische P2P-Netze, eine zentrale Stelle zu
wählen, um die Ressourcen zu registrieren [Strufe (2003)].
Eine andere Möglichkeit bietet die Verteilung der Informationen mit Hilfe von verteilten
Hash-Tabellen (DHT) wie in [Ratnasamy u. a. (2001)] beschrieben. Da sich aber die
Informationen über den Stream im vorliegenden Zeitraum sehr dynamisch ändern kann,
7
ist ein ständiges Umregistrieren
sehr aufwändig und daher nicht einsetzbar.
6.4.3. Eigene Ideen
Da beide Möglichkeiten, insbesondere das
Fluten,
Nachteile besitzen, entstanden eine
ganze Reihe von Abwandlungen und Kombinationen, die in [Strufe (2003)] nachgelesen
werden können.
Zum einen kann über einen TTL-Wert die Tiefe der Suche beim Fluten beschränkt
werden, um die Netzlast auf Kosten der Treerwahrscheinlichkeit zu verringern. Die
Breite der Suche kann auch reduziert werden, indem ein Knoten die Anfrage nicht an
alle bekannten Knoten weiterleitet, sondern nur an einen bestimmten Teil.
Eine einfache aber sehr eziente Methode für diese selektive Weiterleitung ist die Verwendung von
Random Walker
[Lv u. a. (2002)]. Der suchende Knoten sendet hierbei die
Anfrage an eine begrenzte Anzahl (maximal 64) anderer Knoten. Alle weiteren Knoten
7 Zudem
ergeben sich bei kleinen Änderungen der Information meist ganz andere Hash-Werte.
2005-03-21/015/IN99/2253
47
6. Entwurf
senden eine empfangene Anfrage nur an einen Knoten weiter. Bei nochmaligem Empfangen derselben Anfrage wird sie diesmal an einen anderen Knoten weitergeleitet. Auf
diese Art werden die Nachrichten nicht vervielfältigt, sodass die Tiefe der Suche sehr
groÿ sein kann.
Da die eigene Lokalisierung die Lokalität berücksichtigen sollte, bietet sich eine Abwandlung von
Random Walker
an. Dabei wird die Suchanfrage an einige lokale Knoten
weitergeleitet und an sehr wenige weiter entfernte Knoten. Auf diese Art sollte sich
die Suchanfrage schnell in lokalen Bereichen verbreiten, aber nicht zu sehr über weite Entfernungen. Unter Umständen ist es sinnvoll, den Anfragen einen abgewandelten
TTL-Wert mitzugeben, bei dem die Entfernung berücksichtigt wird. So kann sich die
Anfrage oft lokal, aber über weite Entfernungen nur begrenzt, verbreiten.
Eine weitere Möglichkeit ist, die Lokalität direkt zu berücksichtigen und lokale Cluster
Supernodes gewählt,
bei denen alle anderen Knoten Daten registrieren und abfragen können. Die Supernodes
zu bilden. In jedem Cluster wird dann eine begrenzte Anzahl an
müssen dann untereinander die Informationen austauschen.
48
2005-03-21/015/IN99/2253
7. Implementierung
Die Implementierung des Routings und der Lokalisierung erfolgt im kooperativen Streamingsystem
ekStream 1 ,
welches aufbauend auf dem
IlmStream -Projekt
([Kärst (2004)]
[Strufe (2004)]) entwickelt wird. Im Verlauf dieser Diplomarbeit entstand der erste
2
funktionsfähige Prototyp .
In diesem Kapitel wird nun zuerst die prinzipielle Architektur von
ekStream
erläutert
(Abschnitt 7.1) und dann folgen die eigenen Implementierungen des Routings (Abschnitt 7.2) und der Lokalisierung (Abschnitt 7.3).
7.1. Architektur von ekStream
In der Abbildung 7.1 wird die aktuelle Architektur von
ekStream
Im Rahmen dieser Diplomarbeit wurden die Komponenten
Admission Control
veranschaulicht.
Routing, Localisation
und
implementiert. Die hierfür wichtigen Teile der Architektur werden
im folgenden erläutert.
Routing kommuniziert
Nodes genannt werden.
Das
mit Hilfe des
Transport Layers
mit anderen Knoten, die
Node Roster verwaltet. Alle anderen KomRouting (Transport Layer und Network Measurement ) kennen
Das Wissen über andere Knoten wird im
ponenten auÿer dem
nur
Nodes
und müssen sich nicht um die Art und Weise der Nachrichtenübertragung
kümmern. Sie verschicken untereinander (intern und auch an andere Knoten)
Message -
Objekte.
1 http://www.ekstream.org
2
Die Mitarbeit am ekStream -Projekt umfasste im Rahmen dieser Diplomarbeit die SubversionRevisionen 236 bis 760. Somit beziehen sich sämtliche Code-Ausschnitte von ekStream auf die
Revision 760.
2005-03-21/015/IN99/2253
49
7. Implementierung
Source Nodes
Sink Nodes
syncObject
Receiver
Forwarder
Buffer
getLinks
Link Control
Scheduler
getSessionInfo
schedule
Admission
Control
select
acceptNewLink
listNodes
Localisation
updateNode
getAcceptingState
getNode
Message Center
getNode
Node Roster
addNode
updateNode
Routing
listNodes
deleteNode
sendBag
calculateRTT
Network Measurement
calculateBandwidth
Transport Layer
receiveBag
Peer Nodes
Communication using IP packets
RTT and Bandwidth Measurements
Multimedia data
Communication between
components
Abbildung 7.1.:
ekStream -Architektur
Routing verpackt dann diese Message -Objekte und schickt sie mit Hilfe des Transport Layers über das Netzwerk. Dabei ist das Transport Layer nur für den direkten
Das
Versand und Empfang von Netzwerkpaketen zuständig.
Nachrichten von anderen Knoten (oder auch von Komponenten innerhalb) werden über
das
Message Center
Die
Localisation
an die jeweilige Empfängerkomponente weitergereicht.
kann ebenfalls mittels
Messages
mit der
Localisation
anderer Kno-
ten kommunizieren und so Informationen austauschen. Die Informationen vom lokalen
Buer (und vom Admission Control ). Informationen über
andere Knoten werden im Node Roster verwaltet.
Knoten erhält sie direkt vom
50
2005-03-21/015/IN99/2253
7.2. Routing
Localisation
nete Nodes.
Die
Nachdem das
übergibt dem
Link Control
Scheduler 3 nach einer von ihm gestellten Anfrage geeig-
von einem anderen Knoten eine Anfrage nach Streaming-
daten erhalten hat, fragt es das
Admission Control, ob diese Anfrage bearbeitet werden
darf.
7.2. Routing
Alle Klassen des Routings sind in dem Paket
org.ekstream.routing
zusammenge-
fasst.
22 package org . ekstream . routing ;
Ein Klassendiagram ist in Abbildung 7.2 zu sehen. Es wurden drei unterschiedliche
Routingstrategien implementiert, auf die in den folgenden Abschnitten genauer eingegangen wird.
AbstractRouting
RoutingTable
<< use >>
StaticRouting
SimpleRouting
<< use >>
RoutingMessage
<< use >>
<< use >>
<< use >>
LocalityRouting
<< use, instantiate >>
LocalityVectorTable
BandwidthRequest
<< use, instantiate >>
<< use >>
<< use >>
LocalityVector
NetInfoTable
Abbildung 7.2.: Klassendiagram für die Routingklassen
späteren Versionen von ekStream wird diese Komponente in die Komponenten Scheduling und
Lastverteilung aufgeteilt, um einzelne Strategien noch genauer untersuchen zu können.
3 In
2005-03-21/015/IN99/2253
51
7. Implementierung
7.2.1. Schnittstellen
Damit einheitliche Schnittstellen für verschiedene Routingimplementierungen existieren, wurde die abstrakte Klasse AbstractRouting erstellt. Jede weitere Routingimplementierung wird nun von dieser abstrakten Klasse abgeleitet und deniert so die
vorgegebenen Schnittstellen.
47 p u b l i c
48
a b s t r a c t c l a s s AbstractRouting e x t e n d s Looper
implements PacketHandler {
Dort sind zunächst auch einige für andere Klassen wichtige Variablendenitionen, wie
der Wert für die entsprechenden Lokalitäten, enthalten.
50
p u b l i c s t a t i c f i n a l NodeId BROADCAST_NODEID = new IntegerNodeId ( -1) ;
51
52
p u b l i c s t a t i c f i n a l String ROUTING_LOOPER_NAME = " Routing ";
53
54
55
61
62
63
64
p u b l i c s t a t i c f i n a l i n t DEFAULT_TTL = TransportBag . DEFAULT_TIME_TO_LIVE ;
p u b l i c s t a t i c f i n a l i n t MAX_TTL = DEFAULT_TTL * 2;
public
public
public
public
static
static
static
static
final
final
final
final
String NODEPROPERTY_LOCALITY = " LOCALITY_INT ";
i n t LOCALITY_LOCAL = 1;
i n t LOCALITY_EXTENDED = 2;
i n t LOCALITY_GLOBAL = 3;
Eine der wichtigsten Methoden ist
send
zum Versenden von Nachrichten an andere
Knoten.
120
p u b l i c v o i d send ( Serializable data , NodeId nodeId ) {
send ( data , nodeId , DEFAULT_TTL ) ;
}
130
p u b l i c a b s t r a c t v o i d send ( Serializable data , NodeId nodeId , i n t timeToLive );
118
119
Zum entgegennehmen der Pakete, die vom
Methode
157
packetReceived
Transport Layer
empfangen wurden, ist die
zuständig.
p u b l i c a b s t r a c t v o i d packetReceived ( TransportBag bag );
Weiterhin sind die Methoden
bootstrap und update für das initiale Kennenlernen von
Knoten und für bestimmte periodische Vorgänge zur Aktualisierung verantwortlich.
174
p u b l i c a b s t r a c t v o i d bootstrap ( Vector addressVec );
180
p u b l i c a b s t r a c t v o i d update () ;
52
2005-03-21/015/IN99/2253
7.2. Routing
7.2.2. Statisches Routing
Das statische Routing ist in der Klasse StaticRouting implementiert.
55 p u b l i c
c l a s s StaticRouting e x t e n d s AbstractRouting {
Diese Klasse erhält initial durch die
bootstrap-Methode
eine Liste (implementiert als
Vektor) von Netzwerkadressen. Für alle Elemente dieser Liste wird eine
net. Mit Hilfe der
addNode-Methode wird die NodeId mit der dazugehörigen Netzwerk-
adresse in die Routingtabelle eingetragen. Ebenso wird ein
in den
258
259
260
261
262
263
264
265
266
267
NodeId berech-
Node Roster
Node-Objekt
erzeugt und
eingefügt.
p u b l i c v o i d bootstrap ( Vector addressVec ){
Enumeration addressEnum = addressVec . elements () ;
w h i l e ( addressEnum . hasMoreElements () ){
Object obj = addressEnum . nextElement () ;
i f (( obj != n u l l ) &&( obj i n s t a n c e o f SocketAddress )){
SocketAddress address = ( SocketAddress ) obj ;
addNode ( new IntegerNodeId ( address ) , address );
}
}
}
Da dies ein statisches Routing ist, wird kein (aktiver) Versuch unternommen, neue
Knoten kennen zu lernen und es müssen auch keine Informationen aktualisiert werden.
Aus diesem Grund ist die
273
274
275
update-Methode
leer.
p u b l i c v o i d update () {
// update of nodes not implemented in StaticRouting ( it 's static !)
}
Das Routing kann nur an bekannte Knoten Nachrichten verschicken. Da allerdings
Nachrichten anderer Knoten beantwortet werden sollen, müssen bei eingehenden Nachrichten unbekannter Knoten diese ebenfalls in die Routingtabelle und im
Node Roster
eingetragen werden.
207
220
p u b l i c v o i d packetReceived ( TransportBag bag ) {
i f (! routingTable . containsKey ( source )) {
221
SocketAddress address = bag . getAddress () ;
222
addNode ( source , address );
227
228
}
Dieses Routing ist sehr einfach und gut für Tests geeignet, da mit der
bootstrap-
Methode festgelegt werden kann, welcher Knoten welche Knoten kennt.
2005-03-21/015/IN99/2253
53
7. Implementierung
7.2.3. Einfaches dynamisches Routing
Das einfache dynamische Routing ist in der Klasse SimpleRouting implementiert.
47 p u b l i c
c l a s s SimpleRouting e x t e n d s AbstractRouting {
7.2.3.1. Nachrichten des Routings
Für den Nachrichtenaustausch des Routings mit dem Routing anderer Knoten existiert
die Klasse RoutingMessage mit verschiedenen Typen und einem Datenfeld.
34 p u b l i c
c l a s s RoutingMessage e x t e n d s Message {
35
36
p r i v a t e s t a t i c f i n a l l o n g serialVersionUID = 3618138970022950705 L;
37
38
39
40
41
42
43
44
45
73
/* *
* Collection of the types of the RoutingMessage .
*/
p u b l i c s t a t i c f i n a l i n t TYPE_PINGREQEST = 1;
from another node
// public static final int TYPE_PINGREPLY = 2;
p u b l i c s t a t i c f i n a l i n t TYPE_FINDNODE = 3;
address for a nodeId
p u b l i c s t a t i c f i n a l i n t TYPE_GETNODES = 4;
some nodeId , address maps
p u b l i c s t a t i c f i n a l i n t TYPE_RCVNODES = 5;
address map
// request a ( nulldata ) message
// request to another node for a
// request to another node for
// return another node a nodeId ,
p r i v a t e Serializable data ;
Bei dem Empfang einer Nachricht für das Routing des lokalen Knotens mit Hilfe der
packetReceived-Methode
wird die Nachricht der Methode
processRoutingMessage
übergeben. Dort erfolgt eine selektive Bearbeitung des jeweiligen Nachrichtentyps.
352
353
p r o t e c t e d v o i d processRoutingMessage ( RoutingMessage routMsg , NodeId source ,
TransportBag bag , i n t timetolive , Date rcvTime ) {
354
// PingRequest
i f ( routMsg . isPingReqest () ) {
Log . debug ( t h i s , " Received a PingRequest from Node " + source );
i f ( source . equals ( BROADCAST_NODEID )) {
Message msg = new RoutingMessage ( RoutingMessage . TYPE_PINGREQEST ,
nodeRoster . localNodeId () );
send ( msg , source ) ;
} else {
send ( n u l l , source );
}
return ;
355
356
357
358
359
360
361
362
363
364
365
54
2005-03-21/015/IN99/2253
7.2. Routing
}
366
367
// New NodeAddresses are known => have to be verified
i f ( routMsg . isRcvNodes () ){
368
369
// Request to find the NodeAddress for this Id
i f ( routMsg . isFindNode () ){
392
393
// Request for some NodeAddress
i f ( routMsg . isGetNodes () ){
445
446
469
}
7.2.3.2. Der Bootstrap-Vorgang
Anders als beim statischen Routing werden die initial erhaltenen Netzwerkadressen
nicht sofort als bekannt vorausgesetzt und eingetragen, sondern erst überprüft. Dies
erfolgt durch das Senden einer Nachricht (RoutingMessage), vom Typ
PINGREQUEST
an diese Adresse. Der andere Knoten antwortet auf diese Nachricht, falls die Adresse
richtig war und wird dann als bekannter Knoten eingetragen. Danach wird die
update-
Methode aufgerufen, damit die bekannten Knoten gleich nach weiteren Knoten gefragt
werden.
532
p u b l i c v o i d bootstrap ( Vector addressVec ) {
533
534
535
536
537
538
539
Log . debug ( t h i s ," Start bootstrap ." );
Enumeration addressEnum = addressVec . elements () ;
w h i l e ( addressEnum . hasMoreElements () ){
Object obj = addressEnum . nextElement () ;
i f (( obj != n u l l ) &&( obj i n s t a n c e o f SocketAddress )){
SocketAddress address = ( SocketAddress ) obj ;
Message message = new RoutingMessage ( RoutingMessage . TYPE_PINGREQEST ,
nodeRoster . localNodeId () );
send ( message , BROADCAST_NODEID , address ); // send with BroadcastId , because
right Id isn 't known
} else {
Log . warn ( t h i s ," Bootstrap unexpected value in vector ( has to be a SocketAddress
)." );
}
542
543
544
545
546
547
}
548
549
550
551
552
// start Update to learn new nodes
f o r ( i n t i =0; i < 3; i ++) {
update () ;
}
2005-03-21/015/IN99/2253
55
7. Implementierung
553
554
}
7.2.3.3. Die Routingtabelle
Die Routingtabelle wurde als Klasse (RoutingTable) implementiert. Damit eziente
Anfragen sowohl nach der
NodeId als auch nach der Netzwerkadresse (SocketAddress)
möglich sind, werden zwei Hashtabellen verwendet. Eine Hashtabelle zur Auösung
von
NodeId
zu
SocketAddress
und eine umgekehrt. Damit sind Anfragen in beide
Richtungen schnell, allerdings entsteht dabei mehr Aufwand beim Aktualisieren von
Einträgen. Ebenso kennt die Routingtabelle den Zeitpunkt der letzten Aktualisierung,
um alte Einträge wieder löschen zu können.
81
82
83
84
85
86
87
88
89
90
p u b l i c s y n c h r o n i z e d v o i d addNodeAddress ( NodeId nodeId , SocketAddress address ) {
// overwrite if exists
i f ( lookupTable . containsKey ( nodeId )) {
Object obj = lookupTable . get ( nodeId ) ;
revLookupTable . remove ( obj );
}
lookupTable . put ( nodeId , address );
revLookupTable . put ( address , nodeId );
updateTimes . put ( nodeId , new Long ( System . currentTimeMillis () ));
}
Da nicht immer die Netzwerkadresse bekannt ist, werden auch Referenzeinträge auf
andere Knoten erlaubt, um eine Nachricht an einen Knoten schicken zu können. Auf
diese Weise kann eingetragen werden, dass Nachrichten für einen Knoten an einen
bestimmten anderen Knoten gesendet werden können.
7.2.3.4. Weiterleiten von Paketen
Da Pakete nicht immer direkt an den Empfänger verschickt werden können, existiert
die Möglichkeit der Weiterleitung.
So kann ein Paket an einen Knoten (Netzwerkadresse) mit einem anderen Empfänger
(NodeId) gesendet werden. Dann versucht dieser Knoten das Paket an diese
NodeId
weiterzuleiten. Der ursprüngliche Sender (NodeId) soll dabei erhalten bleiben, sodass
bei der Weiterleitung das ursprüngliche Paket als Daten in ein neues Paket eingepackt
und dann weitergeleitet wird.
56
2005-03-21/015/IN99/2253
7.2. Routing
217
308
309
310
311
p u b l i c v o i d packetReceived ( TransportBag bag ) {
// is this bag for me ? ( non forwarding of BroadcastNodeIds by Routing !)
i f (( nodeRoster . isLocal ( destination )) ||
BROADCAST_NODEID . equals ( destination )){
// Packet is for me => accept
312
336
337
338
339
340
341
} else {
// Packet is not for me => forward
i f ( timetolive > 1) {
send ( bag , destination , timetolive - 1) ;
}
}
Dies kann unter Umständen zu Kreisen im Netzwerk führen, sodass jedes Paket einen
TTL-Wert erhält um unendliches Weiterleiten zu verhindern. Dieser TTL-Wert wird
bei jeder Weiterleitung um Eins verringert. Das Paket wird nicht mehr weitergeleitet,
wenn der TTL-Wert Null erreicht hat.
7.2.3.5. Lernen neuer Knoten
Durch die starke Verbreitung von Firewalls mit NAT kann eine erhaltene Netzwerkadresse nicht als gültig angenommen werden, sondern muss überprüft werden.
Eine Netzwerkadresse wird immer dann in die Routingtabelle eingetragen, wenn ein
Paket mit unbekannten Sender empfangen wurde. Auf diese Art wurden auch die Netzwerkadressen im
217
238
239
240
241
242
243
244
245
246
247
Bootstrap -Vorgang (Abschnitt 7.2.3.2) überprüft.
p u b l i c v o i d packetReceived ( TransportBag bag ) {
// learn NodeAddress
s y n c h r o n i z e d ( routingTable ) {
i f (! routingTable . isAddress ( source )) {
// source not known
Log . debug ( t h i s ," Add NodeId " + source + " with address "
+ bag . getAddress () + " to RoutingTable .");
routingTable . addNodeAddress ( source , bag . getAddress () );
i f (! nodeRoster . containsNode ( source ) ) {
addNode ( source );
}
248
249
250
251
252
} else {
// source known
i f ( bag . getAddress () . equals ( routingTable . getNodeAddress ( source ) )) {
// address is the same :)
2005-03-21/015/IN99/2253
57
7. Implementierung
routingTable . updateTimeStamp ( source );
i f (( nodeRoster . containsNode ( source ) )
&&( nodeRoster . get ( source ). getProperties () . isRegistered (
NODEPROPERTY_FAILURE ))) {
nodeRoster . get ( source ). getProperties () . unregister ( NODEPROPERTY_FAILURE );
}
} else {
// address differ , ignore packet
Log . warn ( t h i s , " Ignore Packet from Node "
+ source + " with different SocketAddress as known ! ");
return ;
}
253
254
255
256
257
258
259
260
261
262
263
}
264
}
265
Bei einem weitergeleiteten Paket kann zusätzlich noch eine Referenz vom ursprünglichen Sender zum letzten Sender, eingetragen werden. Auf diese Art kann auch der
ursprüngliche Sender erreicht werden, da der letzte Sender ebenfalls mindestens einen
Referenzeintrag für diesen Knoten besitzt (Dies lässt sich bis zum Sender weiterführen).
// is this a bag in bag ? ( forwarded message )
i f ( data i n s t a n c e o f TransportBag ) {
bag = ( TransportBag ) data ;
274
275
276
// learn NodeAddress
s y n c h r o n i z e d ( routingTable ) {
i f (! routingTable . isKnown ( source )) {
routingTable . addNodeAddress ( source , bag . getSourceNode () );
} else {
i f ( System . currentTimeMillis () > routingTable . getTimeStamp ( source )
+ ROUTINGTABLE_ENTRY_TIMEOUT ) {
// address is to old => take new address
routingTable . delNodeAddress ( source );
routingTable . addNodeAddress ( source , bag . getSourceNode () ) ;
}
}
}
285
286
287
288
289
290
291
292
293
294
295
296
297
In Abbildung 7.3 ist zu sehen, welche Schritte notwendig sind, um die Adresse eines
Knotens zu erlernen. Dabei möchte Knoten A die Adresse von Knoten C kennen lernen.
Beide Knoten (A und B) kennen C und umgekehrt.
1. Knoten A fragt Knoten B, ob dieser die Adresse von Knoten C kennt (Routing-
Message
vom Typ
FINDNODE).
2. Knoten B kennt die Adresse von C und schickt sie Knoten A. Zusätzlich sendet er
die Adresse von Knoten A an Knoten C (RoutingMessage vom Typ
58
RCVNODES).
2005-03-21/015/IN99/2253
7.2. Routing
1. getAddr(C)
A
2. sendAddr(C)
B
2. sendAddr(A)
C
3. PingRequest
3. PingRequest
4. PingReply
4. PingReply
Abbildung 7.3.: Kennenlernen von Knoten C
3. Beide Knoten (A und C) versuchen sich gegenseitig eine Nachricht (Ping-Request)
zu schicken, die der jeweils andere beantworten muss (RoutingMessage vom Typ
PINGREQUEST).
4. Jeder Knoten, der einen Ping-Request erhält, antwortet auf diesen mit einem
Ping-Reply (Antwort mit einem leeren Paket, da nur die Adresse wichtig ist.).
Knoten A kann die Adresse von Knoten C erst eintragen, wenn er direkt von ihm eine
Nachricht erhalten hat. Dies erfolgt spätestens im 4. Schritt.
Es kann zwischen Knoten A und B sowie zwischen Knoten B und C eine Firewall mit
NAT existieren, wodurch sich vier Kombinationsmöglichkeiten ergeben:
1. kein NAT:
Alle Pakete kommen an und Knoten A kennt nach dem 3. Schritt die Adresse
von Knoten C.
2. NAT zwischen A und B:
Knoten A kann C nicht unter der von B angegebenen Adresse erreichen, aber
Knoten C kann A erreichen. Somit kennt Knoten A die Adresse von C auch nach
dem 3. Schritt und antwortet auf den Ping-Request, damit auch C die Adresse
von A kennt.
3. NAT zwischen B und C:
Knoten C kann A nicht unter der von B angegebenen Adresse erreichen, aber
2005-03-21/015/IN99/2253
59
7. Implementierung
Knoten A kann C erreichen. Somit kann Knoten C auf den Ping-Request von A
antworten. Knoten A kennt die Adresse von Knoten C nach dem 4. Schritt.
4. NAT zwischen A und B sowie zwischen B und C:
Da hier Knoten B die Adressen von A und C kennt, die auch Knoten A und C
zum Erreichen des jeweils anderen Knotens ansprechen müssen, ist das Verhalten
wie ohne NAT (siehe 1. Kombinationsmöglichkeit).
7.2.3.6. Senden von Nachrichten
Das Senden einer Nachricht wird in mehrere Methoden aufgeteilt, damit Grundfunktionen in abgeleiteten Klassen erhalten bleiben können.
118
p u b l i c v o i d send ( Serializable data , NodeId nodeId , i n t timetolive ) {
158
p r o t e c t e d v o i d sendBroadCast ( Serializable data , Vector ignoreNodeIds , i n t timetolive
) {
180
p r o t e c t e d v o i d send ( Serializable data , NodeId nodeId , SocketAddress address ){
194
p r o t e c t e d s y n c h r o n i z e d v o i d send ( Serializable data , NodeId nodeId ,
Falls die Nachricht nicht an mehrere Knoten geschickt werden soll (Broadcast) und der
Empfänger in der Routingtabelle bekannt ist, wird die Nachricht dorthin versendet.
Ansonsten wird die Nachricht als Broadcast an mehrere verschickt und ebenso eine
Suchanfrage nach diesem Knoten, um spätere Pakete direkt versenden zu können.
118
p u b l i c v o i d send ( Serializable data , NodeId nodeId , i n t timetolive ) {
i f (! nodeId . equals ( BROADCAST_NODEID )) {
// send to this node
Object obj = routingTable . getNodeAddress ( nodeId );
i f ( obj != n u l l ) {
// node is known
i f ( obj i n s t a n c e o f NodeId ) {
obj = routingTable . getNodeAddress (( NodeId ) obj );
}
send ( data , nodeId , ( SocketAddress ) obj , timetolive );
r e t u r n ; // finish
} else {
// node isn 't known => send FindNodeRequest
126
127
128
129
130
131
132
133
134
135
136
137
138
RoutingMessage message = new RoutingMessage ( RoutingMessage . TYPE_FINDNODE ,
nodeRoster . localNodeId () , new NodeAddress ( nodeId , n u l l ));
send ( message , BROADCAST_NODEID );
139
140
141
60
2005-03-21/015/IN99/2253
7.2. Routing
}
142
}
143
144
// now send to BROADCAST_NODEID or unknown NodeId !
145
146
sendBroadCast ( data , n u l l , timetolive ) ;
147
148
}
Das Senden der Nachricht erfolgt mit Hilfe des
194
195
196
197
198
199
Transport Layer.
p r o t e c t e d s y n c h r o n i z e d v o i d send ( Serializable data , NodeId nodeId ,
SocketAddress address , i n t timetolive ) {
Log . debug ( t h i s ," Send TransportBag to Node " + nodeId
+ " with address " + address + " and TTL " + timetolive ) ;
transportLayer . send ( bagFactory . createBag ( data , nodeId , address , timetolive ));
}
Bei einem Broadcast soll eine Nachricht an viele Knoten gesendet werden. Hier wird die
Nachricht an durchschnittlich zehn zufällig ausgewählte Knoten versendet, indem bei
jedem Eintrag in der Routingtabelle (ohne Referenzen) eine Zufallszahl erzeugt wird.
Ist die Zufallszahl kleiner als eine von der Anzahl der Einträge in der Routingtabelle
abhängige Schwelle, kann die Nachricht an diese Adresse gesendet werden. Zusätzlich
ist es möglich noch eine Liste (Vektor) an Knoten übergeben werden, an die diese
Nachricht nicht geschickt werden soll.
158
159
160
161
162
163
164
165
166
167
168
p r o t e c t e d v o i d sendBroadCast ( Serializable data , Vector ignoreNodeIds , i n t timetolive
) {
// send to some random Nodes
Enumeration enumNodes = routingTable . listKnownNodes () ;
double threshold = ( double ) 10 / routingTable . getsize () ;
w h i l e ( enumNodes . hasMoreElements () ) {
NodeId aktNodeId = ( NodeId ) enumNodes . nextElement () ;
i f ( ignoreNodeIds . contains ( aktNodeId ) ) c o n t i n u e ;
i f ( Math . random () <= threshold ) {
send ( data , BROADCAST_NODEID , ( SocketAddress ) routingTable . getNodeAddress (
aktNodeId ) , timetolive );
}
}
169
170
}
7.2.3.7. Aktualisieren der Knotenliste
Da das Routing die Übersetzung von
nur
Node-Objekte
oder
NodeIds
2005-03-21/015/IN99/2253
NodeId zur Netzwerkadresse vornimmt und intern
bekannt sind, muss das Routing die
Node-Objekte
im
61
7. Implementierung
Node Roster
eintragen und löschen.
Zum Erzeugen und Löschen eines
477
Node-Objektes
existiert die
addNode-Methode.
p r o t e c t e d v o i d addNode ( NodeId nodeId ) {
Falls von einem Knoten für eine bestimmte Zeit (ROUTINGTABLE_ENTRY_TIMEOUT) kein
Paket empfangen wurde, wird er mit Hilfe der
tabelle und aus dem
504
Node Roster
removeNode-Methode
aus der Routing-
ausgetragen.
p r o t e c t e d v o i d removeNode ( NodeId nodeId ) {
In bestimmten Abständen (UPDATE_SLEEP_TIME) wird die
update-Methode
aufgeru-
fen. Falls nicht genug Einträge in der Routingtabelle vorhanden sind, fragt sie die ihr
bekannte Knoten nach weiteren Knoten. Ebenso werden
PINGREQUEST
RoutingMessages
vom Typ
an die Knoten gesendet, von denen lange Zeit kein Paket empfangen
wurde.
560
p u b l i c v o i d update () {
i f ( routingTable . getsize () < ROUTINGTABLE_SIZE_WANT ) {
// want to learn new nodes
570
571
572
w h i l e ( routEnum . hasMoreElements () ) {
NodeId remNodeId = ( NodeId ) routEnum . nextElement () ;
i f ( routingTable . isAddress ( remNodeId ) ) {
send ( new RoutingMessage ( RoutingMessage . TYPE_GETNODES , localNodeId ) ,
remNodeId );
} // else ignore
}
573
574
575
576
577
578
i f (( routingTable . isAddress ( remNodeId )) &&( aktTime
> routingTable . getTimeStamp ( remNodeId ) + ROUTINGTABLE_ENTRY_TIMEOUT /2 ))
{
// send pingrequest if nodeAddress known and relativly old
send ( new RoutingMessage ( RoutingMessage . TYPE_PINGREQEST , localNodeId ) ,
remNodeId );
}
585
586
587
588
589
7.2.4. Lokalitätsbewusstes dynamisches Routing
Das lokalitätsbewusste dynamische Routing ist in der Klasse LocalityRouting implementiert. Sie erbt alle Methoden des einfachen dynamischen Routings (Simple-
Routing), die so einfach wieder verwendet und erweitert werden können.
55 p u b l i c
62
c l a s s LocalityRouting e x t e n d s SimpleRouting {
2005-03-21/015/IN99/2253
7.2. Routing
7.2.4.1. Erweiterungen
Zusätzlich zum SimpleRouting kann das LocalityRouting die RTT- und die Bandbreitenbestimmung initiieren (siehe Abschnitte 7.2.4.2 und 7.2.4.3). Hierzu ist es notwendig, die Netzwerkadressen der jeweiligen Serverkomponente der anderen Knoten zu
kennen.
72
73
p r i v a t e NetInfoTable roundTripTimeTable ;
to the EchoService
p r i v a t e NetInfoTable bandwidthTable ;
Diese Adressen werden in
// RTTs with timestamp and address
// address to the BandwidthService
NetInfoTable-Objekten verwaltet, die eine Hashtabelle bein-
halten.
34 p u b l i c
46
47
48
49
50
51
52
53
c l a s s NetInfoTable {
/* *
* Contains a Vector to each given key ( NodeId )
* The Vector contains :
*
- an int - value
*
- a
timestamp for the int - value ( long )
*
- an
address ( SocketAddress ) => this mustn 't be null
*/
p r i v a t e Hashtable infos ; // contains a vector
Die Berechnung der Lokalität (Abschnitt 7.2.4.4) erfordert das Verwalten der Lokalitätsvektoren der anderen Knoten. Hierfür wird die Klasse LocalityVectorTable verwendet.
33 p u b l i c
c l a s s LocalityVectorTable {
34
35
36
37
p r i v a t e Hashtable dataTable ;
p r i v a t e Hashtable timestamps ;
// Contains a LocalityVector
// Contains a Long
Diese Klassen werden anstelle einer einfachen Hashtabelle verwendet, um für jeden
Eintrag einen separaten Zeitstempel verwalten zu können.
Damit diese Informationen unter den anderen Knoten ausgetauscht werden können,
werden die Nachrichtentypen der
RoutingMessage
erweitert. Es wird je ein Typ zum
Anfordern der Information und ein Typ zum Senden der Informationen benötigt.
34 p u b l i c
46
c l a s s RoutingMessage e x t e n d s Message {
p u b l i c s t a t i c f i n a l i n t TYPE_GETECHOADDRESS = 6;
SocketAddress of his DatagramEchoService
2005-03-21/015/IN99/2253
// request to another node for the
63
7. Implementierung
47
48
49
50
51
p u b l i c s t a t i c f i n a l i n t TYPE_RCVECHOADDRESS = 7; //
SocketAddress of the DatagramEchoService
p u b l i c s t a t i c f i n a l i n t TYPE_GETLOCALITY = 8;
//
localityVector
p u b l i c s t a t i c f i n a l i n t TYPE_RCVLOCALITY = 9;
//
localityVector
p u b l i c s t a t i c f i n a l i n t TYPE_GETBWADDRESS = 10;
//
SocketAddress of his DatagramBandwidthService
p u b l i c s t a t i c f i n a l i n t TYPE_RCVBWADDRESS = 11;
//
SocketAddress of the DatagramBandwidthService
Da sich die Funktion der bereits implementierten
return another node the
request to another node for the
return another node the
request to another node for the
return another node the
RoutingMessage-Typen
in Simple-
Routing nicht geändert haben, kann die Implementierung der Superklasse einfach nach
der Abarbeitung der neuen Typen aufgerufen werden.
314
p r o t e c t e d v o i d processRoutingMessage ( RoutingMessage routMsg , NodeId source ,
// Request of Addresses for RTTMeasurementService
i f ( routMsg . isGetEchoAddress () ){
317
318
// New Addresses of RTTMeasurementServices
i f ( routMsg . isRcvEchoAddress () ){
346
347
// Request of LocalityVectors
i f ( routMsg . isGetLocality () ){
369
370
// New LocalityVector is known
i f ( routMsg . isRcvLocality () ){
399
400
// Request of Addresses for BandwidthMeasurement
i f ( routMsg . isGetBWAddress () ){
433
434
// New Addresses of BandwidthMeasurement
i f ( routMsg . isRcvBWAddress () ){
461
462
// standard AddressTypes also relevant !
s u p e r . processRoutingMessage ( routMsg , source , bag , timetolive , rcvTime );
484
485
Ebenso müssen in der
update-Methode
die Aktualisierungen in der Superklasse (für
die Verwaltung der Routingtabelle) abgearbeitet werden.
174
175
176
p u b l i c v o i d update () {
l o n g akttime = System . currentTimeMillis () ;
s u p e r . update () ; // update routingTable in superclass
Die Berücksichtigung der Lokalität in der Implementierung der
sendBroadCast-Methode
konnte noch nicht vollendet werden. Dies sollte in späteren Revisionen von
ekStream
erfolgen.
64
2005-03-21/015/IN99/2253
7.2. Routing
156
159
p r o t e c t e d v o i d sendBroadCast ( Serializable data , Vector ignoreNodeIds , i n t timetolive
) {
// ! TODO send to some nodes ( some local , and 1 exended and 1 global )
160
161
s u p e r . sendBroadCast ( data , ignoreNodeIds , timetolive );
7.2.4.2. Bestimmung der RTT
Die RTT wird mit Hilfe der Komponente
tieren in dem Paket
org.ekstream.net
Network Measurement
gemessen. Dazu exis-
die Klassen EchoManager und Datagram-
EchoService.
Der DatagramEchoService nimmt auf einen UDP-Socket Pakete entgegen und sendet sie unverzüglich an den Sender zurück.
Aufträge in Form einer
EchoSession
werden vom EchoManger entgegengenommen
und gleichzeitig bearbeitet. Dazu versendet er Messpakete an die in der
EchoSession
angegebenen Netzwerkadressen und misst die Zeitspanne bis zum Empfangen der Antwort.
Da das Routing die Übersetzung zwischen Netzwerkadresse und
NodeId
übernimmt,
muss es die Aufträge an den EchoManager übergeben. Da allerdings der Data-
gramEchoService eine separate Netzwerkadresse verwendet, verwaltet das Routing
diese extra.
Wenn eine
EchoSession
beendet wurde erhält das Routing eine Nachricht von Typ
EchoResult. Das Routing verarbeitet diese Nachricht und berechnet daraus einen neuen eigenen Lokalitätsvektor (siehe Abschnitt 7.2.4.4).
493
p u b l i c v o i d messageReceived ( Message message ) {
494
495
496
i f ( message i n s t a n c e o f EchoResult ) {
// this Message is a EchoResult
7.2.4.3. Bestimmung der Bandbreite
Die Bestimmung der Bandbreite übernimmt ebenfalls die Komponente
urement
im Paket
Network Meas-
org.ekstream.net. Dazu existieren die Klassen BandwidthMan-
ager und DatagramBandwidthManager.
2005-03-21/015/IN99/2253
65
7. Implementierung
Da das Routing die Bandbreite nicht verwendet, allerdings die Übersetzung zwischen
Netzwerkadresse und
NodeId übernehmen muss, ist hierbei die Bearbeitung etwas kom-
plizierter.
Das Routing nimmt
gegen, erzeugt eine
493
BandwidthRequest-Nachrichten
BandwidthSession
von anderen Komponenten ent-
und übergibt sie dem BandwidthManager.
p u b l i c v o i d messageReceived ( Message message ) {
// another component request BW - Measurement for a node
i f ( message i n s t a n c e o f BandwidthRequest ){
BandwidthRequest bwreq = ( BandwidthRequest ) message ;
559
560
561
BandwidthSession bwsession = new BandwidthSession (
bandwidthTable . getAddress (
bwreq . getRemNodeId () ) , bwreq . getResultTarget () ,
bwreq . getRemNodeId () ) ;
bwManager . addBandwidthSessionToQueue ( bwsession ) ;
567
568
569
570
571
Dieser bestimmt die Bandbreite und sendet eine
BandwidthResult-Nachricht
direkt
Lokalisierung
(siehe
an die anfordernde Komponente zurück. Dies ist zurzeit nur die
Abschnitt 7.3.2.2).
7.2.4.4. Lokalitätsbestimmung
Nun soll auf die Implementierung der in Abschnitt 6.2.2 vorgestellten Ansatzes zur
Lokalitätsbestimmung eingegangen werden.
Es wurde die Klasse LocalityVector für den Lokalitätsvektor erstellt, die den Vektor
und die Berechnungen beinhaltet.
34 p u b l i c
39
40
41
42
43
c l a s s LocalityVector implements Serializable {
/* *
* Size of the vector ( includes NodeId ).
* The dimension of the values are ( size -1) .
*/
p u b l i c s t a t i c f i n a l i n t VECTORSIZE = 6;
44
45
46
47
48
49
50
51
/* *
* The vector .
* On position 0 the NodeId is saved .
* The other values are Long .
*/
p r i v a t e Vector vector ;
66
2005-03-21/015/IN99/2253
7.2. Routing
Die Dimension
D
des Lokalitätsvektors entspricht der
Eins, da an der 1. Stelle noch die
NodeId
VECTORSIZE-Konstante
minus
gespeichert ist.
Beim Erzeugen eines Objektes dieser Klasse wird der Lokalitätsvektor zufällig gewählt.
t h i s . vector = new Vector ( VECTORSIZE );
t h i s . vector . add (0 , nodeId );
f o r ( i n t i =1; i < VECTORSIZE ; i ++) {
t h i s . vector . add (i , new Double ( Math . random () * 512 - 256 )) ;
}
64
65
66
67
68
Die Berechnung des Abstandes zu einem anderen Vektor wird in der
distance-Methode
vorgenommen.
p u b l i c s y n c h r o n i z e d double distance ( LocalityVector locVec ){
i f (! isCompatible ( locVec ) ) r e t u r n -1;
double dist = 0;
79
80
81
82
f o r ( i n t i = 1; i < VECTORSIZE ; i ++) {
double a = (( Double ) vector . get (i )). doubleValue () ;
double b = (( Double ) locVec . vector . get (i)). doubleValue () ;
a -= b ;
dist += a * a;
}
r e t u r n Math . sqrt ( dist );
83
84
85
86
87
88
89
}
90
calculate→
−
Lokalitätsvektor y , die
Wenn eine RTT zu einem anderen Knoten bestimmt wurde, wird die
Methode aufgerufen. Sie erhält als Parameter den anderen
gemessene
RT Tmeas
und die aktuelle Lernrate
δ.
Der Rückgabewert der Methode ist
der Abstand der Lokalitätsvektoren vor der Berechnung (RT Tcal ), um daraus den Fehler
ε
103
104
105
106
107
108
bestimmen zu können.
p u b l i c s y n c h r o n i z e d double calculate ( LocalityVector locVec ,
double roundTripTime , double learnrate ){
i f ( equalId ( locVec )) r e t u r n 0;
i f (! isCompatible ( locVec ) ) r e t u r n -1;
double distance = t h i s . distance ( locVec );
double failure = distance - roundTripTime ;
109
110
111
112
f o r ( i n t i = 1; i < VECTORSIZE ; i ++) {
double a = (( Double ) vector . get (i)) . doubleValue () ;
double b = (( Double ) locVec . vector . get (i )). doubleValue () ;
113
114
115
116
117
118
i f ( failure != 0) {
i f ( distance == 0) {
a += Math . random () * failure * learnrate ;
} else {
a += (b -a) * ( failure / distance ) * learnrate ;
2005-03-21/015/IN99/2253
67
7. Implementierung
}
vector . set (i , new Double (a ));
119
120
}
121
}
122
r e t u r n distance ;
126
127
}
Die Anpassung der Lernrate
Dazu wird der Fehler
ε
und ein relativer Fehler
δ
wird in der LocalityRouting-Klasse vorgenommen.
auf die Summe der berechneten und gemessenen RTT bezogen
α
berechnet (siehe Formel 7.1).
|ε|
RT Tmeas + RT Tcal
|RT Tmeas − RT Tcal |
=
RT Tmeas + RT Tcal
α=
Bei einem
α
von
0.5
oder berechnet). Bei
Wert
493
α
ist der Fehler
α = 0.3
ist
ε
ε
(7.1)
doppelt so groÿ wie die kleinere RTT (gemessen
6
etwas kleiner als die kleinere RTT ( ). Mit diesem
7
wird nun die Lernrate erhöht oder verringert.
p u b l i c v o i d messageReceived ( Message message ) {
// update local localityvector
LocalityVector localVector = localityTable . getVector (
nodeRoster . localNodeId () );
double distance = localVector . calculate (
localityTable . getVector ( echoRes . getNodeId () ) ,
echoRes . getRTT () , LOCALITY_learn_rate );
Log . debug ( t h i s , " LocalLocalityVector recalculated : " + localVector
+ " failure was : " + ( distance - echoRes . getRTT () )
+ " by distance : " + distance );
509
510
511
512
513
514
515
516
517
518
// update thresholds and learnrate
519
520
double a = distance - echoRes . getRTT () ;
i f ( a < 0) a = -a;
521
522
523
i f ( a != 0 ) {
// now distance + RTT can 't be 0 !
a = a / ( distance + echoRes . getRTT () );
}
i f ( a > 0.6 ) LOCALITY_learn_rate += 0.01;
i f ( a < 0.5 ) LOCALITY_learn_rate -= 0.01;
i f ( a < 0.3 ) LOCALITY_learn_rate -= 0.01;
524
525
526
527
528
529
530
531
68
2005-03-21/015/IN99/2253
7.2. Routing
532
i f ( LOCALITY_learn_rate < 0.05) LOCALITY_learn_rate = 0.05;
i f ( LOCALITY_learn_rate > 0.3) LOCALITY_learn_rate = 0.3;
533
534
Das Aktualisierungsintervall
in der
τ (LOCALITY_UPDATE_TIME) zwischen RTT-Messungen wird
update-Methode bei jedem Durchlauf bis zu einem Maximalwert erhöht. Ebenso
erfolgt in dieser Methode eine Anforderung einer RTT-Messung, falls
τ
für den jewei-
ligen Lokalitätsvektor abgelaufen ist.
174
p u b l i c v o i d update () {
i f ( akttime - localityTable . getTimestamp ( remNodeId ) > LOCALITY_UPDATE_TIME ) {
// time to learn new => request RTT - Measurement
i f ( roundTripTimeTable . containsAddress ( remNodeId )){
// request RTT - Measurement
EchoSession echoRequest = new EchoSession ( remNodeId ,
roundTripTimeTable . getAddress ( remNodeId ) ,
getMessenger () , NumberOfPings );
Log . debug ( t h i s , " Start EchoSession to node " + remNodeId );
echoManager . startSession ( echoRequest );
} else {
253
254
255
256
257
258
259
260
261
262
// adapt the LOCALITY_UPDATE_TIME
i f ( LOCALITY_UPDATE_TIME < 20000) {
LOCALITY_UPDATE_TIME += 100;
}
299
300
301
302
Zur groben Einteilung der Entfernungen der Knoten werden die drei Horizonte
(local),
lokal
erweitert (extended) und global (global) verwendet. Mit Hilfe von Schwell-
werten kann jeder Knoten in einen Horizont eingeteilt werden. Bei jedem Durchlauf
der
update-Methode werden alle Nodes im Node Roster
überprüft, ob sich die jeweilige
Zuordnung in den Horizont geändert hat. Es ist nicht sinnvoll, dies bei jeder möglichen Änderung eines Lokalitätsvektors zu überprüfen, da bei der Neuberechnung des
eigenen Lokalitätsvektors alle
Nodes überprüft werden müssten. Dabei werden die An-
zahlen der jeweiligen Knoten in jedem Horizont gezählt, um damit die Schwellwerte
dynamisch ändern zu können.
174
219
220
221
222
223
224
225
p u b l i c v o i d update () {
// save locality - data in nodeproperty
s y n c h r o n i z e d ( nodeRoster ) {
double dist = localVector . distance ( localityTable . getVector ( remNodeId ) );
i f ( nodeRoster . containsNode ( remNodeId )) {
TypedProperties prop = nodeRoster . get ( remNodeId ). getProperties () ;
i f ( dist < LOCALITY_threshold_local ) {
numLocNodes ++;
2005-03-21/015/IN99/2253
69
7. Implementierung
i f (! prop . get ( NODEPROPERTY_LOCALITY ). equals ( LOCALITY_OBJECT_LOC ))
prop . put ( NODEPROPERTY_LOCALITY , LOCALITY_OBJECT_LOC );
} else {
i f ( dist < LOCALITY_threshold_extended ) {
numExtNodes ++;
i f (! prop . get ( NODEPROPERTY_LOCALITY ). equals ( LOCALITY_OBJECT_EXT ))
prop . put ( NODEPROPERTY_LOCALITY , LOCALITY_OBJECT_EXT );
} else {
numGloNodes ++;
i f (! prop . get ( NODEPROPERTY_LOCALITY ). equals ( LOCALITY_OBJECT_GLO ))
prop . put ( NODEPROPERTY_LOCALITY , LOCALITY_OBJECT_GLO );
}
}
226
227
228
229
230
231
232
233
234
235
236
237
238
}
239
}
240
7.3. Lokalisierung
Alle Klassen der Lokalisierung sind in dem Paket
org.ekstream.localisation
zu-
sammengefasst.
22 package org . ekstream . localisation ;
Die Lokalisierung wird in zwei Teile aufgeteilt: einen aktiven und einen passiven Teil.
Der aktive Teil sucht im Netzwerk nach Diensten (bzw.
Sessions)
und bearbeitet
auch die Anfragen von anderen Knoten. Der passive Teil ist die Schnittstelle zum
Scheduler,
über die dem
Scheduler
nach bestimmten Kriterien ausgewählte bekannte
Knoten geliefert werden.
Die Implementierung verschiedener Lokalisierungsstrategien konnten in dem zeitlich begrenzten Rahmen der Diplomarbeit nicht vorgenommen werden, da der Schwerpunkt
dieser Diplomarbeit beim Routing lag. Daher wurde eine einfache Lokalisierung entwickelt.
7.3.1. Schnittstellen
Die Schnittstellen der Lokalisierung sind in den abstrakten Klassen AbstractLocalisa-
tion und AbstractNetLocalisation deniert. Dabei ist der passive Teil AbstractLocalisation eine synchrone Schnittstelle zum
70
Scheduler. Der Methode select können
2005-03-21/015/IN99/2253
7.3. Lokalisierung
unterschiedliche Parameter übergeben werden, damit die entsprechende Auswahl getroen werden kann.
38 p u b l i c
a b s t r a c t c l a s s AbstractLocalisation {
130
p u b l i c a b s t r a c t Set select ( Stream session , i n t horizon );
139
p u b l i c a b s t r a c t Set select ( ElementaryStream stream , i n t horizon ) ;
153
p u b l i c a b s t r a c t Set select ( ElementaryStream stream , i n t horizon , l o n g minSecMaxTime ,
l o n g maxSecMinTime , i n t minBw );
154
AbstractNetLocalisation ist die Schnittstelle für den aktiven Teil. Dieser beinhaltet
die Suche nach bestimmten Diensten (Session) im Netzwerk und die Aktualisierung
der Informationen für die Knoten im
40 p u b l i c
a b s t r a c t c l a s s AbstractNetLocalisation e x t e n d s Looper {
Die gesuchten
108
109
110
112
113
114
116
117
118
120
121
122
Node Roster.
Sessions
können mit folgenden Methoden bearbeitet werden:
p u b l i c boolean addSession ( Stream session ) {
r e t u r n searchedSessions . add ( session );
}
p u b l i c Iterator listSessions () {
r e t u r n searchedSessions . iterator () ;
}
p u b l i c boolean containsSession ( Stream session ) {
r e t u r n searchedSessions . contains ( session );
}
p u b l i c boolean removeSession ( Stream session ) {
r e t u r n searchedSessions . remove ( session );
}
Die
search-Methode
ist für das Suchen von Knoten, die die gesuchten
Sessions
an-
bieten, zuständig.
124
p u b l i c a b s t r a c t v o i d search ( Stream session ) ;
Zum Aktualisieren von bekannten Informationen ist die
126
update-Methode
vorhanden.
p u b l i c a b s t r a c t v o i d update () ;
Die Behandlung der Standard-Nachrichten wird in separate Methoden unterteilt.
Lo-
cateSession wird zum Suchen einer Session, LocateSessionResult zum Empfangen
von Informationen der Knoten (z. B. als Antwort auf
LocateSession) und GetNodeInfo
zum Aktualisieren der Informationen eines Knotens verwendet.
2005-03-21/015/IN99/2253
71
7. Implementierung
128
p r o t e c t e d a b s t r a c t v o i d receivedGetNodeInfo ( GetNodeInfo msg );
130
p r o t e c t e d a b s t r a c t v o i d receivedLocateSession ( LocateSession msg ) ;
132
p r o t e c t e d a b s t r a c t v o i d receivedLocateSessionResult ( LocateSessionResult msg );
7.3.2. Einfache Lokalisierung
Die einfache Lokalisierung sucht im Netzwerk nicht nach Knoten mit einer
Session,
sondern aktualisiert nur die Informationen aller bekannten Knoten. Da die Knotenanzahl, die für den anschlieÿenden Test zur Verfügung stehen wird, kleiner als die gewünschte Mindestanzahl der bekannten Knoten für das dynamische
Routing
ist, reicht
diese Implementierung für die gegebenen Umstände aus. Die Klasse SimpleLocalisa-
tion ist die Implementierung des passiven Teils, während die Klasse SimpleNetLocalisation die Implementierung des aktiven Teils darstellt.
41 p u b l i c
c l a s s SimpleLocalisation e x t e n d s AbstractLocalisation {
53 p u b l i c
c l a s s SimpleNetLocalisation e x t e n d s AbstractNetLocalisation {
7.3.2.1. Passiver Teil
Die Klasse SimpleLocalisation versucht dem
Nodes
Scheduler
eine geeignete Menge an
zu übergeben, sofern diese vorhanden sind.
Dabei erfolgt die Bearbeitung jedes möglichen Kriteriums in einer separaten Methode.
Jede dieser Methoden kann mit einem Filter verglichen werden. Sie erhält eine Menge
an Knoten und gibt eine Menge der Knoten zurück, die das jeweilige Kriterium erfüllen.
Für die Kombination mehrerer Kriterien können diese Methoden nacheinander auf der
jeweils angepassten Ergebnismenge aufgerufen werden.
79
80
p u b l i c Set select ( ElementaryStream stream , i n t horizon , l o n g minSecMaxTime ,
l o n g maxSecMinTime , i n t minBw ) {
Set currentNodeSet = selectNodesHorizon ( nodeRoster . nodeSet () , horizon ) ;
currentNodeSet = selectNodesStream ( currentNodeSet , stream ) ;
84
85
86
currentNodeSet = selectNodesTimes ( currentNodeSet , stream , minSecMaxTime ,
maxSecMinTime );
currentNodeSet = selectNodesBandwidth ( currentNodeSet , minBw );
87
88
89
r e t u r n currentNodeSet ;
90
91
}
72
2005-03-21/015/IN99/2253
7.3. Lokalisierung
Die möglichen einzelnen Kriterien sind:
100
p r o t e c t e d Set selectNodesHorizon ( Collection nodes , i n t horizon ) {
145
p r o t e c t e d Set selectNodesSession ( Set nodes , Stream session ) {
176
p r o t e c t e d Set selectNodesStream ( Set nodes , ElementaryStream stream ) {
212
p r o t e c t e d Set selectNodesTimes ( Set nodes , ElementaryStream stream , l o n g
minSecMaxTime ,
265
p r o t e c t e d Set selectNodesBandwidth ( Set nodes , i n t minBandwidth ) {
Die Auswahl des Horizontes wird immer benötigt und kann deshalb als erstes Kriterium
verwendet werden. Dabei wird der Methode immer die gesamte Menge der bekannten
Knoten aus dem
Node Roster
übergeben. Bei der Auswahl des Horizontes ist zu beach-
ten, dass ein gröÿerer Horizont die kleineren beinhaltet.
100
101
102
103
104
105
106
107
p r o t e c t e d Set selectNodesHorizon ( Collection nodes , i n t horizon ) {
Set nodeSetHorizon = new HashSet () ;
Node currentNode ;
TypedProperties currentProperty ;
String key = NODEPROPERTY_LOC_TYPE ;
String key1 = NODEPROP_Busy ;
i n t locality = 0;
boolean busy = t r u e ;
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
s y n c h r o n i z e d ( nodeRoster ) {
Iterator nodesIt = nodes . iterator () ;
w h i l e ( nodesIt . hasNext () ) {
Object nodeObject = nodesIt . next () ;
i f ( nodeObject i n s t a n c e o f Node ) {
currentNode = ( Node ) nodeObject ;
currentProperty = currentNode . getProperties () ;
s y n c h r o n i z e d ( currentProperty ) {
i f ( currentProperty . isRegistered ( key ) ) {
locality = (( Integer ) currentProperty . get ( key )). intValue () ;
i f ( currentProperty . isRegistered ( key1 )) {
busy = (( Boolean ) currentProperty . get ( key1 )). booleanValue () ;
i f ( busy ) c o n t i n u e ;
}
i f ( locality <= horizon ) {
// also the nodes of the lower locality should be considered ,
therefore <=
nodeSetHorizon . add ( currentNode );
}
}
}
}
}
}
2005-03-21/015/IN99/2253
73
7. Implementierung
r e t u r n nodeSetHorizon ;
135
136
}
7.3.2.2. Aktiver Teil
Die Klasse SimpleNetLocalisation aktualisiert die Informationen über vorhandene
Sessions aller im Node Roster
diese
Session
bekannten Knoten. Dabei wird nicht berücksichtigt, ob
benötigt wird. Eine
Session
stellt zur Zeit nur eine Zusammenfassung
mehrerer einzelner Streams dar (z. B. Audio und Video), die zeitgleich abgespielt werden müssen. Jeder Knoten hat hierbei nur einen bestimmten Teil in seinem lokalem
Puer. Dies kann anhand von relativen Zeiten (StreamTimes) bestimmt werden. Da
der
Scheduler
mehrere Knoten als Quellen wählen kann, ist es sehr wichtig zu wissen,
welche Zeitpunkte bei jedem Knoten im Puer vorhanden sind. Diese Informationen
werden direkt bei jedem
Node-Objekt gespeichert, sodass der Scheduler
einfach auf die
Informationen zugreifen kann.
155
156
157
158
159
160
161
162
163
164
165
p r o t e c t e d v o i d receivedLocateSessionResult ( LocateSessionResult msg ) {
Vector dataVec = msg . getData () ;
// msg . getRequestID () ; // FIXME requestID
Log . debug ( t h i s , " Received a LocateSessionResultMessage ");
i f ( nodeRoster . isLocal ( msg . getRequestNodeId () )) {
Iterator dataVecIt = dataVec . iterator () ;
w h i l e ( dataVecIt . hasNext () ) {
NodeInfo info = ( NodeInfo ) dataVecIt . next () ;
l o n g rcvTime = System . currentTimeMillis () - info . getAgeOfNodeInfo () ; // FIXME
take real rcvTime !
Node node = nodeRoster . get ( info . getNodeId () );
updateNodeProperty ( info . getData () , node , rcvTime , info . isBusy () );
166
}
167
}
168
169
}
Die Bandbreite gehört ebenfalls zu den wichtigen Informationen eines Knotens. Diese
kann allerdings nicht übertragen werden, sondern muss für jeden Knoten separat gemessen werden. Die Messung wird mit Hilfe des
die
271
Sessions
Routings nur zu Knoten vorgenommen,
anbieten.
p u b l i c v o i d update () {
// measure bandwidth only if some NodeInfo known
i f ( prop . isRegistered ( NODEPROP_Bandwidth )) {
i f ( currentTime > UPDATETIME_Bandwidth
312
313
314
74
2005-03-21/015/IN99/2253
7.3. Lokalisierung
+ (( Long ) prop . get ( NODEPROP_BandwidthTime )) . longValue () ) {
// if bandwidth value too old => request a new bandwidth measurement
315
316
BandwidthRequest bwMessage = new BandwidthRequest ( node . getId () ,
getMessenger () );
bwMessenger . fireMessage ( bwMessage );
318
319
}
} else {
320
321
BandwidthRequest bwMessage = new BandwidthRequest ( node . getId () ,
getMessenger () );
bwMessenger . fireMessage ( bwMessage );
323
324
}
325
Nachdem die Bandbreite gemessen wurde, erhält die
Lokalisierung eine BandwidthResult-
Nachricht.
p u b l i c v o i d messageReceived ( Message message ) {
222
223
s u p e r . messageReceived ( message );
224
225
i f ( message i n s t a n c e o f BandwidthResult ) {
226
227
BandwidthResult resultMsg = ( BandwidthResult ) message ;
NodeId nodeId = resultMsg . getNodeId () ;
l o n g measureTime = resultMsg . getMeasureTime () ;
i n t measuredBW = resultMsg . getBandwidth () ;
228
229
230
231
property . put ( NODEPROP_Bandwidth , new Integer ( measuredBW ));
property . put ( NODEPROP_BandwidthTime , new Long ( measureTime )) ;
243
244
Die regelmäÿige Aktualisierung dieser Informationen erfolgt in der
bestimmten Zeitabständen wird dabei jedem Knoten eine
update-Methode. In
GetNodeInfo-Nachricht
ge-
schickt. Hat dieser Knoten nach einer doppelt so langen Zeit nicht geantwortet, werden
seine Informationen gelöscht, da sie vermutlich ungültig sind.
p u b l i c v o i d update () {
271
i f ( currentTime > UPDATETIME_RemoteNode
+ (( Long ) prop . get ( NODEPROP_Sessions_RcvTime )). longValue () ) {
// info is too old => request new
requestNodeInfo ( node ) ;
300
301
302
303
Damit die lokalen Informationen einem anderen Knoten gesendet werden können, müssen sie regelmäÿig von
4
Buer
und
Admission Control 4
abgefragt werden.
Das Admission Control beantwortet dabei nur die Frage, ob generell noch ausgehende Verbindungen
zu anderen Knoten zugelassen werden.
2005-03-21/015/IN99/2253
75
7. Implementierung
355
356
357
p r o t e c t e d v o i d updateLocalInfo () {
Vector data = new Vector () ;
l o n g aktTime = System . currentTimeMillis () ;
Iterator sessionIt = buffer . sessions () . iterator () ;
w h i l e ( sessionIt . hasNext () ){
Stream session = ( Stream ) sessionIt . next () ;
i f ( session != n u l l ) {
// Search for the StreamInfos
Vector sessionData = new Vector (2) ; // 0 = session , 1 = Vector of
SessionInfo
Vector streamVector = new Vector () ;
sessionData . add (0 , session );
SessionInfo sessionInfo = buffer . getSessionInfo ( session );
362
363
364
365
366
367
368
369
370
Iterator sessionInfoIt = sessionInfo . streamInfos () . iterator () ;
w h i l e ( sessionInfoIt . hasNext () ) {
StreamInfo streamInfo = ( StreamInfo ) sessionInfoIt . next () ;
i f ( streamInfo != n u l l ){
streamVector . add ( streamInfo );
}
}
sessionData . add (1 , streamVector );
sessionData . add (2 , new Long ( aktTime ) );
data . add ( sessionData );
378
379
380
381
382
383
384
385
386
387
}
}
updateNodeProperty ( data , nodeRoster . localNode () , aktTime , (! admissionControl .
isAcceptingLinks () ));
388
389
390
Da die Anzahl der
Sessions und die Streams einer Session unterschiedlich sein kann,
muss ein dynamisches Format verwendet werden, um diese Informationen an andere Knoten zu senden. Diese Informationen werden dabei in den Datenvektor eines
NodeInfo-Objektes
in folgendem Format gespeichert:
•
der Datenvektor ist ein
•
ein
SessionVektor
•
ein
StreamVektor
ist ein
ist ein
Vector
aus mehreren
Vector
aus einer
Vector
aus
SessionVektoren
Session
und einem
StreamVektor
StreamInfos
7.4. Admission Control
Das
Admission Control
wurde in dem Paket
org.ekstream.admissioncontrol imple-
mentiert.
76
2005-03-21/015/IN99/2253
7.4. Admission Control
22 package org . ekstream . admissioncontrol ;
7.4.1. Schnittstellen
Die Schnittstellen sind in der abstrakten Klasse AdmissionControl deniert.
31 p u b l i c
i n t e r f a c e AdmissionControl {
Die wichtigste Methode ist
acceptNewLink
die vom
Link Control
aufgerufen wird,
wenn eine ausgehende Datenverbindung zu einem anderen Knoten erzeugt werden soll.
p u b l i c a b s t r a c t boolean acceptNewLink ( ActivationRequest req ) ;
40
Die
isAcceptingLinks-Methode wird von der Lokalisierung verwendet, um festzustel-
len ob generell noch ausgehende Datenverbindungen zugelassen werden.
p u b l i c a b s t r a c t boolean isAcceptingLinks () ;
48
Da einige Implementierungen des AdmissionControl Informationen zu den schon
vorhandenen Links benötigen, wird der
LinkRoster
in der
setLinkRoster-Methode5
festgelegt.
p u b l i c a b s t r a c t v o i d setLinkRoster ( LinkRoster linkRoster ) ;
56
7.4.2. Statisches Admission Control
Das statische
immer
True
Admission Control
oder immer
False
der StaticAdmissionControl-Klasse gibt entweder
zurück. Dies kann für Tests verwendet werden, wenn
alle ausgehenden Datenverbindungen entweder zugelassen oder nicht zugelassen werden
sollen.
31 p u b l i c
c l a s s StaticAdmissionControl implements AdmissionControl {
32
p r i v a t e boolean accept ;
33
34
p u b l i c StaticAdmissionControl ( boolean accept ) {
t h i s . accept = accept ;
}
35
36
37
5
Das direkte Übergeben des LinkRosters ist nicht möglich, da er erst zu einem späteren Zeitpunkt
erzeugt wird.
2005-03-21/015/IN99/2253
77
7. Implementierung
49
50
51
57
58
59
p u b l i c boolean acceptNewLink ( ActivationRequest req ) {
r e t u r n accept ;
}
p u b l i c boolean isAcceptingLinks () {
r e t u r n accept ;
}
7.4.3. Einfaches Admission Control
Ein einfaches
Admission Control
wurde in der SimpleAdmissionControl-Klasse im-
plementiert.
36 p u b l i c
c l a s s SimpleAdmissionControl implements AdmissionControl {
Dort wird im Konstruktor, beim Erzeugen des Objektes, die maximale Anzahl und die
maximale Bandbreite für alle ausgehende Datenverbindungen festgelegt.
43
44
45
46
p u b l i c SimpleAdmissionControl ( i n t maxBandwidth , i n t maxLinks ) {
t h i s . maxBandwidth = maxBandwidth ;
t h i s . maxLinks = maxLinks ;
}
Dazu werden die Bitraten und die Anzahl aller existierenden ausgehenden Datenverbindungen aufsummiert. Sind beide festgelegten Maximalwerte mit der angeforderten
Datenverbindung noch nicht erreicht, wird sie zugelassen.
71
p u b l i c boolean acceptNewLink ( ActivationRequest req ) {
Iterator it = linkRoster . iterator () ;
w h i l e ( it . hasNext () ) {
Link link = ( Link ) it . next () ;
i f (( link i n s t a n c e o f OutboundLink ) && ( !( link i n s t a n c e o f ExportLink ))) {
OutboundLink olink = ( OutboundLink ) link ;
currentBW -= olink . getNominalBitRate () ;
currentLinks ++;
}
}
78
79
80
81
82
83
84
85
86
87
i f ( currentLinks >= maxLinks ) {
Log . info ( t h i s , " Deny ActivationRequest because maximum of accepted links ( "
+ maxLinks + ") reached ." );
return f a l s e ;
}
88
89
90
91
92
93
i f ( req . getFilter () . getFraction ()
* req . getStream () . getNominalBitRate () > currentBW ) {
94
95
78
2005-03-21/015/IN99/2253
7.4. Admission Control
Log . info ( t h i s , " Deny ActivationRequest because not enough available bandwidth ( "
+ currentBW + "). ");
return f a l s e ;
96
97
98
}
99
return true ;
104
105
}
110
p u b l i c boolean isAcceptingLinks () {
i f (( currentBW > 0) &&( currentLinks < maxLinks )) {
return true ;
} else {
return f a l s e ;
}
127
128
129
130
131
132
}
2005-03-21/015/IN99/2253
79
7. Implementierung
80
2005-03-21/015/IN99/2253
8. Test
Der Test der in Kapitel 7 beschriebenen Implementierung eines dynamischen lokalitätsbewussten Routings soll im Folgenden beschrieben werden.
Dabei wurden die Lokalitätsvektoren, die Lernraten und die Schwellen beobachtet, um
festzustellen, wie gut sich die Lokalitätsvektoren an die gemessenen RTTs anpassen
und wie die Knoten in Horizonte eingeteilt werden.
Zuerst wird die Testumgebung im Abschnitt 8.1 beschrieben. Danach folgen eine Erläuterung zum Testablauf (Abschnitt 8.2) und eine Auswertung der Testdaten (Abschnitt 8.3). Die Ergebnisse werden in den Abschnitten 8.4 und 8.5 gezeigt und erläutert.
8.1. Testumgebung
Das lokalitätsbewusste dynamische Routing aus dem Abschnitt 7.2.4 wurde in die Testklasse StreamingTestFullDynamic eingebunden. In Anhang A.10 ist das Vorgehen
zum Ausführen eines Tests beschrieben, sodass hier nur kurz ein Beispielaufruf genannt
wird:
user@eris:~/svn/ekStream/bin$ java \
org/ekstream/test/StreamingTestFullDynamic 20000 5000 2000 zazu:5000
In der Tabelle 8.1 sind die Rechner, die für den Test zur Verfügung standen, mit dem
1
jeweiligen Standort, dem Autonomen System
zum Knoten
zazu
und den mittels
ping gemessenen RTTs
aufgelistet. Die Zusammenhänge der Autonomen Systeme wurden
in der Abbildung 8.1 dargestellt.
1 http://www.fixedorbit.com
2005-03-21/015/IN99/2253
81
8. Test
*.tu-ilmenau.de
wotan.imb-jena.de
RIPE-ASNBLOCK-679
680
REACH
4637
KPN
286
ilmhost.de
HETZNER-AS
24940
TDC
3292
synchronity.de
CW
1273
ABOVENET
6461
TISCALI-BACKBONE
3257
HOSTEUROPE-AS
20773
TELIANET
1299
DTAG
3320
TISCALI-DE
12312
invalid147.dyndns.org
slipstream.milon.de
starburst.milon.de
orion.ilmenau.net
Abbildung 8.1.: Graph über die Verbindungen der Autonomen Systeme
Da dies vor allem ein Test für das Routing und die Bestimmung der Lokalität war,
wurde auf die Verwendung von Streaming-Daten verzichtet. Auf diese Art konnten
auch die Ressourcen der externen Rechner geschont werden, die für den Zeitraum des
Tests zur Verfügung gestellt wurden.
82
2005-03-21/015/IN99/2253
2005-03-21/015/IN99/2253
macheiss.prakinf.tu-ilmenau.de
diana.prakinf.tu-ilmenau.de
eris.prakinf.tu-ilmenau.de
telpc1.prakinf.tu-ilmenau.de
telpc2.prakinf.tu-ilmenau.de
telcp3.prakinf.tu-ilmenau.de
telpc4.prakinf.tu-ilmenau.de
vsbslab1.prakinf.tu-ilmenau.de
vsbslab2.prakinf.tu-ilmenau.de
vsbslab3.prakinf.tu-ilmenau.de
vsbslab4.prakinf.tu-ilmenau.de
vsbslab5.prakinf.tu-ilmenau.de
vsbslab6.prakinf.tu-ilmenau.de
wotan.imb-jena.de
synchronity.de
ilmhost.de
slipstream.milon.de
starburst.milon.de
invalid147.dyndns.org
orion.ilmenau.net
mach
dian
eris
tel1
tel2
tel3
tel4
vsb1
vsb2
vsb3
vsb4
vsb5
vsb6
xWot
xAnd
xIlm
xSli
xSta
xKri
xOri
Ilmenau
Berlin
Köln
Köln
Nürnberg
Nürnberg
Uni-Jena
TU-Ilmenau
TU-Ilmenau
TU-Ilmenau
TU-Ilmenau
TU-Ilmenau
TU-Ilmenau
TU-Ilmenau
TU-Ilmenau
TU-Ilmenau
TU-Ilmenau
TU-Ilmenau
TU-Ilmenau
TU-Ilmenau
TU-Ilmenau
Standort
DTAG
TISCALI-DE
HOSTEUROPE-AS
HOSTEUROPE-AS
HETZNER-AS
HETZNER-AS
RIPE-ASNBLOCK-679
RIPE-ASNBLOCK-679
RIPE-ASNBLOCK-679
RIPE-ASNBLOCK-679
RIPE-ASNBLOCK-679
RIPE-ASNBLOCK-679
RIPE-ASNBLOCK-679
RIPE-ASNBLOCK-679
RIPE-ASNBLOCK-679
RIPE-ASNBLOCK-679
RIPE-ASNBLOCK-679
RIPE-ASNBLOCK-679
RIPE-ASNBLOCK-679
RIPE-ASNBLOCK-679
RIPE-ASNBLOCK-679
Autonomes System
Tabelle 8.1.: Daten zu den Testknoten
zazu.prakinf.tu-ilmenau.de
Domain
zazu
Kurzname
zu
10ms
75ms
13ms
13ms
13ms
14ms
3ms
0ms
0ms
0ms
0ms
0ms
0ms
0ms
0ms
0ms
0ms
0ms
0ms
0ms
-
RT Tmeas
zazu
8.1. Testumgebung
83
8. Test
8.2. Verlauf des Tests
Für den Test wurde das Routing jedes Knotens immer auf den Port 5000 eingestellt.
Dadurch war die
NodeId
jedes Knotens, ermittelt aus der IP-Adresse und dem Port,
immer dieselbe.
Der gesamte Test dauerte mehrere Stunden, wobei die Messwerte jedes Knotens in
Logdateien geschrieben wurden.
Um die Dynamik des Netzwerkes zu simulieren, wurden verschiedene Knoten ab und
zu aus dem Netz genommen und wieder hinzugefügt.
Mit der freundlichen Unterstützung verschiedener Betreiber von Rechnern im Internet,
konnte ein deutschlandweiter Test durchgeführt werden.
Die Auswertung der Testergebnisse wurde anhand der Logdateien im folgenden Abschnitt 8.3 vorgenommen.
8.3. Auswertung der Logdateien
Die erzeugten Logdateien umfassten ungepackt 728 Megabytes. Ein kleiner Ausschnitt
einer Logdatei ist im Anhang A.9 zu sehen.
Eine erste Übersicht über alle Logdateien wurde in
Anhang A.1). Dabei wurden der Dateiname, die
uebersicht.txt
erstellt (siehe
NodeId, die IP-Adresse und die Zeiten
der Logdatei zusammengefasst.
Da die Systemzeiten der Knoten nicht synchronisiert waren, musste dies nachträglich
in den Logdateien getan werden. Dafür wurde der Umstand verwendet, dass ein Lokalitätsvektor erst bei einem Knoten empfangen werden kann, wenn er zuvor vom anderen
Knoten berechnet wurde. Das Perl-Skript
makeDiffLog.pl (Anhang A.3) wurde dafür
implementiert. Es gibt alle Zeilen zweier Dateien sortiert nach der Zeit aus. Zusätzlich
kann für die Zeiten der zweiten Datei eine Dierenz angegeben werden. Damit kann
dann eine zuvor bestimmte Zeitdierenz relativ einfach überprüft werden.
Zusätzlich dazu wurde ein weiteres Perl-Skript (searchSyncTime.pl im Anhang A.4)
erstellt, welches versucht die Zeitdierenz zu bestimmen.
84
2005-03-21/015/IN99/2253
8.4. Ergebnisse des Tests
Die bestimmten Zeitdierenzen wurden in die Datei
filesdata.dat (siehe Anhang A.2)
zu den jeweiligen Logdateien eingetragen.
Nun wurden die wichtigen Daten aus den vielen Logdateien mit dem
makeOneLog.pl-
Skript (siehe Anhang A.5) extrahiert und in einer Logdatei zusammengefasst.
Da für die Auswertung allerdings nicht immer alle Daten gleichzeitig benötigt wurden,
erstellte das
splitOneLog.pl-Skript
(siehe Anhang A.6) viele Logdateien mit allen
Kombinationsmöglichkeiten aus gewünschter Information und Knoten (von dem die
Information stammt).
Nun wurden die Lokalitätsvektoren eines Zeitpunktes (55000) genommen und in einer
separaten Datei gespeichert. Diese Lokalitätsvektoren sind in Tabelle 8.2 zu sehen.
Dann wurden mit Hilfe des
calc.pl-Skriptes
(siehe Anhang A.7) die Abstände der
Lokalitätsvektoren untereinander berechnet. In der Tabelle 8.3 ist das Ergebnis der
Berechnung zu sehen.
Um den zeitlichen Verlauf des Abstandes zweier Knoten untereinander darstellen zu
können, wurde das
calcDist2.pl-Skript
(siehe Anhang A.8) implementiert.
8.4. Ergebnisse des Tests
Das Endstadium des Lernvorganges einiger Knoten (siehe Tabelle 8.2) ist in der Tabelle 8.3 zu sehen. Die Dimension
D
war fünf. Zur Verdeutlichung wurden die Zahlen
für kleine Abstände grün und für groÿe Abstände rot gefärbt. Die Rechner, die sich
im gleichen Autonomen System (siehe Tabelle 8.1 und Abbildung 8.1) benden, haben
erwartungsgemäÿ auch einen kleinen Abstand zueinander.
Ebenso ist zu erkennen, das eine reale Lokalität anhand von geographischen Entfernungen nicht verwendet werden kann. Der Knoten
xOri
bendet sich in derselben Stadt
(Ilmenau) nicht mehr als einen Kilometer von den Rechnern der TU-Ilmenau (vsb1-
vsb6 und dian) entfernt. Die Netzwerkpakete müssen allerdings noch über verschiedene
Autonome Systeme übertragen werden und gelangen erst dann wieder in das Netzwerk
der TU-Ilmenau. So hat der Knoten
xWot
an der Universität Jena eine viel geringe-
re Latenz, da er sich im gleichen Autonomen System im Deutschen Forschungsnetz
2
2 http://www.dfn.de
2005-03-21/015/IN99/2253
85
8. Test
x1
x2
x3
x4
x5
vsb1
-2.52
-25.59
-1.37
30.39
20.37
vsb2
-2.56
-25.62
-1.30
30.29
20.27
vsb3
-2.58
-25.79
-1.48
30.72
20.08
vsb4
-2.44
-24.67
-0.43
28.15
20.98
vsb6
-2.70
-25.93
-1.73
31.16
19.92
xIlm
-9.65
-27.19
2.32
22.54
11.96
xOri
-3.12
-30.20
-5.65
40.90
16.31
xWot
-0.68
-25.35
-1.22
31.01
19.64
xAnd
-9.48
-27.15
1.98
23.33
12.01
xSli
-10.34
-19.14
-8.98
31.03
24.01
xKri
5.64
6.02
-50.23
-9.21
52.45
dian
-2.55
-25.27
-0.88
29.34
20.41
Knoten
Tabelle 8.2.: Auistung der Lokalitätsvektoren für die Abstände in Tabelle 8.3
(DFN) bendet.
Die Abstände zwischen den Lokalitätsvektoren entsprachen auch ca. der gemessenen
RTT mit Hilfe von
ping.
Alle Zeiten, vom Knoten
zazu
aus gemessen, sind in der
Tabelle 8.1 zu sehen. Zusätzlich dazu waren die Zeiten zwischen Knoten
xAnd
86
ca. 15ms und zwischen Knoten
xKri
und
xAnd
xWot
und
ca. 75ms.
2005-03-21/015/IN99/2253
0.17
0.50
2.67
1.04
1.19
2.10
12.92
14.12
13.48
13.20
77.78
vsb2
vsb3
vsb4
vsb6
dian
xWot
xOri
xIlm
xAnd
xSli
xKri
vsb1
vsb1
Knoten
2005-03-21/015/IN99/2253
78.08
13.27
13.47
14.12
12.45
2.04
1.62
0.56
3.13
0.53
0.50
vsb3
76.63
13.55
12.86
13.37
15.58
3.76
1.53
3.68
3.13
2.60
2.67
vsb4
78.29
13.18
13.61
14.29
11.90
2.19
2.17
3.68
0.56
1.09
1.04
vsb6
77.42
13.41
12.90
13.49
14.06
2.64
2.17
1.53
1.62
1.10
1.19
dian
78.22
14.53
14.43
15.08
12.57
2.64
2.19
3.76
2.04
2.13
2.10
xWot
84.81
18.50
20.86
21.71
12.57
14.06
11.90
15.58
12.45
12.98
12.92
xOri
82.13
20.26
0.88
21.71
15.08
13.49
14.29
13.37
14.12
13.96
14.12
xIlm
82.15
19.71
0.88
20.86
14.43
12.90
13.61
12.86
13.47
13.32
13.48
xAnd
Tabelle 8.3.: Abstände der Lokalitätsvektoren in der Tabelle 8.2
77.83
13.27
13.32
13.96
12.98
2.13
1.10
1.09
2.60
0.53
0.17
vsb2
70.83
19.71
20.26
18.50
14.53
13.41
13.18
13.55
13.27
13.27
13.20
xSli
70.83
82.15
82.13
84.81
78.22
77.42
78.29
76.63
78.08
77.83
77.78
xKri
8.4. Ergebnisse des Tests
87
8. Test
Im Folgenden werden anhand der Testdaten der Knoten
xWot, xAnd
und
xKri
einige
Diagramme erstellt. In der Abbildung 8.2 ist der zeitliche Verlauf der Lokalitätsvektoren
zu sehen. Dargestellt ist der Abstand des Vektors zum Null-Vektor, der dem Betrag
des Vektors entspricht.
300
Betrag des Vektors von xWot
Betrag des Vektors von xAnd
Betrag des Vektors von xKri
250
Betrag
200
150
100
50
0
47000
48000
49000
50000
51000
52000
53000
54000
55000
56000
57000
Zeit
Abbildung 8.2.: Beträge dreier Beispiel-Lokalitätsvektoren
In der Abbildung 8.3 sind die Abstände der Lokalitätsvektoren untereinander dargestellt. Die anfangs zufällig gewählten Lokalitätsvektoren haben einen groÿen Abstand
zueinander und änderten sich stark. Nach einer kurzen Zeit erreichten die Lokalitätsvektoren einen relativ stabilen Wert und änderten sich nur noch wenig.
Nachdem die Lernrate
δ
anfangs groÿ war, ist sie sehr schnell kleiner geworden (siehe
Abbildung 8.4).
Der kleine unruhige Bereich in diesen drei Abbildungen (jeweils an der Stelle 50000)
ist der Zeitraum, in dem besonders viel Dynamik im Netzwerk simuliert wurde. Da an
diesen Stellen viele komplett neu berechnete Lokalitätsvektoren hinzugekommen sind,
die zufällig weit entfernt waren, veränderten sich auch die stabilen Lokalitätsvektoren
ein wenig. Allerdings war diese Veränderung nicht stark und wurde dann auch zurückgenommen, wie dies besonders in der Abbildung 8.2 zu sehen ist.
88
2005-03-21/015/IN99/2253
8.4. Ergebnisse des Tests
250
Abstand zwischen xWot und xAnd
Abstand zwischen xWot und xKri
Abstand zwischen xAnd und xKri
200
Abstand
150
100
50
0
49000
50000
51000
52000
53000
54000
55000
56000
57000
Zeit
Abbildung 8.3.: Abstände dreier Beispiel-Lokalitätsvektoren untereinander
0.3
Lernrate von xAnd
Lernrate von xWot
Lernrate von xKri
0.25
Lernrate
0.2
0.15
0.1
0.05
47000
48000
49000
50000
51000
52000
Zeit
53000
54000
55000
56000
57000
Abbildung 8.4.: Lernrate der drei Beispielknoten
2005-03-21/015/IN99/2253
89
8. Test
Durch eine Firewall beim Knoten
xKri
war es nur möglich die RTT von
xKri
aus zu
anderen Knoten zu messen, jedoch nicht umgekehrt. Trotzdem sind die Lokalitätsvektoren nach einiger Zeit bei korrekten Werten angekommen.
In der Abbildung 8.5 ist die Veränderung eines Schwellwertes dargestellt. Bei allen
Knoten waren genug lokale Knoten vorhanden, sodass die Schwelle wie beim Knoten
xWot
auf den minimalen Wert von 50 eingestellt wurde. Bei Knoten
xKri
waren die
Entfernungen zu allen Knoten groÿ. Anfangs waren daher für ihn alle anderen Knoten
im erweiterten Horizont. Da der Knoten
xKri
allerdings auch einige
lokale
und
globale
Knoten kennen wollte, versuchte er die Schwellwerte anzupassen. Der Schwellwert für
lokale
Knoten müsste nach oben angepasst werden, allerdings befand sich dieser an-
fangs schon auf den maximalen Wert von 50. Für die Einteilung der Knoten in den
erweiterten
und
globalen
Horizont konnte allerdings der Schwellwert verringert werden
und schwankte so zwischen einem Wert, an dem sich einige Knoten im
einige im
erweiterten
globalen
und
Horizont befanden.
200
Schwelle des erweiterten Horizontes von xWot
Schwelle des erweiterten Horizontes von xKri
180
160
Schwellwert
140
120
100
80
60
40
47000
48000
49000
50000
51000
52000
Zeit
53000
54000
55000
56000
57000
Abbildung 8.5.: Darstellung der Schwelle für die Einordnung der Knoten in den
terten
90
erwei-
Horizont
2005-03-21/015/IN99/2253
8.5. Auswertung und Ausblick
8.5. Auswertung und Ausblick
Der Test hat gezeigt, dass es möglich ist, Lokalität anhand von virtuellen Koordinaten
zu bestimmen. Korrekte Koordinaten wurden relativ schnell erreicht und blieben auch
stabil. So müssen diese Lokalitätsvektoren nicht zu oft ausgetauscht werden.
Nun kann in einem weiteren sehr ausführlichen Test versucht werden, verschiedene
Parameter zu optimieren, um die Ezienz weiter zu erhöhen. Ebenso ist ein Test mit
sich bewegenden Knoten in einem Funknetz notwendig. Zu optimierende Parameter
sind:
Lernrate δ:
Dazu gehören der maximale und der minimale Wert für
δ . Auÿerdem kann
auch der Zeitpunkt und die Art der Anpassung der Lernrate verändert werden.
Es sollte beachtet werden, dass ein kleiner Fehler bei einer kleinen Entfernung
eine gröÿeren Einuss besitzt, als bei einer groÿen Entfernung. Daher müsste der
Fehler relativ zur Entfernung bezogen werden. Auf welche Art und Weise dieser
relative Fehler und daraus die Änderung der Lernrate
δ
anders berechnet werden
kann, sollte noch genauer untersucht werden.
Aktualisierungsdauer τ :
Zur Zeit wird
τ
schrittweise bis zu einem Maximalwert er-
höht. Es ist aber auch möglich, sie ebenso wie die Lernrate wieder verringern zu
können. Auch kann die Schrittweite der Erhöhung und der Maximalwert verändert werden.
Dimension der Lokalitätsvektoren D:
Die Genauigkeit der Abstandsberechnungen
wird durch die Dimension der Lokalitätsvektoren bestimmt. Dabei steigt mit
D
die Genauigkeit und der Berechnungsaufwand. Während jedoch der Berechnungsaufwand linear mit
D
D
D≤2
ab. Dimensionen
Schwellen und Horizonte:
steigt, nimmt der Zuwachs der Genauigkeit mit höherem
sind nicht geeignet (siehe [Ng und Zhang (2001)]).
Es ist möglich, mehr als drei Horizonte zu verwenden, um
Knoten besser einteilen zu können. Die Anpassung der Schwellwerte und der
maximalen und minimalen Werte für eine Schwelle kann ebenso noch optimiert
werden.
2005-03-21/015/IN99/2253
91
8. Test
92
2005-03-21/015/IN99/2253
9. Schlussbemerkung
Die Implementierung eines ezienten Routings erfolgte mit Hilfe von Lokalitätsbetrachtungen der Knoten. Dabei wurden dezentral berechnete virtuelle Koordinaten verwendet, deren Abstände der
Round Trip Time
entsprechen.
9.1. Bewertung und Ausblick
Ein Test der Berechnung zeigte, dass die Verwendung von virtuellen Koordinaten gut
geeignet ist, um die Lokalitäten zu berechnen. Allerdings sind mehrere Parameter vorhanden, mit deren Hilfe die Ezienz weiter erhöht werden kann. Diese Parameter sind
vor allem die Lernrate
δ,
die Aktualisierungszeit
τ,
die Dimension
D
der Lokalitäts-
vektoren und die Schwellen für die Horizonte (siehe Abschnitte 6.2.2 und 8.5). Dabei
können nicht nur die Werte der Parameter verändert werden, auch existiert eine Vielzahl an Möglichkeiten diese Werte dynamisch anzupassen. Zum Beispiel ist es unter
Umständen nicht notwendig, die Lernrate anhand des relativen Fehlers zu berechnen,
sondern die Verwendung des absoluten Fehlers
ε
ist ausreichend.
Dem Lokalitätsvektor könnte noch ein Stabilitätswert hinzugefügt werden, sodass ein
stabiler Lokalitätsvektor nicht so oft aktualisiert werden muss. Um den eigenen Lokalitätsvektor zu verbessern, besteht die Möglichkeit dann die Messungen der
Times
Round Trip
bevorzugt zu Knoten mit stabilen Lokalitätsvektoren vorzunehmen.
Mit Hilfe der Lokalitätsvektoren können auch die Abstände von zwei beliebigen Knoten
bestimmt werden und so bei der Routingentscheidung verwendet werden, wenn die
Pakete nicht direkt versendet werden sollen.
Das implementierte Routing ist in der Lage dynamisch Knoten kennen zu lernen. Allerdings kann es nur den Eintrag für einen Knoten wieder löschen, wenn der andere
Knoten eine längere Zeit nicht mehr antwortet. Denkbar wären auch Methoden, die
2005-03-21/015/IN99/2253
93
9. Schlussbemerkung
bei einer zu groÿen Menge an bekannten Knoten einige wieder austragen. Dazu muss
untersucht werden, ob andere Komponenten, auÿer dem Routing, diese Knoten noch
benötigen.
In dieser Diplomarbeit wurde ein vollständig dezentrales Routing implementiert, welches eine hohe Ausfallsicherheit besitzt. Allerdings können auch weitere Routingstrategien untersucht werden, die beispielsweise lokale Cluster aufbauen und lokale
nodes
Super-
wählen. Eine solche Strategie wird derzeit im Rahmen einer Studienjahresarbeit
näher untersucht.
Für die Lokalisierung können die in Abschnitt 6.4 vorgestellten Ideen weiter untersucht
und implementiert werden.
Weiterführend existieren zwei Studienjahresarbeiten, die sich mit dem
trol
Admission Con-
und der Firewall-Problematik beschäftigen.
9.2. Zusammenfassung
Das Ziel dieser Diplomarbeit war die Entwicklung eines ezienten Routings für kooperative Multimedia-Streaming-Systeme.
Die Ezienz wurde mit der Berücksichtigung der Lokalität erreicht und als Lokalitäts-
Round Trip Time ) verwendet.
kriterium die Netzwerklatenz (
Damit die Latenz nicht von jedem Knoten jedes Mal berechnet werden muss, wurden
virtuelle Koordinaten eingeführt. Jeder Knoten besitzt und berechnet seine eigene virtuelle Koordinate und kennt die Koordinaten der anderen Knoten. Die Koordinaten
werden so berechnet, dass die Abstände der Koordinaten zweier Knoten der
Trip Time
Round
zwischen ihnen entsprechen.
Diese dezentrale Lokalitätsberechnung ist mit einem dynamischen Routing in das Multimedia-Streaming-System
ekStream
integriert worden. Ebenso wurde eine einfache Me-
thode für die Lokalisierung implementiert, damit das System komplett getestet werden
konnte.
94
2005-03-21/015/IN99/2253
Literaturverzeichnis
Banerjee, S. ; Bhattacharjee, B.:
[Banerjee und Bhattacharjee 2002]
A compar-
ative study of application layer multicast protocols. 2002. URL: http://citeseer.
ist.psu.edu/banerjee01comparative.html
Banerjee, Sujata ; Xu, Zhichen ; Lee, Sung-Ju ; Tang, Chun-
[Banerjee u. a. 2003]
qiang:
Service Adaptive Multicast for Media Distribution Networks.
2003. URL:
http://citeseer.ist.psu.edu/banerjee03service.html
Castro, M. ; Druschel, P. ; Kermarrec, A. ; Nandi,
[Castro u. a. 2003]
A. ; Rowstron, A. ; Singh, A.:
erative environments.
2003. Splitstream: High-bandwidth multicast in coop-
URL:
http://citeseer.ist.psu.edu/article/
castro03splitstream.html
[Castro u. a. 2002]
Castro, M. ; Druschel, P. ; Kermarrec, A. ; Rowstron, A.:
SCRIBE: A large-scale and decentralized application-level multicast infrastructure.
In:
IEEE Journal on Selected Areas in communications (JSAC)
Bd. 20, Oktober
2002, S. 14891499. Special issue on network support for multicast communication.
[Chawathe 2003]
framework. In:
[Chu u. a. 2002]
Hui:
Chawathe, Yatin: Scattercast: an adaptable broadcast distribution
Multimedia Syst.
9 (2003), Nr. 1, S. 104118. ISSN 0942-4962
Chu, Yang-hua ; Rao, Sanjay G. ; Seshan, Srinivasan ; Zhang,
A case for end system multicast.
in Communications
Bd. 20, URL:
JSAC.CaseForESM.2002.pdf,
2005-03-21/015/IN99/2253
In:
IEEE Journal on Selected Areas
http://esm.cs.cmu.edu/technology/papers/
October 2002, S. 14561471
95
Literaturverzeichnis
[Cox u. a. 2003]
Cox, R. ; Dabek, F. ; Kaashoek, F. ; Li, J. ; Morris, R.:
Distributed Network Coordinates.
2003. URL:
Practical
http://citeseer.ist.psu.edu/
article/cox03practical.html
Cui, Yi ; Nahrstedt, Klara: Layered peer-to-peer stream-
[Cui und Nahrstedt 2003]
NOSSDAV '03: Proceedings of the 13th international workshop on Network
and operating systems support for digital audio and video, ACM Press, 2003, S. 162
ing. In:
171. ISBN 1-58113-694-3
[Deshpande u. a. 2002]
Hector:
Deshpande, Hrishikesh ; Bawa, Mayank ; Garcia-Molina,
Streaming Live Media over Peers. 2002. URL: http://dbpubs.stanford.
edu:8090/pub/2002-21.
[Goyal 2001]
Zugrisdatum: 15.01.2005
Goyal, Vivek K.: Multiple Description Coding: Compression Meets
the Network. In:
IEEE Signal Processing Magazine Bd. 18, September 2001, S. 7493
Ezientes Multimedia Streaming auf Basis eines semi-dezentralisierten P2P-Netzwerks, Technische Universität Ilmenau, Di-
[Heidenreich 2004]
Heidenreich, Ronny:
plomarbeit, 2004
[Krüger und Reschke 2004]
Krüger, Gerhard ; Reschke, Dietrich:
Übungsbuch Telematik - Netze, Dienste, Protokolle.
3. Auage.
Lehr- und
Fachbuchverlag
Leipzig, 2004
Kodierverfahren für die verteilte Übertragung QoSsensitiver Datenströme über hochdynamische Netzwerke, Technische Universität Il-
[Kärst 2004]
Kärst, Holger:
menau, Diplomarbeit, 2004
[Lv u. a. 2002]
Lv, Qin ; Cao, Pei ; Cohen, Edith ; Li, Kai ; Shenker, Scott: Search
and replication in unstructured peer-to-peer networks. In:
the 16th international conference on Supercomputing.
ICS '02: Proceedings of
New York, NY, USA : ACM
Press, 2002, S. 8495. ISBN 1-58113-483-5
[Ng und Zhang 2001]
Ng, E. ; Zhang, H.:
with coordiantes-based approaches.
Predicting Internet network distance
2001. URL:
http://citeseer.ist.psu.edu/
article/ng02predicting.html
96
2005-03-21/015/IN99/2253
Literaturverzeichnis
Padmanabhan, V. ; Chou, P. ; Wang, H.: Resilient
[Padmanabhan u. a. 2003]
peer-to-peer streaming
/ Microsoft Research.
URL:
edu/padmanabhan03resilient.html, März 2003
http://citeseer.ist.psu.
(MSR-TR-2003-11). Forschungs-
bericht
Padmanabhan, Venkata N. ; Wang, Helen J. ; Chou,
[Padmanabhan u. a. 2002]
Philip A. ; Sripanidkulchai, Kunwadee:
Distributing streaming media content
NOSSDAV '02: Proceedings of the 12th international workshop on Network and operating systems support for digital audio and
video, ACM Press, 2002, S. 177186. ISBN 1-58113-512-2
using cooperative networking. In:
[Ratnasamy u. a. 2001]
Ratnasamy, Sylvia ; Francis, Paul ; Handley, Mark ;
Karp, Richard ; Shenker, Scott: A Scalable Content Addressable Network. Berkeley, CA, 2001 (TR-00-010). Forschungsbericht. URL:
http://citeseer.ist.
psu.edu/ratnasamy01scalable.html
Waitzman, D. ; Partridge, C.:
[RFC 1075 1988]
ing Protocol.
November 1988. URL:
http://www.faqs.org/rfcs/rfc1075.html
Handley, M. ; Jacobson, V.:
[RFC 2327 1998]
April 1998. URL:
[RFC 2663 1999]
Distance Vector Multicast Rout-
SDP: Session Description Protocol.
http://www.faqs.org/rfcs/rfc2327.html
Srisuresh, P. ; Holdrege, M.:
(NAT) Terminology and Considerations.
IP Network Address Translator
August 1999. URL:
http://www.faqs.
org/rfcs/rfc2663.html
[Ritter 2001]
URL:
Ritter, Jordan:
Why Gnutella Can't Scale. No, Really.
http://www.dakridge.com/~jpr5/doc/gnutella.html.
2001.
Zugrisdatum:
20.05.2005
[Roca und El-Sayed 2001]
Roca, Vincent ; El-Sayed, Ayman: A Host-Based Mul-
ticast (HBM) Solution for Group Communications. In:
ICN '01: Proceedings of the
First International Conference on Networking-Part 1, Springer-Verlag, 2001, S. 610
619. ISBN 3-540-42302-8
[Rowstron und Druschel 2001]
Rowstron, Antony I. T. ; Druschel, Peter: Pastry:
Scalable, Decentralized Object Location, and Routing for Large-Scale Peer-to-Peer
2005-03-21/015/IN99/2253
97
Literaturverzeichnis
Middleware 2001: Proceedings of the IFIP/ACM International Conference on Distributed Systems Platforms Heidelberg, Springer-Verlag, 2001, S. 329350.
Systems. In:
ISBN 3-540-42800-3
[Strufe 2003]
Strufe, Thorsten:
Klassikation von Namens- und Lokalisierungs-
diensten in dezentralen verteilten Systemen / Technische Universität Ilmenau. URL:
http://www.tu-ilmenau.de/site/telematik/fileadmin/template/startIA/
telematik/Mitarbeiter/strufe/strufe03klassifikation.pdf.
Zugrisda-
tum: 08.06.2005, 2003. Forschungsbericht. 9. Workshop 'Multimedia Informationsund Kommunikationssysteme (MIK)' im Rahmen der net.objectdays 2003, Erfurt,
24.9.2003, S. 322-335
[Strufe 2004]
Strufe, Thorsten:
IlmStream: Ecient Multimedia Streaming
in decentralised distributed systems
/ Technische Universität Ilmenau.
URL:
http://www.tu-ilmenau.de/site/telematik/fileadmin/template/startIA/
telematik/Mitarbeiter/strufe/Strufe04IlmStream.pdf.
Zugrisdatum:
08.06.2005, 2004. Forschungsbericht. 4th International Forum on Multimedia and
Image Processing (IFMIP) at the World Automation Congress 2004
[Tran u. a. 2003a]
Tran, D. ; Hua, K. ; Do, T.:
peer scheme for media streaming.
2003. URL:
Zigzag: An ecient peer-to-
http://citeseer.ist.psu.edu/
tran03zigzag.html
[Tran u. a. 2003b]
Tran, Duc A. ; Hua, Kien ; Do, Tai:
chitecture for Media Streaming.
2003. URL:
A Peer-to-Peer Ar-
http://citeseer.ist.psu.edu/
tran03peertopeer.html
[Weber
2004]
Weber, Kai:
Ezientes kooperatives Multimedia-Streaming in
Overlay-Netzen, Technische Universität Ilmenau, Diplomarbeit, 2004
98
2005-03-21/015/IN99/2253
Abbildungsverzeichnis
3.1.
Übertragung mittels Unicast, IP-Multicast und Overlay-Multicast
. . .
14
3.2.
Topologieformen für das Overlay-Netz . . . . . . . . . . . . . . . . . . .
16
3.3.
Einuss der Lokalität auf die Netzwerk-Ezienz des Overlay-Netzwerks
17
4.1.
Zigzag -Struktur [Tran u. a. (2003b)]
31
6.1.
Berechnung des neuen Lokalitätsvektors.
7.1.
ekStream -Architektur
7.2.
Klassendiagram für die Routingklassen
. . . . . . . . . . . . . . . . . .
51
7.3.
Kennenlernen von Knoten C . . . . . . . . . . . . . . . . . . . . . . . .
59
8.1.
Graph über die Verbindungen der Autonomen Systeme
. . . . . . . . .
82
8.2.
Beträge dreier Beispiel-Lokalitätsvektoren
. . . . . . . . . . . . . . . .
88
8.3.
Abstände dreier Beispiel-Lokalitätsvektoren untereinander
. . . . . . .
89
8.4.
Lernrate der drei Beispielknoten . . . . . . . . . . . . . . . . . . . . . .
89
8.5.
Darstellung der Schwelle für die Einordnung der Knoten in den
terten
Horizont
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
43
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
50
erwei-
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2005-03-21/015/IN99/2253
90
99
Abbildungsverzeichnis
100
2005-03-21/015/IN99/2253
Tabellenverzeichnis
6.1.
Verwendete Variablen für die Lokalitätsberechnung
. . . . . . . . . . .
42
8.1.
Daten zu den Testknoten . . . . . . . . . . . . . . . . . . . . . . . . . .
83
8.2.
Auistung der Lokalitätsvektoren für die Abstände in Tabelle 8.3
. . .
86
8.3.
Abstände der Lokalitätsvektoren in der Tabelle 8.2
. . . . . . . . . . .
87
2005-03-21/015/IN99/2253
101
Tabellenverzeichnis
102
2005-03-21/015/IN99/2253
Abkürzungsverzeichnis
ADSL . . . . . . . . .
Asymmetric Digital Subscriber Line
CDN . . . . . . . . . .
Content Distribution Network
DFN . . . . . . . . . .
Deutsches Forschungsnetz
DHT . . . . . . . . . .
Distributed Hash Table
DoS . . . . . . . . . . .
Denial of Service
DVMRP . . . . . . . Distance Vector Multicast Routing Protocol
ESM . . . . . . . . . .
End System Multicast
GNP . . . . . . . . . .
Global Network Positioning
HBM . . . . . . . . . . Host-Based Multicast
LAN . . . . . . . . . .
Local Area Network
MDC . . . . . . . . . . Multiple Description Coding
NAT . . . . . . . . . .
Network Address Translator
P2P . . . . . . . . . . .
Peer-to-Peer
RTT . . . . . . . . . .
Round Trip Time
SAM . . . . . . . . . .
Service Adaptive Multicast
SDP . . . . . . . . . . . Session Description Protocol
TTL . . . . . . . . . . . Time To Live
2005-03-21/015/IN99/2253
103
Abkürzungsverzeichnis
104
2005-03-21/015/IN99/2253
Thesen
1. Kooperatives Multimedia-Streaming eignet sich gut für eine hohe Knotenanzahl,
da die ursprüngliche Quelle entlastet werden kann.
2. Lokalitätserhaltende Overlay-Netze sind ezient, da durch die bevorzugte Verwendung lokaler Knoten die Netzwerkressourcen geschont werden.
3. Die geographische Lokalität ist als Lokalitätskriterium nicht geeignet, da sie nicht
die Zusammenhänge im physikalischen Netzwerk berücksichtigt und schlecht bestimmt werden kann.
4. Latenzen sind für eine Lokalitätsbestimmung gut geeignet, da sie die tatsächlichen
Übertragungswege betrachten.
5. Anhand von Latenzmessungen sind die virtuellen Koordinaten gut berechenbar
und erreichen nach kurzer Zeit stabile Werte, die sich nur noch gering verändern
werden (mit Ausnahme von mobilen Netzen).
6. Durch die Benutzung virtueller Koordinaten ist die Bestimmung der Lokalität
ohne explizite Messung der Latenz möglich.
7. Für die Einteilung der Knoten in Horizonte sind dynamische Schwellen notwendig, da die Entfernungen zu anderen Knoten aus der Perspektive des jeweiligen
Knotens betrachtet werden.
8. Die Implementierung der einfachen Lokalisierung, die nur direkte Anfragen an alle
bekannten Knoten sendet, ist für kleine Knotenmengen ausreichend. Für gröÿere
Netze muss jedoch eine Suche implementiert werden.
2005-03-21/015/IN99/2253
105
Thesen
9. Ein dezentrales Routing benötigt kein vollständiges Wissen über das Netzwerk.
Somit kann es in einem dynamischen Peer-to-Peer-Netzwerk verwendet werden.
10. Mit dem implementierten dezentralen Routing wurden gute Rahmenbedingungen für das Multimedia-Streaming-System
ekStream
geschaen, da Knoten dy-
namisch gelernt werden und die Lokalität berücksichtigt wird. Es ist kein globales
Wissen über alle Knoten notwendig, sodass eine hohe Ausfallsicherheit erreicht
wird.
Ort
106
Datum
Unterschrift
2005-03-21/015/IN99/2253
Eidesstattliche Erklärung
Ich versichere an Eides statt, die von mir vorgelegte Arbeit selbstständig verfasst zu
haben. Alle Stellen, die wörtlich oder sinngemäÿ aus veröentlichten oder nicht veröffentlichten Arbeiten Anderer entnommen sind, habe ich kenntlich gemacht. Sämtliche
Quellen und Hilfsmittel, die ich für die Arbeit benutzt habe, sind angegeben. Die Arbeit
hat mit gleichem Inhalt bzw. in wesentlichen Teilen noch keiner anderen Prüfungsbehörde vorgelegen.
Ort
2005-03-21/015/IN99/2253
Datum
Unterschrift
107
Eidesstattliche Erklärung
108
2005-03-21/015/IN99/2253
A. Anhang
A.1. Übersicht über die Logdateien
uebersicht.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Log
| ID ( P :5000) | IP
| LogTime
-- ---- ---- ---- --|- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- --- ---- ---zazu . log1
| 0 x8d1833a4 | 141. 24. 32. 28 | 13:13:28 - 13:39:31
zazu . log2
| 0 x8d1833a4 | 141. 24. 32. 28 | 13:39:50 - 14:21:33
diana . log1
| 0 x8d1833b4 | 141. 24. 32. 44 | 13:23:59 - 14:22:56
diana . log2
| 0 x8d1833b4 | 141. 24. 32. 44 | 13:06:54 - 13:23:37
eris . log0
| 0 x8d1833e6 | 141. 24. 32. 94 | 13:25:13 - 13:50:52
eris . log1
| 0 x8d1833e6 | 141. 24. 32. 94 | 14:03:45 - 14:33:59
macheiss . log1
| 0 x8d1833a5 | 141. 24. 32. 29 | 13:21:57 - 13:47:21
macheiss . log2
| 0 x8d1833a5 | 141. 24. 32. 29 | 13:55:14 - 14:21:49
telpc1 . log1
| 0 x8d1833b9 | 141. 24. 32. 49 | 13:23:06 - 14:10:43
telpc1 . log2
| 0 x8d1833b9 | 141. 24. 32. 49 | 14:11:19 - 14:21:06
telpc2 . log1
| 0 x8d1833b0 | 141. 24. 32. 40 | 13:43:25 - 14:16:42
telpc2 . log2
| 0 x8d1833b0 | 141. 24. 32. 40 | 14:16:55 - 14:21:24
telpc3 . log1
| 0 x8d183456 | 141. 24. 32.206 | 13:18:58 - 14:21:34
telpc4 . log1
| 0 x8d183457 | 141. 24. 32.207 | 13:16:20 - 13:49:37
telpc4 . log2
| 0 x8d183457 | 141. 24. 32.207 | 13:54:18 - 14:21:02
vsbslab1 . log1
| 0 x8d183423 | 141. 24. 32.155 | 11:32:01 - 12:54:00
vsbslab1 . log2
| 0 x8d183423 | 141. 24. 32.155 | 12:55:34 - 14:27:56
vsbslab2 . log1
| 0 x8d183424 | 141. 24. 32.156 | 12:55:34 - 13:46:38
vsbslab2 . log2
| 0 x8d183424 | 141. 24. 32.156 | 13:55:43 - 14:27:14
vsbslab3 . log1
| 0 x8d183425 | 141. 24. 32.157 | 12:55:43 - 14:25:42
vsbslab4 . log1
| 0 x8d183426 | 141. 24. 32.158 | 12:55:33 - 14:23:34
vsbslab5 . log1
| 0 x8d183427 | 141. 24. 32.159 | 12:55:26 - 14:22:54
vsbslab6 . log1
| 0 x8d183428 | 141. 24. 32.160 | 12:55:24 - 14:22:49
|
|
|
Andreas . log1
| 0 x550ad4db | 85. 10.193. 83 | 12:55:29 - 14:52:24
Christian . log1 | - ---- ---- --| --------------- | 12:44:08 - 14:40:00
ilmhost . log0
| 0 xd58577d6 | 213.133.100. 78 | 11:50:23 - 13:46:17
ilmhost . log1
| 0 xd58577d6 | 213.133.100. 78 | 13:59:09 - 14:29:59
Kristian . log1
| 0 xc0a81692 | 213. 54.227.229 | 12:07:33 - 14:42:30
orion . log1
| 0 xc19e7c71 | 193.158.104.233 | 12:57:56 - 14:29:58
slipstream . log1 | 0 x50ede194 | 80.237.206. 12 | 12:23:26 - 14:18:37
starburst . log1 | 0 xd9739e45 | 217.115.138.189 | 12:49:45 - 14:44:59
wotan . log1
| 0 xc07d0bb7 | 192.124.248. 47 | 13:53:42 - 15:25:33
|
|
|
|
|
|
telpc7
| 0 x8d183480 | 141. 24. 32.248 | ------------------jason
| 0 x8d183415 | 141. 24. 32.141 | ------------------|
|
|
2005-03-21/015/IN99/2253
109
A. Anhang
A.2. Datendatei für die Skripte
lesdata.dat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# filename
floh1zazu . log1 . clean
floh1zazu . log2 . clean
floh1diana . log1 . clean
floh1diana . log2 . clean
floh1eris . log0 . clean
floh1telpc1 . log1 . clean
floh1telpc1 . log2 . clean
floh1telpc2 . log1 . clean
floh1telpc2 . log2 . clean
floh1telpc4 . log1 . clean
floh1vsbslab1 . log1 . clean
floh1vsbslab1 . log2 . clean
floh1vsbslab2 . log1 . clean
floh1vsbslab2 . log2 . clean
floh1vsbslab3 . log1 . clean
floh1vsbslab4 . log1 . clean
floh1vsbslab5 . log1 . clean
floh1vsbslab6 . log1 . clean
floh1Andreas . log1 . clean
floh1ilmhost . log0 . clean
floh1ilmhost . log1 . clean
floh1Kristian . log1 . clean
floh1orion . log1 . clean
floh1slipstream . log1 . clean
floh1starburst . log1 . clean
floh1wotan . log1 . clean
# floh1eris . log1 . clean
# floh1macheiss . log1 . clean
# floh1macheiss . log2 . clean
# floh1telpc3 . log1 . clean
# floh1telpc4 . log2 . clean
# nodeid
0 x8d1833a4
0 x8d1833a5
0 x8d1833b4
0 x8d1833e6
0 x8d183415
0 x8d1833b9
0 x8d1833b0
0 x8d183456
0 x8d183457
0 x8d183480
0 x8d183423
0 x8d183424
0 x8d183425
0 x8d183426
0 x8d183427
0 x8d183428
0 x550ad4db
0 xd58577d6
0 xc0a81692
0 xc19e7c71
0 x50ede194
0 xd9739e45
0 xc07d0bb7
0 x8d18341d
110
shortname
zazu
zazu
dian
dian
eris
tel1
tel1
tel2
tel2
tel4
vsb1
vsb1
vsb2
vsb2
vsb3
vsb4
vsb5
vsb6
xAnd
xIlm
xIlm
xKri
xOri
xSli
xSta
xWot
eris
mach
mach
tel3
tel4
nodeid
0 x8d1833a4
0 x8d1833a4
0 x8d1833b4
0 x8d1833b4
0 x8d1833e6
0 x8d1833b9
0 x8d1833b9
0 x8d1833b0
0 x8d1833b0
0 x8d183457
0 x8d183423
0 x8d183423
0 x8d183424
0 x8d183424
0 x8d183425
0 x8d183426
0 x8d183427
0 x8d183428
0 x550ad4db
0 xd58577d6
0 xd58577d6
0 xc0a81692
0 xc19e7c71
0 x50ede194
0 xd9739e45
0 xc07d0bb7
0 x8d1833e6
0 x8d1833a5
0 x8d1833a5
0 x8d183456
0 x8d183457
timedrift
3338 w3338
3338 w3338
3977 w3977 -3978
3977 w3977 -3978
3093 w3093 -3094
3348 w3349
3348 w3347 -3348
3342 w3343 -3342
3342 w3340 -3343
3349 w3349 -3350
3349 # old !
3349 w3348 -3349
3349 w3349 -3350
3349 w3350 -3349
3349 w3349
3349 w3349
3349 w3349
3349 w3349 -3350
3353 w3353 -3354
3363 w3363 -3364
3363 w3364 -3363
3346 w3346 -3347
3338 w3338 -3339
4617 w4617 -4618
3036 w3036
0
w0
0
0
0
0
0
-
no
no
no
no
no
other nodes
routingmessages
routingmessages
routingmessages
other nodes
shortname
zazu
mach
dian
eris
jaso
tel1
tel2
tel3
tel4
tel7
vsb1
vsb2
vsb3
vsb4
vsb5
vsb6
xAnd
xIlm
xKri
xOri
xSli
xSta
xWot
ult5 # ultra5 -5. prakinf ...
2005-03-21/015/IN99/2253
A.3. Perlskript zum sortierten Zusammenfügen zweier Logdateien
A.3. Perlskript zum sortierten Zusammenfügen
zweier Logdateien
makeDiLog.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# !/ usr / bin / perl -w
# ##########################################################
#
# Can be used as an utility for syncronizing two files
#
# Read the data of two log files containing time fields .
# For the data of the second file a delta will be added
# before the sorted data of both files will be printed
# to stdout .
# Needed some data of the ' filesdata . dat '.
#
# ( w ) Thomas Sesselmann
#
# ###
my
my
my
my
$file1 = s h i f t ;
$file2 = s h i f t ;
$timedrift = s h i f t ;
$database = " filesdata . dat ";
p r i n t f "\ nSkript started .\ n" ;
i f (! d e f i n e d $file2 ) { d i e " Error : Usage :
synclogs . pl file1 file2 [ timedrift ]\ n" ; };
i f (! d e f i n e d $timedrift ) { $timedrift = 0; };
# # read data of file : filename shortname nodeid timedrift
my @database =() ;
open ( DATA , " < $database ") || d i e " Error : File ' $database ' not readable .\ n" ;
w h i l e (< DATA >) {
$_ =~ s /\ # .* $ //;
i f ( $_ =~ /^(\ S +) \ s +(\ S +) \ s +(0 x [0 -9a -f ]{8}) \ s +(\ d +) /) {
push @database , { filename => $1 , shortname = > $2 , nodeid => $3 , timedrift => $4 };
}
}
c l o s e DATA ;
# # important data
my % file2shortname ;
my % id2shortname ;
f o r e a c h ( @database ) {
i f ($_ - >{ filename } eq $file1 ) {
$file2shortname { $file1 }= $_ - >{ shortname };
$id2shortname {$_ - >{ nodeid }}= $_ - >{ shortname };
}
i f ($_ - >{ filename } eq $file2 ) {
$file2shortname { $file2 }= $_ - >{ shortname };
$id2shortname {$_ - >{ nodeid }}= $_ - >{ shortname };
}
}
##
my
my
my
my
read files
$time1 = -1;
$time2 = -1;
$line_f1 ;
$line_f2 ;
2005-03-21/015/IN99/2253
111
A. Anhang
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
open ( FILE1 ," < $file1 " ) || d i e " Error : File ' $file1 ' not readable .\ n ";
open ( FILE2 ," < $file2 " ) || d i e " Error : File ' $file2 ' not readable .\ n ";
w h i l e (! ( e o f ( FILE1 ) || e o f ( FILE2 ) ) ) {
i f ( $time1 < 0) {
$line_f1 = < FILE1 >;
$time1 = & readtime ( $line_f1 , 0) ;
next ;
}
i f ( $time2 < 0) {
$line_f2 = < FILE2 >;
$time2 = & readtime ( $line_f2 , $timedrift );
next ;
}
i f ( $time1 <= $time2 ) {
& outputline ( $file1 , $time1 , $line_f1 ) ;
$time1 = -1;
} else {
& outputline ( $file2 , $time2 , $line_f2 ) ;
$time2 = -1;
}
}
w h i l e (< FILE1 >) {
$time1 = & readtime ($_ , 0) ;
& outputline ( $file1 , $time1 , $_ );
}
w h i l e (< FILE2 >) {
$time2 = & readtime ($_ , $timedrift );
& outputline ( $file2 , $time2 , $_ );
}
c l o s e FILE2 ;
c l o s e FILE1 ;
p r i n t f ("\ n\ nSkript stopped .\ n \n" );
# ############################################
sub readtime ( $$ ) { # line , drift
my $line = s h i f t ;
my $drift = s h i f t ;
my $time = -1;
i f ( $line =~ /^(\ d {2}) :(\ d {2}) :(\ d {2}) /) {
$time = $1 *3600 + $2 *60 + $3 + $drift ;
}
r e t u r n $time ;
}
sub outputline ( $$$ ) { # file , time , line
my $file = s h i f t ;
my $time = s h i f t ;
my $line = s h i f t ;
i f ( $line =~ / LocalityRouting .*\[ Vector : Id : (0 x [0 -9a -f ]{8}) , Data : ([0 -9. -]+) , ([0 -9. -]+) , ([0 -9. -]+) , ([0 -9. -]+)
, ([0 -9. -]+) \]/) {
i f ( e x i s t s $id2shortname { $1 }) {
i f ( $id2shortname { $1 } eq $file2shortname { $file }) {
p r i n t f "%s : %5 u ---- %15.8 f %15.8 f %15.8 f %15.8 f %15.8 f \n" ,
$file2shortname { $file }, $time , $2 , $3 , $4 , $5 , $6 ;
} else {
112
2005-03-21/015/IN99/2253
A.4. Perlskript zum Erzeugen der Dierenz zwischen zwei Logdateien
129
p r i n t f "% s: %5 u %s %15.8 f %15.8 f %15.8 f %15.8 f %15.8 f \ n" ,
130
$file2shortname { $file }, $time , $id2shortname { $1 }, $2 , $3 , $4 , $5 , $6 ;
131
}
132
}
133
}
134
135 }
136
137
138
139 __END__
140
141
A.4. Perlskript zum Erzeugen der Dierenz zwischen
zwei Logdateien
searchSyncTime.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# !/ usr / bin / perl -w
# ####################################################
#
# This script tries to find a time for which the
# two files can be synchronized .
#
# A locality vector has to be calculated for this
# node before the other node had received it .
#
# ( w ) Thomas Sesselmann
#
# ###
my $file = s h i f t ;
my $own = " ----" ;
my
my
my
my
my
my
@data1other ;
@data1own ;
@data2other ;
@data2own ;
$name1 ="" ;
$name2 ="" ;
# readdata
my $fd ;
i f ( d e f i n e d $file ) {
open ( $fd , " < $file ") || d i e " Error : Can 't open file ' $file '\n ";
} else {
$fd = STDIN
}
w h i l e (< $fd >) {
i f ( $_ =~ /(\ w {4}) :\ s +(\ d +) \ s +(\ S {4}) \ s +([0 -9. -]+) \ s +([0 -9. -]+) \ s +([0 -9. -]+) \ s +([0 -9. -]+) \ s +([0 -9. -]+) /) {
i f ( $name1 eq "" ){
$name1 = $1 ;
}
i f ( $1 eq $name1 ) {
i f ( $3 eq $own ){
push @data1own , [$2 ,$4 ,$5 , $6 ,$7 , $8 ]; # time , d1 , d2 , d3 , d4 , d5
} else {
push @data1other , [$2 , $4 ,$5 ,$6 ,$7 , $8 ]; # time , d1 , d2 , d3 , d4 , d5
}
next ;
2005-03-21/015/IN99/2253
113
A. Anhang
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
}
i f ( $name2 eq "" ){
$name2 = $1 ;
}
i f ( $1 eq $name2 ) {
i f ( $3 eq $own ){
push @data2own , [$2 ,$4 ,$5 , $6 ,$7 , $8 ]; # time , d1 , d2 , d3 , d4 , d5
} else {
push @data2other , [$2 , $4 ,$5 ,$6 ,$7 , $8 ]; # time , d1 , d2 , d3 , d4 , d5
}
next ;
}
}
}
c l o s e $fd ;
# comparing1
my $diff ;
my $td_min1 = 3600*24;
my $td_min2 = $td_min1 ;
my $td_max1 = - $td_min1 ;
my $td_max2 = $td_max1 ;
f o r e a c h $a ( @data1own ){
# $i => [ time , d1 , d2 , d3 , d4 , d5 ]
f o r e a c h $b ( @data2other ){
i f (( $a - >[1] == $b - >[1]) &&( $a - >[2] == $b - >[2]) &&( $a - >[3] == $b - >[3])
&&( $a - >[4] == $b - >[4]) &&( $a - >[5] == $b - >[5]) ){
$diff = $a - >[0] - $b - >[0];
i f ( $td_min1 > $diff ) { $td_min1 = $diff ;}
i f ( $td_max1 < $diff ) { $td_max1 = $diff ;}
}
}
}
printf
printf
printf
printf
" Name1 :
" Name2 :
" Minimal Diff 1 - >2:
" Maximal Diff 1 - >2:
' $name1 '\n" ;
' $name2 '\n" ;
' $td_min1 '\n" ;
' $td_max1 '\n" ;
# comparing2
f o r e a c h $b ( @data2own ){
# $i => [ time , d1 , d2 , d3 , d4 , d5 ]
f o r e a c h $a ( @data1other ){
i f (( $a - >[1] == $b - >[1]) &&( $a - >[2] == $b - >[2]) &&( $a - >[3] == $b - >[3])
&&( $a - >[4] == $b - >[4]) &&( $a - >[5] == $b - >[5]) ){
$diff = $a - >[0] - $b - >[0];
i f ( $td_min2 > $diff ) { $td_min2 = $diff ;}
i f ( $td_max2 < $diff ) { $td_max2 = $diff ;}
}
}
}
printf
printf
printf
printf
" Minimal
" Maximal
" Minimal
" Maximal
Diff
Diff
Diff
Diff
2 - >1:
2 - >1:
sum :
sum :
' $td_min2 '\n" ;
' $td_max2 '\n" ;
'%d '\ n" , $td_max1 < $td_max2 ? $td_max1 : $td_max2 ;
'%d '\ n" , $td_min1 > $td_min2 ? $td_min1 : $td_min2 ;
__END__
114
2005-03-21/015/IN99/2253
A.5. Perlskript zum sortierten Zusammenfügen aller Logdateien
A.5. Perlskript zum sortierten Zusammenfügen aller
Logdateien
makeOneLog.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# !/ usr / bin / perl -w
# #######################################################
#
# This script synchronizes all log files of ' filedata . dat '
# by a given delta and put it in one file .
#
# ( w ) Thomas Sesselmann
#
# ###
my $database = " filesdata . dat ";
my $outfile = " floh1all . log " ;
p r i n t f "\ nSkript started .\ n" ;
# # read data of file : filename shortname nodeid timedrift
my @data =() ;
my % ids ;
open ( DATA , " < $database ") || d i e " Error : File ' $database ' not readable .\ n" ;
w h i l e (< DATA >) {
$_ =~ s /\ # .* $ //;
i f ( $_ =~ /^(\ S +) \ s +(\ S +) \ s +(0 x [0 -9a -f ]{8}) \ s +(\ d +) /) {
my $fd ;
i f (! -f $1 ) { next ; }
push @data , { file = >$1 , fd = > $fd , shortname =>$2 , nodeid =>$3 , timedrift =>$4 , time = > -1};
}
i f ( $_ =~ /^(0 x [0 -9 a - f ]{8}) \ s +(\ w {4}) /) {
$ids { $1 }= $2 ;
}
}
c l o s e DATA ;
# # open files
f o r e a c h $en ( @data ) {
open ( $en - >{ fd } ," <$en - >{ file }" );
}
open ( OUTFILE , " > $outfile ");
# # read
my $run = 1;
my $fd ;
my $processtime = 0;
my $lines = 0;
w h i l e ( $run ) {
# read one line of all files and test $run
$run = 0;
f o r e a c h $en ( @data ){
$fd = $en - >{ fd };
i f (! e o f ( $fd )){
$run = 1;
i f ( $en - >{ time } < 0) {
$en - >{ line } = <$fd >;
2005-03-21/015/IN99/2253
115
A. Anhang
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
$en - >{ time } = & readtime ( $en - >{ line } , $en - >{ timedrift }) ;
}
}
}
# select first line for output
my $t_min = 3600*24;
my $dataentry ;
f o r (my $i = 0; $i < @data ; $i ++) {
i f ((%{ $data [ $i ]} - >{ time } > 0) &&( $t_min > %{ $data [ $i ]} - >{ time }) ) {
$dataentry = $data [ $i ];
$t_min = $dataentry - >{ time };
}
}
# output
& outputline ( $dataentry );
$lines ++;
i f ( $lines %1000 == 0) {
# if ( $processtime +100 < $dataentry - >{ time }) {
$processtime = $dataentry - >{ time };
p r i n t f " ProcessTime : %5 d now . Processing %10 d lines .\ n" , $processtime , $lines ;
}
$dataentry - >{ time }= -1;
}
## close files
f o r e a c h $en ( @data ) {
c l o s e $en - >{ fd };
}
c l o s e OUTFILE ;
p r i n t f ("\ n\ nSkript stopped .\ n \n" );
# ###########################################
sub readtime ( $$ ) { # line , drift
my $line = s h i f t ;
my $drift = s h i f t ;
my $time = -1;
i f ( $line =~ /^(\ d {2}) :(\ d {2}) :(\ d {2}) /) {
$time = $1 *3600 + $2 *60 + $3 + $drift ;
}
r e t u r n $time ;
}
sub outputline ($ ) { # file , time , line
my $entry = s h i f t ;
#
#
#
#
#
#
$time
$time
$time
$time
$time
$time
$name :
$name :
$name :
$name :
$name :
$name :
calcVector
rem_Vector
update_LR_
started_to
threashold
knownNodes
$vector failure : $failure distance : $distance
$remname $vector
$learnrate
$name
local : $1 extended : $2 updatetime : $3
sum : $1 local : $2 extended : $3 global : $4
# ownvector
i f ( $entry - >{ line } =~ / LocalityRouting .* calculated : \[ Vector : Id :
([0 -9. -]+) , ([0 -9. -]+) , ([0 -9. -]+) \] failure was ([0 -9. -]+)
p r i n t f OUTFILE " %6 d % s: calcVector
%15.8 f %15.8 f %15.8 f
$entry - >{ time }, $entry - >{ shortname } , $1 , $2 , $3 , $4 , $5 , $6 ,
}
0 x [0 -9a -f ]{8} , Data : ([0 -9. -]+) , ([0 -9. -]+) ,
by distance : ([0 -9. -]+) /) {
%15.8 f %15.8 f failure : %8.2 f distance %8.2 f\ n" ,
$7 ;
# remVector
116
2005-03-21/015/IN99/2253
A.6. Perlskript zum Teilen der kompletten Logdatei
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
i f ( $entry - >{ line } =~ / LocalityRouting .* New LocalityVector \[ Vector : Id : (0 x [0 -9a -f ]{8}) , Data : ([0 -9. -]+) ,
([0 -9. -]+) , ([0 -9. -]+) , ([0 -9. -]+) , ([0 -9. -]+) \]/) {
my $remName = " ----" ;
i f ( e x i s t s $ids { $1 }) { $remName = $ids { $1 }; }
e l s e { p r i n t f " debug >$1 <\ n" ;} # DEBUG
p r i n t f OUTFILE " %6 d % s: rem_Vector %s %15.8 f %15.8 f %15.8 f %15.8 f %15.8 f \n" ,
$entry - >{ time }, $entry - >{ shortname } , $remName , $2 , $3 , $4 , $5 , $6 ;
}
# learnrate
i f ( $entry - >{ line } =~ / LocalityRouting .* Update learn rate to : ([0 -9.]+) /) {
p r i n t f OUTFILE " %6 d % s: update_LR_ %4.2 f\n" ,
$entry - >{ time }, $entry - >{ shortname } , $1 ;
}
# started
i f ( $entry - >{ line } =~ / LocalityRouting .* Bootstrap to address (.*) /) {
p r i n t f OUTFILE " %6 d % s: started_to %s\n " ,
$entry - >{ time }, $entry - >{ shortname } , $1 ;
}
# threshold
i f ( $entry - >{ line } =~ / LocalityRouting .* Threashold_local : (\ d +) Threashold_extened : (\ d +) LOCALITY_UPDATE_TIME : (\
d +) /) {
p r i n t f OUTFILE " %6 d % s: threashold local : %4 d extended : %4 d updatetime : %4 d \n" ,
$entry - >{ time }, $entry - >{ shortname } , $1 , $2 , $3 ;
}
# knownnodes
i f ( $entry - >{ line } =~ / LocalityRouting .* SumNodes : (\ d +) localNodes : (\ d +) extendedNodes : (\ d +) globalNodes : (\ d +)
/) {
p r i n t f OUTFILE " %6 d % s: knownNodes sum : %2 d local : %2 d extended : %2 d global : %2 d\ n" ,
$entry - >{ time }, $entry - >{ shortname } , $1 , $2 , $3 , $4 ;
}
157
158
159
160
161 }
162
163 __END__
A.6. Perlskript zum Teilen der kompletten Logdatei
splitOneLog.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# !/ usr / bin / perl -w
# #################################################
#
# This script splits the generated log file for
# different kinds :
# - each host in a separately file
# - each type of log entry in separately file
# - combining host and types ...
#
# ( w ) Thomas Sesselmann
#
# ###
my $inputfile = s h i f t ;
i f (! d e f i n e d $inputfile ) { d i e " Error : No file specified .\ n" ; }
my % hosts ;
$hosts { alle }=1;
my % typs ;
2005-03-21/015/IN99/2253
117
A. Anhang
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
$typs { alle }=1;
$ |=1;
# flush
# find hosts and types
open ( FILE , " < $inputfile ") || d i e " Error : Can 't open file ' $inputfile '!\ n" ;
w h i l e (< FILE >) {
i f ( $_ =~ /^\ s *\ d +\ s +(\ w {4}) :\ s +(\ S {10}) \ s /) {
i f (! e x i s t s $hosts { $1 }) {
$hosts { $1 }=1;
}
i f (! e x i s t s $typs { $2 }) {
$typs { $2 }=1;
}
}
}
c l o s e FILE ;
# write hosts and types
f o r e a c h $host ( keys % hosts ) {
f o r e a c h $typ ( keys % typs ) {
open ( IFILE , " < $inputfile ");
i f ( $typ eq " alle " ){
p r i n t f " Write file ' $inputfile . $host ' ... " ;
open ( OFILE , " > $inputfile . $host ");
} else {
p r i n t f " Write file ' $inputfile . $host \ _$typ ' ... ";
open ( OFILE , " > $inputfile . $host \ _$typ " );
}
w h i l e (< IFILE >) {
i f ( $_ =~ /^\ s *\ d +\ s +(\ w {4}) :\ s +(\ S {10}) \ s /) {
i f ((( $1 eq $host ) ||( $host eq " alle " ))
&&(( $2 eq $typ ) ||( $typ eq " alle " )) ){
p r i n t f OFILE " $_ ";
}
}
}
c l o s e OFILE ;
c l o s e IFILE ;
p r i n t f " done .\ n" ;
}
}
A.7. Perlskript zum Berechnen der Abstände vieler
Vektoren in einer Datei
calc.pl
1
2
3
4
5
6
7
8
# !/ usr / bin / perl -w
# #############################################
#
# Calculates all distances between the given
# vectors in the file .#
#
# ( w ) Thomas Sesselmann
118
2005-03-21/015/IN99/2253
A.8. Perlskript zum Berechnen der Abstände zweier Knoten zu jedem Zeitpunkt
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#
# ###
my $file = s h i f t ;
i f (! d e f i n e d $file ) { d i e " Error : No file specified .\ n" ; }
my % vectors ;
# read vectors
open ( FILE , " < $file ");
w h i l e (< FILE >) {
i f ( $_ =~ /^\ s *\ d +\ s +(\ w {4}) :\ s + calcVector \ s +([0 -9. -]+) \ s +([0 -9. -]+) \ s +([0 -9. -]+) \ s +([0 -9. -]+) \ s +([0 -9. -]+) \ s +/) {
$vectors { $1 } = [$2 , $3 ,$4 ,$5 , $6 ];
}
}
c l o s e FILE ;
# calculate distances
f o r e a c h $key1 ( keys % vectors ) {
my $vec1 = $vectors { $key1 };
f o r e a c h $key2 ( keys % vectors ) {
my $vec2 = $vectors { $key2 };
my $dist = 0;
f o r (my $i = 0; $i < 5; $i ++) {
$dist += (( $vec1 - >[ $i ]) - ( $vec2 - >[ $i ]) ) **2;
}
$dist = s q r t ( $dist );
p r i n t f " Distance from '%s ' to '% s ' is '%12.8 f '\n " ,
$key1 , $key2 , $dist ;
}
}
__END__
A.8. Perlskript zum Berechnen der Abstände zweier
Knoten zu jedem Zeitpunkt
calcDist2.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# !/ usr / bin / perl -w
# ##############################################
#
# This script calculates the distance between
# the two given hosts any time one vector was
# changed and print the list to the stdout .
#
# If the second host isn 't given , the distance
# will be calculated to the constant null vector .
#
# ( w ) Thomas Sesselmann
#
# ###
my $file = " floh1all . log . org " ;
my $name1 = s h i f t ;
my $name2 = s h i f t ;
i f (! d e f i n e d $name1 ) {
d i e " Usage : calcDist2 . pl < name1 > [ < name2 >]\ n" ;
}
2005-03-21/015/IN99/2253
119
A. Anhang
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
my @vec1 ;
my @vec2 ;
i f (! d e f i n e d $name2 ) {
$name2 = " blablub " ;
@vec2 = (0 ,0 ,0 ,0 ,0) ;
}
p r i n t f "# Distance from ' $name1 ' to ' $name2 '\n" ;
p r i n t f " plot '-' us 1:3\ n";
open ( FILE , " < $file ");
w h i l e (< FILE >) {
i f ( $_ =~ /\ s *(\ d +) \ s +(\ w {4}) :\ s + calcVector \ s +([0 -9. -]+) \ s +([0 -9. -]+) \ s +([0 -9. -]+) \ s +([0 -9. -]+) \ s +([0 -9. -]+) \ s /) {
i f ( $2 eq $name1 ) {
@vec1 = ($3 , $4 , $5 , $6 , $7 );
}
i f ( $2 eq $name2 ) {
@vec2 = ($3 , $4 , $5 , $6 , $7 );
}
i f ((( $2 eq $name1 ) ||( $2 eq $name2 )) &&( @vec1 == 5) &&( @vec2 == 5) ) {
my $dist = 0;
f o r (my $i = 0; $i < 5; $i ++) {
$dist += ( $vec1 [ $i ] - $vec2 [ $i ]) **2;
}
$dist = s q r t ( $dist );
# printf "%5 d distance '% s ' to '% s ' is %6.4 f \ n ", $1 , $name1 , $name2 , $dist ;
p r i n t f " %5 d distance : %8.4 f\n " , $1 , $dist ;
}
}
}
c l o s e FILE ;
A.9. Ausschnitt aus einer Logdatei
Hier ein kleiner Ausschnitt aus der Logdatei vom Knoten wotan. Die Leerzeilen stehen
für viele weggelassene Zeilen.
oh1wotan.log1
1
2
3
4
5
6
7
8
9
10
11
12
13
13:53:42
13:53:42
13:53:42
13:53:42
13:53:42
13:53:42
LocalityRouting { main }: DEBUG : Routing : Adding handler : [ Looper : Routing , Thread [ Routingthread ,5 , main ]]
LocalityRouting { main }: DEBUG : Starting : [ Looper : Routing , Thread [ Routingthread ,5 , main ]]
LocalityRouting { Routingthread }: DEBUG : Start RoutingThread ...
LocalityRouting { main }: DEBUG : Start bootstrap .
LocalityRouting { main }: DEBUG : Bootstrap to address zazu . prakinf .tu - ilmenau . de /141.24.32.28:5000
UpdateThread { RoutingUpdateThread }: DEBUG : Start RoutingUpdateThread ...
13:53:47 SimpleNetLocalisation { NetLocalisation_UpdateThread }: ERROR : Catch NoSuchElementException from Buffer .
Ignore all new BufferData !
13:53:47 NodeProxy { Prototype 3 ekStream Applicationthread }: DEBUG : Routing message to :0 x8d183424
13:53:47 LocalityRouting { Prototype 3 ekStream Applicationthread }: DEBUG : Send TransportBag to Node 0 x8d183424 with
address /141.24.32.156:5000 and TTL 16
13:53:47 NodeProxy { Prototype 3 ekStream Applicationthread }: DEBUG : Routing message to :0 x8d183427
13:53:47 LocalityRouting { Prototype 3 ekStream Applicationthread }: DEBUG : Send TransportBag to Node 0 x8d183427 with
address /141.24.32.159:5000 and TTL 16
14
15
16 13:53:49 LocalityRouting { DatagramSocketOutlet_ReceiverThread }: DEBUG : Received TransportBag from Node 0 x8d183424
for 0 xc07d0bb7 with TTL 16
17 13:53:49 LocalityRouting { DatagramSocketOutlet_ReceiverThread }: DEBUG : Received a GetBWAddressMessage from node 0
x8d183424
120
2005-03-21/015/IN99/2253
A.9. Ausschnitt aus einer Logdatei
18 13:53:49 LocalityRouting { DatagramSocketOutlet_ReceiverThread }: DEBUG : Send TransportBag to Node 0 x8d183424 with
address /141.24.32.156:5000 and TTL 16
19 13:53:49 LocalityRouting { DatagramSocketOutlet_ReceiverThread }: DEBUG : Received TransportBag from Node 0 x8d18341d
for 0 xc07d0bb7 with TTL 16
20 13:53:49 LocalityRouting { DatagramSocketOutlet_ReceiverThread }: DEBUG : Forward Message to localNode .
21 13:53:49 LocalityRouting { DatagramSocketOutlet_ReceiverThread }: DEBUG : Target for incoming message : org . ekstream .
peer . messaging . Messenger@126f75b
22
23
24 13:53:52 LocalityRouting { RoutingUpdateThread }: DEBUG : Send TransportBag to Node 0 xc0a81692 with address
/213.54.227.229:5000 and TTL 16
25 13:53:52 LocalityRouting { RoutingUpdateThread }: DEBUG : Send TransportBag to Node 0 x8d183425 with address
/141.24.32.157:5000 and TTL 16
26 13:53:52 LocalityRouting { RoutingUpdateThread }: DEBUG : Send TransportBag to Node 0 x8d183424 with address
/141.24.32.156:5000 and TTL 16
27 13:53:52 LocalityRouting { RoutingUpdateThread }: DEBUG :
:/141.24.32.155:5000
28 13:53:52 LocalityRouting { RoutingUpdateThread }: DEBUG :
:/85.10.193.83:5000
29 13:53:52 LocalityRouting { RoutingUpdateThread }: DEBUG :
:/141.24.32.149:5000
RoutingTableEntry : 0 x8d183423 with address
RoutingTableEntry : 0 x550ad4db with address
RoutingTableEntry : 0 x8d18341d with address
30
31
32 13:53:53 LocalityRouting { DatagramSocketOutlet_ReceiverThread }: DEBUG : Received a ReceivedLocalityMessage from node
0 x8d183423
33 13:53:53 LocalityRouting { DatagramSocketOutlet_ReceiverThread }: DEBUG : New LocalityVector [ Vector : Id : 0 x8d183423 ,
Data : -42.03432219466149 , -15.67420793168601 , -50.581044849873834 , -2.844919892272732 , 36.76725785387105]
34 13:53:53 LocalityRouting { DatagramSocketOutlet_ReceiverThread }: DEBUG : Received TransportBag from Node 0 x8d183423
for 0 xc07d0bb7 with TTL 16
35 13:53:53 LocalityRouting { DatagramSocketOutlet_ReceiverThread }: DEBUG : Received a ReceivedBWAddressMessage from
node 0 x8d183423
36 13:53:53 LocalityRouting { DatagramSocketOutlet_ReceiverThread }: DEBUG : Received TransportBag from Node 0 x550ad4db
for 0 xc07d0bb7 with TTL 16
37 13:53:53 LocalityRouting { DatagramSocketOutlet_ReceiverThread }: DEBUG : Received a ReceivedLocalityMessage from node
0 x550ad4db
38 13:53:53 LocalityRouting { DatagramSocketOutlet_ReceiverThread }: DEBUG : New LocalityVector [ Vector : Id : 0 x550ad4db ,
Data : -40.03381088945788 , -15.263857885711674 , -44.4197838825483 , -6.370769219266864 , 30.34402236002108]
39 13:53:53 LocalityRouting { DatagramSocketOutlet_ReceiverThread }: DEBUG : Received TransportBag from Node 0 x8d18341d
for 0 xc07d0bb7 with TTL 16
40 13:53:53 LocalityRouting { DatagramSocketOutlet_ReceiverThread }: DEBUG : Received a ReceivedLocalityMessage from node
0 x8d18341d
41 13:53:53 LocalityRouting { DatagramSocketOutlet_ReceiverThread }: DEBUG : New LocalityVector [ Vector : Id : 0 x8d18341d ,
Data : -41.84716366691346 , -38.743675099701974 , -7.135595621997649 , -1.621440570720185 , 6.684067342929131]
42 13:53:53 LocalityRouting { DatagramSocketOutlet_ReceiverThread }: DEBUG : Received TransportBag from Node 0 x8d183428
for 0 xc07d0bb7 with TTL 16
43
44
45 13:54:20 LocalityRouting { Thread -2}: DEBUG : Routing : posted : [ EchoResult : , dst : telpc1 . prakinf .tu - ilmenau . de
/141.24.32.49:5002 , echos : 5, rtt : 2.856]
46 13:54:20 LocalityRouting { Thread -2}: DEBUG : Routing : posted : [ EchoResult : , dst : ultra5 -5/141.24.32.149:5002 , echos :
5, rtt : 2.8704000000000005]
47
48
49 13:54:20 LocalityRouting { Routingthread }: DEBUG : [ Looper : Routing , Thread [ Routingthread ,5 , main ], alive ] dispatching
50
51
52
: [ EchoResult : , dst : telpc1 . prakinf .tu - ilmenau . de /141.24.32.49:5002 , echos : 5, rtt : 2.856] to : [ Looper :
Routing , Thread [ Routingthread ,5 , main ], alive ]
13:54:20 LocalityRouting { Routingthread }: DEBUG : Received EchoResultMessage : nodeId : 0 x8d1833b9 RTT : 2.0
13:54:20 LocalityVector { Routingthread }: DEBUG : New LocalityVector calculated : [ Vector : Id : 0 xc07d0bb7 , Data :
5.262633320022353 , 103.15207738080089 , 71.20001786980765 , 171.57642593856121 , 25.263040277251456] failure was :
346.58465060732937 by distance : 348.58465060732937!
13:54:20 LocalityRouting { Routingthread }: DEBUG : New LocalLocalityVector calculated : [ Vector : Id : 0 xc07d0bb7 , Data :
5.262633320022353 , 103.15207738080089 , 71.20001786980765 , 171.57642593856121 , 25.263040277251456] failure was
346.58465060732937 by distance : 348.58465060732937
13:54:20 LocalityRouting { Routingthread }: DEBUG : Update learn rate to : 0.3
53
54
55
56 13:54:23 LocalityRouting { RoutingUpdateThread }: DEBUG : SumNodes : 15 localNodes : 9 extendedNodes : 6 globalNodes : 0
57 13:54:23 LocalityRouting { RoutingUpdateThread }: DEBUG : Threashold_local : 45 Threashold_extened : 180
LOCALITY_UPDATE_TIME : 2700
2005-03-21/015/IN99/2253
121
A. Anhang
A.10. Vorgehen zum Ausführen eines Tests
Auf den Knoten, die zum lokalem Test verwendet wurden, ist
Debian 3.1 1 (sarge ) in-
stalliert (Auf den externen Knoten für den deutschlandweiten Test ist das Betriebssystem nicht bekannt.). Die Implementierung der Quelltexte von
2
(Version 1.4) mit Hilfe der Entwicklungsumgebung Eclipse
ekStream erfolgte in Java
3.1. Im Folgenden werden
die einzelnen Schritte für die Ausführung der Testdateien von
ekStream
erläutert.
A.10.1. Herunterladen des Projekts
Als Versionsverwaltungssystem für das Projekt
ekStream wurde Subversion3 verwendet.
Die Benutzung von Subversion kann entweder in der Kommandozeile oder über das
Subclipse 4 (Version 0.9.28) geschehen.
Projektes ist über einen Checkout erhältlich:
Eclipse-Plugin
Eine aktuelle Arbeitskopie des
user@telpc2:~$ svn checkout svn://ekstream.org/ekStream/trunk/ekStream
Die Aktualisierung der Arbeitskopie kann folgendermaÿen vorgenommen werden:
user@telpc2:~$ svn update ekStream
A.10.2. Kompilieren der Testdateien
In dem Verzeichnis
ekStream/tests/org/ekstream/test
des heruntergeladenen Pro-
jekts benden sich die Dateien, mit denen der Test vorgenommen wurde:
user@telpc2:~/ekStream/tests/org/ekstream/test$ ls *.java
StreamingTestFullDynamic.java
StreamingTestStaticRoutingPlainScheduling.java
StreamingTestStaticRoutingRBCScheduling.java
...
Die Testdateien werden nach
ekStream/bin
wie folgt kompiliert:
1 http://www.debian.org
2 http://www.eclipse.org
3 http://subversion.tigris.org/
4 http://subclipse.tigris.org/
122
2005-03-21/015/IN99/2253
A.10. Vorgehen zum Ausführen eines Tests
user@telpc2:~/ekStream/tests$ javac -d ../bin -classpath ../src \
org/ekstream/test/StreamingTest*.java
A.10.3. Kongurieren des Datenstroms
Bevor das Streaming gestartet werden kann, muss der Datenstrom konguriert werden.
Die Aufnahme und die Encodierung des Datenstroms erfolgt mit
grasche Oberäche von
mp4live
mp4live 5 .
Über die
ist es möglich, Parameter wie die Auösung, die
Bitrate und das Ziel (Urquelle) des Datenstroms einzustellen. Dabei kann eine SDPDatei (
Session Description Protocol, siehe [RFC 2327 (1998)]), die zum Abspielen des
Datenstroms benötigt wird, erzeugt werden.
Die Konguration des Datenstroms über
.mp4live_rc
metern
mp4live
eingestellt werden. Das Starten von
automatic
und
kann ebenso manuell in der Datei
mp4live
erfolgt dann mit den Para-
headless:
user@telpc7:~$ mp4live --automatic --headless
A.10.4. Starten der Testdateien
Über die Testdatei
StreamingTestFullDynamic.class
kann
ekStream
mit dem dy-
namischen lokalitätsbewussten Routing und der Schedulingstrategie RBCS gestartet
werden. Dabei wird beim Start mindestens ein Knoten als Bootstrapping-Punkt, auÿer
bei der Urquelle, angegeben. Die Parameter für den Start sind:
1. Parameter:
2. Parameter:
3. Parameter:
Port für den Empfang des Datenstroms (20000)
Port für die Kommunikation des Routings mit anderen Knoten (5000)
festgelegte Bandbreite in
breitenbestimmung und das
ab 4. Parameter:
kbit/s dieses Knotens für die statische Band-
Admission Control
Knotenliste, die das Routing für das
Bootstrapping
verwenden soll
Für die Urquelle ergibt sich damit folgender Aufruf:
5
http://mpeg4ip.sourceforge.net/documentation/index.php?readme=mp4live
2005-03-21/015/IN99/2253
123
A. Anhang
user@telpc7:~/ekStream/bin$ java org/ekstream/test/StreamingTestFullDynamic \
20000 5000 2000
Der Aufruf für einen anderen Knoten, der nicht die Urquelle ist, setzt sich wie folgt
zusammen:
user@telpc2:~/ekStream/bin$ java org/ekstream/test/StreamingTestFullDynamic \
20000 5000 2000 telpc7:5000
Durch den Start der Datei
wird
ekStream
StreamingTestStaticRoutingPlainScheduling.class
mit einem statischen Routing und der Schedulingstrategie Plain Sched-
uling aufgerufen.
Der Start der Datei
Aufruf von
StreamingTestStaticRoutingRBCScheduling.class
führt zum
ekStream mit einem statischen Routing und der Schedulingstrategie RBCS.
Zum Start dieser beiden Dateien werden die gleichen Parameter wie beim Start der
Datei
StreamingTestFullDynamic.class
verwendet. Durch die Benutzung eines sta-
tischen Routings in beiden Dateien müssen jetzt alle Knoten angegeben werden, die
dieser Knoten kennen soll.
Nach dem Starten einer Testdatei önet sich eine grasche Oberäche von
ekStream.
Unter den einzelnen Reitern können für den Knoten der Zustand des Puers für den
Audio- und Video-Datenstrom, die bekannten Knoten, die eingehenden und ausgehenden
Links
beobachtet werden.
Zusätzlich gibt
über die Datei
ekStream
in der Kommandozeile ein
logger.conf
A.10.5. Starten des
unter
ekStream/bin
Logging
aus. Das
Logging
kann
eingestellt werden.
mplayers
Um nun die empfangenen Multimedia-Daten des Datenstroms auf einem Knoten anzeigen zu können, kann der
mplayer 6 mit mplayer -vo xv sdp://capture.sdp gestartet
werden.
ekStream
sendet den Datenstrom (jeweils Video und Audio) lokal an einen Port, der
um zehn gröÿer als der Empfangsport (1. Parameter beim Aufruf der Testdatei) ist.
6 http://mplayerhq.hu/homepage/index.html
124
2005-03-21/015/IN99/2253
A.10. Vorgehen zum Ausführen eines Tests
Daher muss dieser Port vor dem Start des
mplayers in der Datei capture.sdp geändert
werden. In dem folgenden Beispiel wird daher in der 10. Zeile 20010 (statt 20000) für den
Video-Datenstrom und in der 15. Zeile 20012 (statt 20002) für den Audio-Datenstrom
eingetragen.
capture.sdp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
v =0
o=- 1116950668999035 1116950668999036 IN IP4 141.24.32.248
s= capture . sdp
e= NONE
c= IN IP4 141.24.32.248
b= RR :0
t =0 0
a= mpeg4 - iod : " data : application / mpeg4 - iod ; base64 , AoCAgy4AT /// DwP / A4CAgHkAyUBGZGF0YTphcHBsaWNhdGlvbi9tcGVnNC1iaWZzLWF
1 O2Jhc 2 U2NCx3QkFTZ1RBcUJXMG1FRUg4QUFBQi9BQUFCRUtDS0NuNASAgIAVAg0AABgAAADAAAAAwAWAgIADAABgBoCAgBAARAAAAAAAAAA
AAAAAAAADA4CAgiQAZUD0ZGF0YTphcHBsaWNhdGlvbi9tcGVnNC1vZC1hdTtiYXNlNjQsQVlDQWdSVUJnSUNBT0FLZkE0Q0FnREVBQ2dBRWdJ
Q0FGRUFWQUQ2QUFBSDBBQUFCOUFBRmdJQ0FBaElRQm9DQWdCQUFSQUFBQUFBQUFBQUFBQUFBQUFBREFZQ0FnRk1GSHdPQWdJQk1BQlFBQklDQ
WdDOGdFUUNTZkFBRWsrQUFCSlBnQllDQWdCMEFBQUd3QXdBQUFiVUpBQUFCQUFBQUFTQUFoc1FBWnd3V0VFaFJqd2FBZ0lBUUFFUUFBQUFBQU
FBQUFBQUFBQUFBQXc9PQSAgIASAQUAAJoAAATQAAAE0AWAgIAABoCAgBAARAAAAAAAAAAAAAAAAAAD "
a= isma - compliance :1 ,1.0 ,1
m= video 20000 RTP / AVP 96
b= AS :300
a= rtpmap :96 MP4V - ES /90000
a= fmtp :96 profile - level - id =3; config =000001 b003000001b50900000100000001200086c400670c161048518f ;
a= mpeg4 - esid :20
m= audio 20002 RTP / AVP 97
b= AS :128
a= rtpmap :97 mpeg4 - generic /44100
a= fmtp :97 streamtype =5; profile - level - id =15; mode = AAC - hbr ; config =1210; SizeLength =13; IndexLength =3;
IndexDeltaLength =3; Profile =1;
a= mpeg4 - esid :10
2005-03-21/015/IN99/2253
125