Warning: include_once(/var/www/html/pmwiki-2.2.86/cookbook/soap4pmwiki/soap4pmwiki.php): failed to open stream: No such file or directory in /var/www/html/fields/dbp15/local/config.php on line 4

Warning: include_once(): Failed opening '/var/www/html/pmwiki-2.2.86/cookbook/soap4pmwiki/soap4pmwiki.php' for inclusion (include_path='.:/opt/php/lib/php') in /var/www/html/fields/dbp15/local/config.php on line 4

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/fields/dbp15/local/config.php:4) in /var/www/html/pmwiki-2.2.86/pmwiki.php on line 1250
Datenbankpraktikum SS 2015 - D - Protocolldefinition

Definition des Kommunikationsprotokolls

Das von uns erstellte Kommunikationsprotokoll definiert die Datenpakete, welche zwischen Client und Server versendet werden und welche Pakete zu welchem Zeitpunkt im Programmablauf erwartet werden.

Datenpakete

Es werden acht verschiedene Datenpakete definiert. Hierbei geben die ersten vier Bytes eines jeden Pakets den Pakettypen an. Definiert wurden die Pakete in einer Enumeration, sodass sie keinen direkt zugewiesenen Wert haben. Es existieren als Pakettypen: Greeting, Login, Ok, AccDenied, AccGranted, Error, Command und Response. Im Folgenden werden diese Pakettypen näher erläutert.

Greeting

Das Greeting-Paket wird bei einer eingehenden Verbindung eines Clients auf den Server vom Server an den Client gesendet. Das Paket setzt sich aus dem Pakettypen (4 Byte), der Protokollversion des Servers (1 Byte) und einer (Willkommens-)Nachricht an den Client zusammen. Damit die Nachricht ausgelesen werden kann, wird die Länge der Nachricht mit in das Datenpaket geschrieben. Für die Speicherung der Größe der Nachricht sieht die Funktion, welche wir für das Packen des Pakets benutzen (bincode::encode_into()) 8 Byte vor. Dahinter steht die eigentliche Nachricht an den Client. Das heißt die Paketgröße ist aufgrund des Strings variabel: 4 + 1 + 8 + n Bytes = 13 + n Bytes, wobei n für die Länge des Strings steht.


Greeting-Package
Login

Das Login-Paket wird vom Client an den Server gesendet. Das Paket setzt sich aus dem Pakettypen (4 Byte), acht Byte für die Länge des Benutzernamens, dem eigentlichen Benutzernamen als String mit n Bytes. Auf den Benutzernamen folgt die Länge des Passwortes (8 Byte codiert) und das Passwort als String. Damit ergibt sich für die Größe des Login-Pakets: 4 + 8 + n + 8 + m Bytes = 20 + n + m Bytes, wobei n die Länge des Benutzernamens und m die Länge des Passworts ist.


Login-Package

Info-Packages mit konstanter Größe
AccDenied, AccGranted

Auf das Login-Paket antwortet der Server mit einem AccGranted-Paket im Authentifizierungserfolgsfall bzw. wenn der Nutzer nicht authentifiziert werden konnte mit einem AccDenied-Paket. Dieses setzt sich aufgrund unserer Paketdefinitionen aus den vier Byte für den Pakettypen zusammen. Es werden keine weiteren Informationen mitgeschickt.

Ok

Das Ok-Paket wird immer dann gesendet, wenn eine Aktion erfolgreich ausgeführt werden konnte und keine weiteren Daten erwartet werden. Dieses ist beispielsweise bei dem Kommando ':ping' der Fall. Das Ok-Paket besteht aus den vier Byte für den Pakettypen.

Error

Treten Fehler (unterschiedlicher Arten) bei der Ausführung von Methoden auf, so senden wir ein Error-Paket an den Client. Dieser beinhaltet den Pakettypen (4 Byte), einen eindeutigen Fehlercode (2 Byte) und eine Fehlernachricht, die mit ihrer Länge (8 Byte kodiert) und der eigentlichen Nachricht gesendet wird. Das entspricht einer Paketgröße von 4 + 2 + 8 + n Byte = 14 + n Byte, wobei n die Länge der Fehlernachricht ist.


Error-Package
Command

Das Command-Paket wird für die Übermittlung von Verbindungsstati und den Abfragen, die vom Benutzer an das Datenbankssystem gestellt werden, benutzt. Hierbei geben die ersten vier Bytes, wie bei jedem anderen Paket, den Pakettypen an. Die weiteren Daten unterscheiden sich je nach Art des Kommandos. Die Art des Kommandos wird in einer Enumeration definiert, sodass mit den nächsten vier Byte der Kommandotyp angegeben wird. Ist das Kommando eine Query, so muss die Abfrage als String mitgeschickt werden. Hierfür erhält das Paket weitere acht Byte für die Länge des Strings und anschließend folgen die n Bytes für den String selbst. Die Größe des Command-Pakets ist damit nicht festgelegt. Für ein Command-Ping- und Command-Quit-Paket beträgt die Größe acht Byte (4 + 4 Byte), für die Query werden 12 + n Bytes benötigt.


Command-Packages
Response

Das Response-Paket wird für die Übermittlung der Ergebnisdaten einer Abfrage, die durch ein Command-Query-Paket angestoßen wurde, benutzt. Dieses Paket beinhaltet zunächst die obligatorischen vier Byte für den Pakettypen. Darauf folgen mit acht Byte die Länge des Datenvektors, der am Ende einer Abfrage erstellt wurde, und daraufhin die eigentlichen n Daten des Datenvektors. Anschließend werden weitere acht Byte für die Länge des Columnvektors angegeben. Da Column kein primitiver Datentyp ist, sondern von uns definiert wurde (siehe auch Columns, kommen also noch m-mal weitere Daten hinzu. Ein Column besteht aus einem Namen, zwei Boolean-Werten, einem SQL-Typen und einer Beschreibung. Der Name wird, da es ein String ist mit acht Byte für die Länge des Namens und p Byte für die eigentlichen Daten kodiert. Die beiden Booleans nehmen zusammen zwei Byte ein und dienen der Abfrage, ob Null-Werte in der Spalte erlaubt sind bzw. ob die Spalte ein Primärschlüssel der zugehörigen Tabelle ist. Der SQL-Type ist widerum ein selbstdefinierter Typ. Der SQL-Type kann vom Typ Int (4 Byte), vom Typ Boolean (4 Byte) oder vom Typ Char (4 + 1 Byte) sein. Für die Beschreibung gelten dieselben Größen, wie für den Namen: acht Byte für die Länge der Beschreibung und q Bytes für die eigentliche Beschreibung. Daraus ergeben sich für das Response-Paket: 4 + 8 + n + 8 + m * (8 + p + 1 + 1 + (4 | 5) + 8 + q) = 20 + n + m * ((22 | 23) + p + q) Bytes.


Response-Package

Programmablauf

Das Protokoll sieht folgenden Ablauf im Datenaustausch vor. Will ein Client sich zu einem Server verbinden, so muss dieser Server gestartet sein und auf einer bestimmten Bind-Adresse und Port auf eingehende Verbindungswünsche lauschen. Erst dann können Clients erfolgreiche Verbindungsanfragen (durch connect()) an den Server stellen. Registriert der Server den Verbindungswunsch, so sendet dieser ein Greeting-Package an den Client. Nun wird vom Client das Senden von Login-Daten erwartet, d.h. dass dem Server Username und Passwort des zu verbindenden Benutzers übermittelt werden. Kann der Server diesen Nutzer authentifizieren, so sendet der Server ein "AccGranted"-Package und der Client kann fortan so viele Command-Packages schicken bis der Client die Verbindung abbauen möchte. Auf die Command-Packages antwortet der Server mit Response-Packages, nachdem er die Anfragen intern erfolgreich bearbeitet hat. Wird ein Nutzer nicht vom Nutzer authentifiziert, so schließt das Client-Programm in der aktuellen Implementierung. Natürlich wäre wünschenswert, dass dieses noch geändert wird und der Benutzer erneut einen Benutzernamen und Passwort eingeben kann. In untenstehender Grafik ist der Programmablauf noch einmal schematisch dargestellt.


Schematischer Protokollablauf

Autor: Svantje Jung
Gruppe: Max Doll, Svantje Jung, Elena Resch


Page last modified on September 21, 2015, at 02:36 PM