DIVE -
ein internet-basiertes Virtual-Reality-System
für viele Nutzer

Inhalt

  1. Einführung
    1. Grundlegender Aufbau
    2. Welten und Objekte
  2. Verteilte Umgebung
    1. Verbindungsaufbau
    2. Verteilte Objekte
    3. Verteilte Daten und Remote-Ausführung
  3. Das Protokoll SID2 (UDP, Multicast)
    1. Eigenschaft: Geringe Netzlast
    2. Die SID2-Nachrichten
    3. Der Nameserver
    4. Ausführen von Prozeduren
  4. DCI (TCP, Unicast)
    1. Die DCI-Pakete
    2. Klient an Server
    3. Server an Klient
Quellen

1. Einführung

Die Abkürzung DIVE steht für "Distributed Interactive Virtual Environment", also "Verteilte Interaktive Virtuelle Umgebung". In einer solchen Umgebung können sich Nutzer in einer 3D-Welt treffen und kommunizieren.
Es wurde vom schwedischen Institut für Informatik (SICS) entwickelt.

1.1. Grundlegender Aufbau

Das System besteht aus Servern, welche die so genannten "Welten" und die zugehörigen Nutzer aufbewahren und mit den angebundenen Klienten über eine IP-Multicast-Adresse kommunizieren.
Die Klienten sind Browser-Programme, die mit einem DIVE-Server verbunden sein können, und auch Ressourcen (Welten, Bilder, Sound, etc.) vom lokalen Rechner oder anderen Computern des Internet laden können. Dies geschieht per HTTP oder FTP. Sobald die Klienten zu einer Gruppe gefunden haben, kommunizieren sie gegenseitig, also unabhängig vom Server.
Zusätzlich kann noch ein Proxy-Server genutzt werden, der im Multicast-Netz hängt und mit anderen Klienten Einzelverbindungen unterhält, die nicht an einem multicast-fähigen Netz angebunden sind.

Bild 1: Nameserver, Proxy und Klienten

1.2. Welten und Objekte

Die Welten bestehen aus verschiedenen geometrischen Objekten, aber auch aus Texturen, Material-Definitionen und Lichtern. Außerdem gibt es Gateways, die Verbindungen zu anderen Welten darstellen, und so genannte Billboards, die sich immer nach dem Blick des Nutzers ausrichten.
Jedem Objekt kann zusätzlich ein Verhalten zugeordnet werden. Das ist ein Tcl-Skript, das andere Objekte oder sich selbst verändern (verschiebt/unsichtbar macht etc.) oder erzeugen kann. Dies geschieht jeweils bei Auslösung eines Events oder Ablauf eines Timers.
Eine Welt ist letztlich ein Szenegraph, also eine Hierarchie von Objekten. Diese wird definiert in Dateien mit DIVE-eigenen Formaten oder auch in VRML-Dateien.
Eine Welt besteht natürlich auch aus Personen, in der 3D-Welt als Avatare bezeichnet. Sie bestehen aus geometrischen Objekten und gehören immer zu je einem DIVE-Klient-Programm. Mit denen bewegt sich ein Nutzer durch die Welt und kann mit ihr interagieren. Sie können aber auch unabhängig von einem Nutzer sein. Sie haben eine Schnittstelle und stellen Dienste bereit.

Anfang

2. Verteilte Umgebung

2.1. Verbindungsaufbau

Beim Start kontaktiert der Klient zuerst den DIVE-Server. Dann holt er sich die Welt aus einem File oder über einen angegebenen URL.
Wenn die Welt auf dem DIVE-Server schon vorhanden ist, wird er in die zugehörige Gruppe eingetragen und kann sich die Welt von anderen Klienten kopieren und dann tauschen sie sich gegenseitig über die Veränderungen darin aus.
Wenn sie neu ist, wird eine Gruppen-Adresse erzeugt, die Welt erstellt und der Klient in die Gruppe eingetragen.

Bild 2: Klient sucht Gruppe

2.2. Verteilte Objekte

Alle Objekte, die zur Welt gehören und verteilt werden können (sog. Entities) werden zuerst lokal erstellt und eingerichtet. Dann werden sie mit je einem Befehl verteilt auf die Klienten, die gerade diese Welt nutzen.
Alle Klienten haben jeweils eine eigene Kopie der Welt und der zugehörigen Objekte lokal und jede Veränderung muss deshalb auch allen Klienten mitgeteilt werden. Dies geschieht per Multicast, damit alle gleichzeitig auf dem neuesten Stand sind. Dafür gibt es spezielle Befehle mit sonst gleicher Bedeutung und ähnlichen Namen wie die lokalen Versionen.
Zusätzlich kann jeder Klient den aktuellen Zustand abfragen ("Request") und erhält eine aktuelle Kopie von einem Klienten ("Update") als Antwort.

2.3. Verteilte Daten und Remote-Ausführung

Über so genannte "Properties" können Klienten Daten unabhängig von grafischen Objekten verteilen. Klienten können sich auch gegenseitig Kommandos schicken, die der andere ausführen soll.
Eine Erweiterung dazu ist das "DIVE Client Interface" (DCI). Es ermöglicht die Kommunikation zwischen DIVE-Applikationen (Klienten und Server). Dabei schickt ein Klient einen (Tcl)-Befehl an den Server, der dann die Rückmeldung dazu zurück gibt. Der Server informiert auch über aufgetretene Fehler bei Ausführung des angegebenen Kommandos und angefallene Events, für die sich der Klient registriert hat. Der Server hier ist ein DIVE-Programm und nicht der Gruppenverwalter!

Anfang

3. Das Protokoll SID2 (UDP, Multicast)

SID2 steht für SICS Distribution Package 2.

3.1. Eigenschaft: Geringe Netzlast

SID2 ist ein verlässliches Multicast-Protokoll zur Kommunikation in Gruppen über das Internet per UDP/IP. Es basiert auf "negative acknowledgement" und global eindeutigen Identifikatoren für die Objekte, die übers Netz gehen. Es wird sehr viel Multicast eingesetzt um die Netzwerklast zu minimieren.
Darum antwortet immer nur das nächstgelegene Gruppenmitglied mit der neuesten Version auf eine Anforderung. Der Nächstgelegene wird bestimmt durch Round-Trip-Time und Timeouts. Die Antwort auf eine Anforderung wird auch immer per Multicast geschickt, damit die anderen Klienten nicht auch etwas schicken müssen und um mögliche gleiche Anforderungen in der Zukunft zu begrenzen.
Der Absender muss die Nachricht nicht speichern bis alle sie bekommen haben; bei nochmaliger Anforderung wird sie einfach neu erstellt und ist somit aktuell.

3.2. Die SID2-Nachrichten

Jede Nachricht, mit der Objekte verschickt werden, besteht aus einem Header mit u.a. folgenden Elementen:

und den Objekt-Daten selber in einem Puffer mit Hashtabelle.
Die Datenrate der Nachrichten wird mit einem Token-Bucket-Algorithmus geregelt. Die Parameter dazu (Bucket-Größe und Rate) können eingestellt werden.
Die Flusskontrolle basiert auf "positive acknowledgements" wie in TCP/IP.

Bild 3: SID2-Nachrichtenkopf (sid_types.h)

Anfang

3.3. Der Nameserver

Zur Nutzung von Gruppen gibt es einen Nameserver, mit dem sich jeder Teilnehmer verbindet. Dieser verwaltet die Gruppen anhand von Namen und gibt die Adressen dazu heraus. Er kennt zu jeder Gruppe die zugehörige Welt und die Klienten, die dazu gehören.
Jeder Klient kann einer Gruppe beitreten und sie verlassen. Nachdem die Klienten ihre Gruppe kennen, verständigen sie sich ohne Server miteinander. Die Gruppe bleibt solange bestehen, wie es Klienten gibt, die sie nutzen. Auch wenn der Klient, der sie angefangen hat, schon längst ausgetreten ist.

3.4. Ausführen von Prozeduren

Weiterhin bringt SID ein Callback-Interface mit. Ein Klient kann also eine Prozedur angeben, die bei ihm ausgelöst wird, sobald woanders ein Event, Request oder Update auftritt. Bei der Ausführung kann auch ein neuer Thread innerhalb dieser Applikation gestartet werden.
Zusätzlich zum Callback per Events kann ein Klient auch RPC nutzen. Er kann remote eine Prozedur aufrufen und auch für eine bestimmte Funktion einen RPC-Callback eintragen.

Anfang

4. DCI (TCP, Unicast)

Mit dem DIVE Client Interface können Programme, die DIVE nutzen, Nachrichten schicken und Befehle bei anderen ausführen lassen.

4.1. Die DCI-Pakete

Hier verbindet sich ein Klient mit einem Server über eine TCP-Verbindung mit festem Port. Der Klient schickt dann darüber DIVE/Tcl-Befehle und bekommt die Ausgabe des Befehls zurück.
Das Paket selber besteht aus einer Magic-Number zur Identifikation des Protokolls, der Paketlänge, der Kanal-Nummer, jeweils 32 Bit, und dem String mit dem Kommando oder der Antwort.

Bild 4: Aufbau eines Paketes

4.2. Klient an Server

Diese Pakettyp enthält einen String mit dem Kommando, abgeschlossen mit einem Enter-Zeichen (Carriage Return). Darin kann man auch eine Prozedur eintragen, die ausgeführt wird bei einem bestimmten Event. Diese Prozedur wird dann mit übertragen.

4.3. Server an Klient

Bei diesem Pakettyp gibt es drei verschiedene Inhalte ("Kanäle"):

  1. Bei erfolgreicher Ausführung bekommt der Klient den Return-Wert als String
  2. Bei fehlerhafter Ausführung erhält er die Fehlernachricht als String
  3. Die Rückgabe einer Prozedur, die bei einem Event ausgeführt wurde.

Dieses Antwort-Paket kann auch von einem Objekt in der Welt geschickt werden, das mit dem Klienten Kontakt halten will. Üblicherweise wurde dieses Objekt vom Klienten selber mit einem Tcl-Skript ausgestattet und in die Welt eingefügt.


Anfang

Quellen:

Anfang
Inhalt Vortrag Letzte Änderung: 24.04.2003
E-Mail: Stefan Ziegler