Vorlesung Verteilte Systeme Übungsblatt 1 Aufgabe 1: Erläutern sie einige der Vor- bzw. Nachteile von Thin-Client Lösungen. Aufgabe 2: Welche der folgenden Aussagen sind wahr oder falsch? a) Das UDP-Protokoll ist ein verbindungsorientiertes Protokoll. b) Die Java Socket-Klasse nutzt TCP als Übertragungsprotokoll. c) Bei der UDP-Übertragung werden keine Portnummern benötigt. d) Ein Server-Socket kann an mehrere IP-Adressen gebunden werden. e) Die bind() C API-Funktion nutzt man, um sich von einem Client auf einen Server zu verbinden. f) Manche Formen von Sockets erlauben Broadcast-Übertragung von Daten. g) Die accept() C-API-Funktion nutzt man bei UDP-basierten Sockets, um Datenpakete zu empfangen. h) Die Fehlerbehandlung der C Socket-API erfolgt durch Ausnahmebehandlung (Exceptions). i) Binäre Datenstrukturen lassen sich transparent über Sockets übertragen. j) Wenn ein Kommunikationspartner Daten von einem Socket liest, wird nach einer gewissen Timeout-Zeit automatisch das Lesen abgebrochen, wenn der andere Kommunikationspartner keine Daten mehr sendet. Aufgabe 3: Erläutern Sie die wesentlichen Unterschiede (Eigenschaften) zwischen paketorientierter und verbindungsorientierter Socketkommunikation. Aufgabe 4: a) Was müssen Sie in einem Protokoll alles spezifizieren, um die Kommunikation über Sockets einigermaßen zu definieren? b) Wie können sie dabei das Problem der nicht binären Transparenz von Sockets leicht umgehen? Aufgabe 5: (Programmieraufgabe) a) Überlegen sie sich ein einfaches text-basiertes Datenformat, mit dem sie Wetterdaten (z.B. Temperatur, Druck und Luftfeuchtigkeit) von einer Wetterstation auf einen zentralen Server übertragen können, der diese Daten in einer Datenbank speichert. Überlegen sie sich hierzu die Struktur einer Datenbanktabelle, um diese Daten zu speichern. b) Schreiben sie dann einen UDP-basierten Server, der Daten in ihrem Format entgegennimmt, die Daten aus den Nachrichten extrahiert und optional in eine SQLDatenbank, z.B. mySQL, einträgt. c) Schreiben Sie weiter einen einfachen UDP-Client, der eine Wetterstation emuliert und periodisch (z.B. alle 10 Sekunden) Messwerte generiert und an den Server sendet. d) Testen sie dann das Ganze mit einer Instanz des Servers und mehreren parallelen Wetterstation-Clients. Vorlesung Verteilte Systeme Musterlösungen zu Übungsblatt 1 Aufgabe 1: Bei einer Thin-Client Lösung ist die Applikationslogik (und Datenlogik) auf einem Server konzentriert. Die Clientseite enthält nur die Präsentationslogik, die im Fall von Webanwendungen typischer Weise auf dem Server automatisch generiert wird. Dies vereinfacht zunächst einmal das sogenannte Deployment-Problem. Updates der Nutzeroberfläche können direkt über das Web an die Clients verteilt werden und benötigen keine gesonderte Installation. Updates der Applikationslogik können entsprechend einfach durchgeführt werden, ohne dass die Clientinstallationen „Out of Sync“ zu der Serverseite sind. Eine Thin-Client Lösung ist auch für Sicherheitsaspekte häufig von Vorteil, da sicherheitskritische Daten zentral auf dem Server liegen und daher hier geeignet geschützt werden können. Wenn innerhalb der Oberfläche einer Applikation komplexe Interaktionen mit dem Benutzer stattfinden müssen, dabei evtl. lokal auf dem Rechner des Klienten vorliegende größere Datenmengen eine Rolle spielen und die Vorgänge längere Zeit benötigen, dann ist eine reine Thin-Clientlösung evtl. nicht geeignet, da eine Übertragung aller Nutzerinteraktionen auf den Server und die dortige Bearbeitung auch den dauernden Transfer größerer Datenmengen zum Server sowie eine großen Sessionkontext auf dem Server bedingen, der diesen unnötig belasten würde (Beispiel: Fotobuch-Software, mit der Nutzer zunächst ein Fotobuch auf Client erzeugt, dass er dann durch einen Internetanbieter drucken lassen möchte). In solchen Fällen ist es besser, den Teil der Applikationslogik, der mit den lokalen Daten auf dem Clientrechner umgehen muss, auf der Clientseite zu implementieren (in unserem Beispiel die Erstellung des Fotobuchs – nur am Schluss vor dem Drucken wird dann das gesamte Buch auf den Server übertragen, allerdings in einer bereits für den Druck optimierten Form). Aufgabe 2: a) Falsch b) Wahr c) Falsch d) Wahr e) Falsch f) Wahr g) Falsch h) Falsch i) Falsch j) Falsch Aufgabe 3: Bei einer verbindungsorientierten Kommunikation muss zunächst zwischen Client und Server eine Verbindung aufgebaut werden. Dann lassen sich Daten über read()/write() Aufrufe als Bytestrom über die stehende Verbindung übertragen. Dabei sorgt die Flusskontrolle des TCP-Protokolls dafür, dass keine Bytes verloren gehen, und die Bytes in der Reihenfolge empfangen werden, in der sie abgesendet werden (Strom von Bytes). Bei der paketorientierten Kommunikation wird keinerlei Verbindung aufgebaut. Stattdessen werden vollständige Datenpakete mit Adressdaten versehen und dann abgesendet. Der Absender wartet dabei nicht darauf, dass das Datenpaket auch den Empfänger erreicht. Das zum Transport benutzte UDP-Protokoll garantiert dabei weder, dass ein Datenpaket ankommt, noch dass der Absender benachrichtigt wird, wenn das Paket nicht ankommt. Bei der paketorientierten Kommunikation kann auch die zeitliche Reihenfolge von Paketen (und damit von Daten) bei Ankunft vertauscht sein. Aufgabe 4: a) In einem Protokoll muss zunächst mal die physische Kodierung / Dekodierung der auszutauschenden Protokollnachrichten spezifiziert werden. Dann muss für jede Nachricht deren exakter Aufbau und die Reihenfolge der Abläufe (wer sendet welche Nachricht wann, was muss darauf an Aktion passieren, welcher Returnwert muss zurückgeliefert werden) definiert werden. Hierbei müssen auch sämtliche Fehlersituationen, und wie diese behandelt und gemeldet werden, festgelegt werden. b) Das Problem der nicht-binären Transparenz kann man sehr einfach dadurch umgehen, dass man alle Nachrichten in Textform gemäß einer festgelegten Zeichensatzkodierung kodiert. Aufgabe 5: (10 Pkte) Der Programmcode für die Aufgabenlösung befindet sich auf der Website der Vorlesung. Als Format für die Datenübertragung wurde ein textbasiertes Format im ASCII Zeichensatz verwendet, bei dem ein Datenpaket aus einer Textzeile besteht, die den folgenden Aufbau hat. Stationsname Zeitstempel Messgröße Wert Dabei darf die Gesamtgröße eines Paketes nicht die maximale Größe von UDP-Paketen überschreiten. Die einzelnen Informationen in der Textzeile sind durch weiße Zeichen (Whitespace-Zeichen) separiert. D.h. insbesondere, dass sie selbst keine Leerzeichen, etc. enthalten dürfen. Das Ende der Zeile wird durch ein Newline (\n) gebildet. Der Stationsname sollte nur aus ASCII-Buchstaben und Zahlen bestehen. Der Zeitstempel ist im Standardausgabeformat für Timestamp-Angaben in Java. Mögliche Werte für die Angabe der Messgröße sind „temperature“ (Temperatur), „pressure“ (Luftdruck) und „humidity“ (relative Luftfeuchtigkeit in %). Diese List könnte natürlich auch noch vervollständigt werden. Die Messwerte selbst sind in englischer Notation (d.h. Nachkommastellen sind durch Punkt und nicht durch Komma getrennt. Weder Client noch Server führen irgendeine Fehlerbehandlung durch. Datenpakete mit fehlerhaftem Format werden vom Server einfach ignoriert. Die obige Beschreibung definiert das Protokoll der Client-Server Kommunikation. Der von mir bereitgestellte Beispielserver speichert die Messdaten in einer Datenbanktabelle, die ebenfalls die im Protokoll aufgeführten Informationen enthält. Über den Stationsnamen können die Messdaten mit weiteren Informationen zur Messstation selbst, wie z.B. den geographischen Standort, innerhalb der Datenbank verknüpft werden. Eine weitere Tabelle könnte für die physikalischen Messgrößen weitere Informationen, wie z.B. Einheit, etc. festhalten. Der Beispielclient erzeugt über ein Random-Verfahren Temperaturdaten und schickt sie protokollgemäß an den Server. In einem realen Szenario würden die Messdaten natürlich von einer Hardware-Wetterstation kommen, die z.B. über USB an einem Rechner angeschlossen ist und ihre Werte von einer Außenstation per Funk enthält.