Netzwerk-PlugIn

Das Netzwerk-Plug-In implementiert den Protokoll-Stack für das Peer-to-Peer-Netzwerk.

Während das TCP-Plug-in die Transportaufgabe übernimmt, muss das Netzwerk-Plug-in noch einiges mehr tun:

  • Erkennen vorhandener und gelöschter Verbindungen und Bereitstellung für das System fürs Messaging.
  • Das Entstehen und Verschwinden von LINKS und NODES erkennen und den Router darüber informieren
  • Konfiguration von anderen NODES holen, damit Nachrichten entsprechend formatiert werden können
  • Nachrichten, die an andere NODES gesendet werden, in Pakete packen
  • Auspacken von Paketen, die von anderen NODES stammen und für diesen NODE bestimmt sind
  • Weiterleiten von Paketen, die von anderen NODES kommen und für dritte NODES bestimmt sind
  • Erstellen und Senden von Broadcasts
  • Weiterleitung von Broadcasts an das System und andere NODES
  • Eingehende Nachrichten mit dem GateKeeper prüfen und ggf. zurücksenden

Routing

devel.one-Nachrichten enthalten eine Sender- und eine Empfänger-Adresse. Sie wandern über offene TCP-Verbindungen (LINKS) von NODE zu NODE. Ein Routerdienst stellt sicher, dass eine Nachricht immer an den richtigen nächsten NODE weitergeleitet wird. Auf diese Weise wird sichergestellt, dass Nachrichten so schnell wie möglich durch das Mesh-Netz geleitet werden. Damit das funktioniert, ist jeder NODE über die anderen NODES und deren Verbindungen informiert. Wenn ein NODE hinzugefügt wird, oder wenn ein Link wegfällt, werden alle NODES über einen P2P-Mechanismus informiert.

Damit kann jeder NODE den nächsten Wegpunkt für eine Nachricht nach dem Djikstra-Algorithmus bestimmen. Die "Kosten" einer Verbindung zwischen zwei benachbarten NODES können über die Konfiguration angegeben werden. Nachrichten werden so immer den schnellsten Weg durch das Mesh-Network nehmen.

Ein Nebeneffekt ist, dass das System jederzeit eine Aussage darüber machen kann, welcher NODE erreichbar ist, und welcher nicht. Durch Heartbeats werden Unterbrechungen einer TCP-Verbindung schnell detektiert, worauf die restlichen erreichbaren NODES darüber informiert werden.

HopHopHop

Das Packen

Bevor eine Nachricht zwischen zwei NODES versandt wird, muss sie "gepackt" werden. Es gibt verschiedene Typen des Packens:

  • Überführung einer Message in ein Byte-Array ("M")
  • Kompression des Byte-Arrays mittels des ZIP-Algorithmus ("Z")
  • Symmetrische Verschlüsselung des Byte-Arrayse mit AES ("A")

Welche Pack-Typen verwendet werden, wird durch eine sogenannte "Package Builder-Sequenz" bestimmt. Die vollständige Sequenz wäre also "MZA". Die Sequenz kann wie folgt konfiguriert werden:

  • Trägt der Envelope der Message eine Sequenz, so wird diese verwendet.
  • Ist eine Sequenz für eine bestimmte Strecke zwischen zwei NODES (z.B. zwischen "A" und "D") definiert, wird diese verwendet.
  • Ist eine Sequenz für einen NODE bestimmt worden, wird diese für ausgehende Messages verwendet.
  • Es wird eine Sequenz "M" (nur Streamen) verwendet.

Es kann also für jede Nachricht und Teilstrecke genau angegeben werden, ob Nachrichten komprimiert oder verschlüsselt werden sollen. Schließlich kostet jede Vorbereitung der Pakete Zeit.

Die symmetrische AES-Verschlüsselung ist nicht zu Verwechseln mit der Benutzung von SSL/TLS für einen Link zwischen zwei benachbarten NODES. Sie gilt vielmehr für die interne Verschlüsselung einer Nachricht zwischen Sender und Empfänger-NODE, also z.B. zwischen "A" und "D" im Bild. Dazu werden Session-Keys vor der ersten Nachricht "A--D" über ein RSA-Verfahren ausgetauscht.

Eine genauere Erläuterung ist in der Dokumentation zu finden.

PackageBuilderSequence

Priorisierung

Nachrichten besitzen im Envelope eine Einstellmöglichkeit für die Priorisierung. Diese kommt nur zum Zuge, wenn sie zwischen NODES transportiert werden. Wenn nun eine Nachricht versandt oder auch nur weitergereicht wird, landet sie zunächst einmal in einer Queue mit einer Priorität. Das System entnimmt die nächste Nachricht zum Transport immer aus der Queue mit der höchsten Priorität. Dabei "überholen" Nachrichten mit höherer solche mit niedrigerer Priorität.

Antworten werden vom System immer mit höchster Priorität transportiert.

GateKeeper

Der GateKeeper ist ein PlugIn, welches eingehende Messages prüft, ob sie willkommen sind. Dazu wird für jeden Server-Port, der gesichert werden soll, eine Liste erstellt, welche Nachrichten erlaubt sind. Nachrichten können auf bestimmte Kombinationen von Record-IDs, Namespaces und NODES untersucht werden. Wenn der GateKeeper die Nachricht ablehnt, wird sie an den Absender zurückgesendet. Siehe Gatekeeper-PlugIn für Details.