Mit Virtuellen Maschinen
Prof. Dr. Stefan Bosse
Universität Koblenz - FB Informatik - FG Praktische Informatik
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) ::
Wie können Web Browser für die verteilte Datenverarbeitung genutzt werden?
Zentrales Thema Kommunikation: Wie können Web Browser (und Web Seiten) vernetzt werden?
Prozesskommunikation mit Channels über Web Sockets und Web Real-time Communication
Gruppenkommunikation
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: Verteilte Systeme
Parallele Systeme sind eng gekoppelt. Kommunikation zwischen Prozessen nutzt:
Verteilte Systeme sind lose gekoppelt und können für die Synchronisation nicht auf das Betriebssystem und die technischen Eigenschaften des Hostrechners zurückgreifen!
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: Verteilte Systeme
Parallele Systeme sind i.A. synchrone Prozesssysteme
Verteilte Systeme sind inhärent asynchron und können nicht grundsätzlich und zuverlässig synchronisiert werden!
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: Verteilte Systeme
Parallele Systeme arbeiten häufig nach dem Prinzip der Produzenten-Konsumenten Interaktion und Partitionierung
Es gibt häufig einen ausgewiesenen Master und eine Vielzahl von Worker Prozessen
In verteilten Systemen gibt es häufig ein Leader Prozess (der selbst aber auch Worker sein kann)
Leader und Worker bilden eine (temporäre) Gruppe
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: Verteilte Systeme
┌────────┐ ┌────────┐ │ P1 │ │ P2 │ │ Worker │ ◀──────▶ │ Worker │ └────────┘ └────────┘ ▲ ▲ ▲ │ │ ┌───────┐ │ │ └─▶ │ P5 │ ◀────┘ │ ┌─▶ │ Master│ ◀────┐ │ │ └───────┘ │ ▼ ▼ ▼ ┌────────┐ ┌────────┐ │ P3 │ │ P4 │ │ Worker │ ◀──────▶ │ Worker │ └────────┘ └────────┘
Verteiltes Prozesssystem mit Leader(Master) und Workern und Kommunikationskanälen (1:1 oder 1:N)
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: Sockets
Ein Socket ist sowohl ein Kommunikationsendpunkt (zum Empfang von Nachrichten) als auch ein Sender von Nachrichten
Sockets (die i.A. zu Prozessen gehören) können miteinander verbunden werden (verbindungsorientierte Kommunikation mit Sessions) oder verbindungslos Datenpakete sich gegenseitig zusenden
Ein Socket wird durch eine lokale oder netzwerkweite Identifikation (Pfad, Nummer, Nummer und Netzwerkadresse des Gerätes, Namen usw.) erreicht
<ip:port> <ip:port> ┌────────┐ data msg ┌────────┐ │ Socket ├──────────────────────▶│ Socket │ └────────┘ send(data) └────────┘
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: Sockets
Server
local chaneServer = luv.net.tcp()chanServer:bind(host, port)function on_conncetion(chanClient) -- handle client request data1=client:read() client:write(data2)endchanServer:listen(128, function(err) -- Accept the client local chanClient = luv.net.tcp() server:accept(chanClient) on_connection(chanClient)end)
Klient
local chanClient = luv.net.tcp()chanClient:connect(host, port, function (err) -- check error and carry on. chanClient:write(data1) data2=chanClient:read()end)
Lua Socket mit bidirektionaler TCP Kanalverbindung
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: TCP versa UDP
https://www.csestack.org/difference-connection-oriented-connectionless-services-protocol/
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: TCP versa UDP
Faktor | TCP | UDP |
---|---|---|
Verbindungstyp | Erfordert eine bestehende Verbindung, bevor Daten übertragen werden; Nur Unicast | Zum Starten und Beenden einer Datenübertragung ist keine Verbindung erforderlich. Uni-, Multi- und Braoidcast Adressierung möglich |
Adressierungstyp | Nur Unicast | Uni-, Multi- und Broadcast Adressierung möglich |
Reihenfolge der Daten | Kann Daten sequenzieren (in einer bestimmten Reihenfolge senden) | Keine Reihenfolge oder Anordnung der Daten möglich |
Neuübertragung von Daten | Kann Daten erneut übermitteln, falls Pakete nicht ankommen | Keine erneute Datenübermittlung. Verlorene Daten können nicht wiederhergestellt werden |
Zuverlässigkeit | Die Zustellung ist garantiert | Die Zustellung ist nicht garantiert |
Fehlerprüfung | Gründliche Fehlerkontrolle garantiert, dass die Daten in ihrem vorgesehenen Zustand ankommen | Die minimale Fehlerprüfung deckt die Grundlagen ab, kann aber nicht alle Fehler verhindern |
Nachrichtengröße | Theoretisch unbegrenzt | Auf Datenpaketgröße begrent (z.B. 4kB) |
Datenfragmentierung | Automatisch | Manuell |
Geschwindigkeit | Höhere Latenz, niedrigere Bandbreite | Schneller, aber mit der Gefahr einer unvollständigen Datenzustellung |
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: TCP versa UDP
https://www.graffletopia.com/stencils/1560
TCP Kommunikation ist zustandsbasiert und hat ein striktes Abluafprotokoll
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: Web Sockets
HTTP bietet sogenannte "pull" Anfragen (GET/POST), auf die es eine Antwort gibt (response).
Web Sockets bieten eine Zweiwege (bidirektionale) Kommunikation zwischen ursprünglich einem Server und einem Klienten (d.h. auch die andere Seite kann direkt Daten senden)
Web Sockets werden über das HTTP(S) Protokoll verhandelt und eine Socket Verbindung aufgebaut
Auch für die bidirektionale Kommunikation zwischen Web Browsern geeignet
Web Sockets nutzen (zwei) TCP Verbindungen um Datenströme zu übertragen. Die Übertragung ist als zuverläassig anzusehen (anders als bei UDP)
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: Web Sockets
www.pubnub.com
Aufbau eines Web Sockets über eine HTTP(S) Verbindung
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: Channels
Ein Kommunikationskanal zwischen zwei Prozessen kann
Ein Kommunikationskanal basiert auf einer FIFO Warteschlange (Queue)
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: Channels
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: Channels
┌───────┐ ┌───────┐ │ │ send(d) │ │ │ ├────────────────▶│ │ │ Port │ send(d) │ Port │ │ │◀────────────────┤ │ ├───────┤ ├───────┤ │ Queue │ │ Queue │ └────┬──┘ └─┬─────┘ ▲ │ │ ▲ │ │ │ │ write(d) ▼ read() read() ▼ write(d) ───────────────── ────────────────── process P1 process P2
Kanalkommunikation zwischen zwei (entfernten) Prozessen via Socket Ports
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: Netzwerkkommunikation
Netzwerkkommunikation findet i.A. zwischen Prozessen und nicht Geräten statt
Dazu werden Kommunikationsports auf einem Gerät verwendet (Sockets)
Ein Kommunikationsport wird in IP (Internet Protocol) Netzen durch das Tupel ⟨ipaddr,ipport⟩ referenziert
Genauer ist es ein Tripel ⟨ipaddr,ipport,ipproto⟩ um das Protokoll mit einzubeziehen (z.B. tcp)
Ein Gerät (Hostrechner) hat mindestens eine wenigstens lokal eindeutige IP(4) Adresse ip, im Format "XX:XX:XX:XX" (X: hexadezimal Ziffer), oder "DDD:DDD:DDD:DDD".
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: Öffentliche und Private Netzwerke
Ein Kommunikationsport muss mit seiner Adresse ⟨ipaddr,ipport⟩ öffentlich im Internet sichtbar sein (man spricht von einem Server)
Aber: Schon allein aufgrund der hohen Anzahl von Geräten reicht der IP4 Adressraum nicht mehr aus, und jeder öffentlich erreichbare Rechner ist ein Angriffspunkt
Es werden private/virtuelle Netzwerke aufgespannt mit zwei Adressräumen:
Problem: Kommunikation nach außen erfordert Network Address Translation (NAT)
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: Öffentliche und Private Netzwerke
bford.info/pub/net/p2pnat
Öffentliche und private Netzwerke mit unterschiedlichen Adressräumen und Adressumrechnung (NAT)
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: Network Address Translation
Immer wenn eine Kommunikation zwischen zwei Kommunikationsports zweier Prozesse auf zwei Geräten in unterschiedlichen Netzwerken stattfinden soll muss an der Grenze Öffentliches Internet ↔ Virtuelles Netzwerk die private Adresse ⟨ipaddr,ipport⟩ in eine öffentliche ⟨V2P(ipaddr),V2P(ipport)⟩ umgerechnet werden
Man unterscheidet:
Auch durch NAT werden aber Ports in virtuellen Netzwerken öffentlich nicht sichtbar.
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: Network Address Translation
bford.info/pub/net/p2pnat
Kanalkommunikation zwischen zwei (entfernten) Prozessen via NAT
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: NAT Durchdringung
Wie können Prozesse über NAT kommunizieren?
Peer-to-Peer Communication Across Network Address Translators, Bryan Ford, Pyda Srisuresh
Relais
Verbindungsumkehr
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: NAT und UDP Hole Punching
https://bford.info/pub/net/p2pnat/
Das Problem: Das öffentlich sichtbare Tupel ⟨ipaddr,ipport⟩ eines Peer Ports muss auch für eingehende Datenströme verwendet werden.
Wenn ein Klient Daten über einen Port mit NAT sendet merkt sich der NAT das Mapping und eine Rücksendung an den Sendeport wird an das richtige Gerät und den Prozess vermittelt.
Aber wie soll Klient A mit Klient B Kontakt aufnehmen wenn zuvor Klient B keinen Kontakt mit A aufgenommen hat? Es muss versucht werden den NAT von B "durchzuschalten"
Dazu werden (leere Ping) UDP Pakete zwischen den Klienten gegenseitig zugesendet.
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: NAT und UDP Hole Punching
UDP Hole Punching, Peers hinter gemeinsamen NAT
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: NAT und UDP Hole Punching
UDP Hole Punching, Peers hinter getrennten NAT
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: Signaling Server
https://support.medialooks.com/hc/en-us/articles/360000213312-%D0%95nvironment-signaling-STUN-and-TURN-servers
Signaling server werden benutzt damit Peers Service Informationen teilen können, um eine direkte Peer-to-Peer-Übertragung zu starten.
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: STUN, TURN
https://help.estos.com/help/de-DE/procall/7/erestunservice/dokumentation/htm/IDD_FUNCTIONALITY.htm
help.estos.com
Klient A ist direkt erreichbar. Klient B kann Daten direkt an Klient A senden
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: STUN, TURN
Erfolgloser Verbindungsaufbau über einen NAT-Router hinweg.
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: STUN, TURN
Erfolgreiche Kommunikation unter Zuhilfenahme eines STUN-Servers.
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: STUN, TURN
Verwendung eins STUN Servers um öffentliche IP Adressen der Rechner zu bestimmen.
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: STUN, TURN
Erfolgloser Kommunikationsversuch über ein "Symmetric NAT".
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: STUN, TURN
Erfolgreicher Kommunikationsversuch über ein "Symmetric NAT" durch Nutzung eines TURN-Servers.
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: STUN, TURN
TURN Server als Relais um (sym.) NAT zu überwinden. Jeder Klient muss mit dem TURN Server verbunden sein.
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: STUN, TURN
Zusammenfassung
Der Signalisierungsserver wird verwendet, um Peers die Teilung von Dienstinformationen zu ermöglichen, um die Peer-to-Peer-Stream-Übertragung zu starten.
Der STUN-Server wird verwendet, um Peers die externe Adresse des anderen mitzuteilen, um die Peer-to-Peer-Stream-Übertragung hinter dem NAT zu starten.
TURN Server wird verwendet, um Peers Streams hinter einer Firewall miteinander übertragen zu lassen. In diesem Fall findet keine Peer-to-Peer-Stream-Übertragung statt. Der gesamte Medienverkehr läuft über einen TURN-Server.
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: Symmetrisches NAT
Kaum für direkte Peer-to-Peer Verbindungen einzusetzen (wenn beide Prozesse hinter NATs sitzen)
Die lokalen und öffentlichen Portnummern unterscheiden sich
Einige UDP Hole Punching Algorithmen versuchen das Transformationsschema zu untersuchen. Randomisierte Zuordnungen sind kaum durchdringbar, inkrementelle mittels Probing eventuell!
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: Symmetrisches NAT
webrtchacks.com
Hier ist das Problem bei einem sym. NAT gezeigt: Der Klient fragt zwei STUN Server nach seinem öffentlichen Port Tupel und bekommt zwei verschiedene Antworten. Und von außen kann über dieses Mapping auch keine Nachricht an den Port gesendet werden!
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: PeerJS
https://github.com/peers/peerjs
PeerJS besteht aus einer Klienten API und einem Server, dem Signaling Server
PeerJS kapselt Web Sockets mit Web RTC (Realtime Comm.)
Ein Peer Port in PeerJS ist mit einer (eindeutigen) ID Nummer verknüpft, z.B. a53d9c76-4119-4d82-be5c-88fc11ffc943
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: PeerJS
toptal.com
Alle Server zusammen: STUN+TURN+PeerJS
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: Web Browser-Browser Cluster
┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ Browser │ │ Browser │ │ Browser │ ├───────────────┤ ├───────────────┤ ├───────────────┤ │ Message │ │ Message │ │ Group │ │ Server, Chat │ │ Server, Chat │ │ Server │ ├───────────────┤ ├───────────────┤ ├───────────────┤ │ Lua VM, Coro │ │ LuaVM, Core │◀──────▶│ Channel │ ├───────────────┤ ▲ ├───────────────┤ ├───────────────┤ │ LuaJS Bridge │ │ │ LuaJS Bridge │ │ PeerJS │ ├───────────────┤ │ ├───────────────┤ ├───────────────┤ │ Channel,Group │◀───┼───▶│ Channel,Group │ │ Web Sockets │ ├───────────────┤ │ ├───────────────┤ └───────────────┘ │ PeerJS │ │ │ PeerJS │
├───────────────┤ ▼ ├───────────────┤
│ Web Sockets │ │ Web Sockets │
└───────────────┘ └───────────────┘
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: Lua Web Gruppenkommunikation
Es wird folgend aufgebauter Kommunikationsstack im Web Browser verwendet:
Es werden folgende Server verwendet:
Es wird die fengari Lua VM für Programmausführung verwendet
Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: Lua Web Gruppenkommunikation
iceServers = [ { url: 'stun:stun.l.google.com:19302' }, { url: 'turn:numb.viagenie.ca', credential: 'muazkh', username: 'webrtc@live.com' }]group = Group (mygroup) -- Gruppe erzeugen bzw. bekanntgebenstatus = group:join() -- Der Gruppe beitretenstatus = group:unjoin() -- Die Gruppe verlassenmembers = group:members() -- Liefert alle momentanen Gruppen -- Mitgliederchan = group:connect(member) -- Kanal zu member ∈ members aufbauenchan:write(data) -- In den Kanal schreibendata=chan:read(timeoutInMs?) -- Aus dem Kanale lesen
Lua Web Socket Gruppenkommunikation
nil
). Stefan Bosse - VPP - Modul E Verteilte Programmierung (Web) :: Zusammenfassung
Synchronisiert Kommunikationskanäle (Channels) stellen wichtigistes Interprozesskommunikation in parallelen und verteilten Systemen dar
Channels in lokalen parallelen Systemen sind "einfach" zu implementieren
Channels über nachrichtenbasierte Netzwerkverbindungen können einen hohen Aufwand und Kosten verursachen
Verbindung von Netzwerkprozessen in unterschiedlichen privaten/virtuellen Netzwerken erfordern Hilfsserver (Signaling, STUN, TURN)