Seminararbeit - Netzwerkprogrammierung 1 Netzwerkprogrammierung Stefan Renner Seminar LaVida 24.Januar 2011 Eine Übersicht über Techniken und Möglichkeiten der Netzwerkprogrammierung. I. EINLEITUNG N etzwerkprogrammierung ist ein relativ breiter Begriff. Aus diesem Grund werde ich Grundlagen und verschiedene Konzepte erläutern, um diesen Begriff zu erklären. Also zuerst die Frage: A. Was ist ein Netzwerk? "Netzwerke sind Systeme, deren Struktur durch einen Graphen modellierbar sind und welche über Mechanismen zur Eigenorganisation verfügen". Soweit die Definition. Früher beschrieb das Wort Netzwerk eine Reihe serieller Leitungen, mit denen Terminals an Großrechenanlangen angeschlossen wurden. Für einige impliziert der Begriff Netzwerk das Telefonnetz, oder das für die Verbreitung von Videosignalen genutzte Kabelnetz. Diese Netzwerke sind auf eine spezielle Art von Daten und deren Übertragung spezialisiert und verbinden ebenfalls spezialisierte Geräte miteinander. Im Gegensatz zu diesen spezialisierten Netzwerken, gibt es natürlich auch generelle, allgemeine Netze. Generelle Netze werden vorwiegend aus universeller, programmierbarer Hardware aufgebaut und sind nicht für spezielle Anwendungen optimiert. Sie sind vielmehr in der Lage viele verschiedene Typen von Daten zu transportieren und unterstützen eine breite, ständig wachsende Palette von Applikationen. Was nun zu betrachten wäre, ist wie die verschiedenen Komponenten eines Netzwerkes miteinander kommunizieren. Hierzu werden im Folgenden sog. Referenzmodelle betrachtet. B. Referenzmodelle Es existieren zwei wichtige Referenzmodelle für Rechnernetzwerke. Das etwas allgemeinere TCP/IP-Modell und das etwas detailliertere OSI-Modell. Beide Modelle basieren auf der Idee der sog. "Schichten" oder "Layers". Um diese Schichten zu verstehen, betrachtet man am besten das sog. "Philosoph-Übersetzer-Sekretärin-Problem". Hierbei wird das Problem betrachtet, wie zwei Philosophen, welche nicht dieselben Sprachen sprechen, miteinander kommunizieren um ihre Ideen auszutauschen. In Abbildung 1 wird gezeigt, dass sich beide Philosophen auf Schicht Drei befinden. Philosoph "A" reicht seine Nachricht an seinen Übersetzer "A" weiter, der seine Nachricht in eine Sprache übersetzt, welche auch der Übersetzer "B" in den Diensten von Philosoph "B" versteht. Übersetzer "A" reicht nun seine Übersetzung an die Sekretärin "A" weiter, welche die Nachricht per Fax an die Sekretärin "B" übermittelt. Es ist also deutlich zu sehen, dass die beiden Sekretärinnen miteinander kommunizieren. Die Übersetzer kommunizieren ebenfalls miteinander und somit sind auch die Philosophen in der Lage miteinander zu kommunizieren. Die Sekretärinnen, die Übersetzer und die Philosophen befinden sich jeweils auf einer Schicht. Abbildung 1 Philosoph-Übersetzer-Sekretärin Zu beachten an dieser Stelle wäre noch die Tatsache, dass Übersetzer "A" einen sog. "Header" hinzufügt, welcher beschreibt, um welche Sprache es sich bei nachfolgendem Text handelt. Dieses Paket, also Header und Nachricht, wird von der Sekretärin wieder als Nachricht in das von ihr erstellte Paket eingebunden. Anhand dieses Problems lassen sich auch drei Begriffe einführen, welche für die weitere Lektüre von essentieller Wichtigkeit sind. 1) Protokoll Protokolle sind Regelwerke, die die Kommunikation innerhalb einer Schicht regeln. So ist zum Beispiel die genaue Formatierung des Headers festgeschrieben. Der Header, den Übersetzer "A" hinzufügt, könnte natürlich verschiedene Formen haben. Er muss lediglich Übersetzer "B" darüber informieren, um welche Sprache es sich hierbei handelt. "This is Dutch" und andere Variationen würde ein Mensch auch verstehen, bereitet aber einem Computer Schwierigkeiten. Es ist daher genau festgeschrieben, dass nach dem Bezeichner "L:" der Name der Sprache steht in der nachfolgender Text geschrieben ist. Diese Protokolle sind die "Privatangelegenheit" einer Schicht. Es wird weder von höheren noch von niederen Schichten auf diese Einfluss genommen. Seminararbeit - Netzwerkprogrammierung 2) Dienst Ein Dienst ist die Semantik einer Schicht. Ein Dienst beschreibt, was eine Schicht, auch unter Verwendung weiterer niederer Schichten, der nächst höheren Schicht an Leistung anbietet und ihr so als Werkzeug zur Verfügung steht. Der Dienst den Schicht Eins in unserem Beispiel anbietet ist die Übermittlung des Übersetzerpaketes an den anderen Übersetzer. Dieser kann anhand der Pakete, die er bekommt, nicht feststellen, wie die niederen Schichten diese Übermittlung realisiert haben. 3) Schnittstelle Die Schnittstelle bezeichnet den Kommunikationspunkt mit der nächst höheren Schicht. Diese ist am ehesten anhand unseres Beispiels zu erklären, indem man sich vorstellt, dass Übersetzer "B" eine kleine Nachricht an seine Übersetzung klammert in der er Philosoph "B" über mögliche Übersetzungsvariationen/Fehler informiert. C. Das TCP/IP Referenzmodell Das TCP/IP-Modell basiert auf der Idee der Schichten wie sie in dem Beispiel des Philosoph-Übersetzer-SekretärinProblems erläutert sind. Die "Defense Advanced Research Projects Agency" des US-Amerikanischen Verteidigungsministeriums (DoD) entwickelte ca. 1970 Protokolle zur Datenübertragung und Kommunikation. Hierbei entstand das sog. "DoD-Schichtenmodell". Dieses Modell wurde entwickelt, um ein rein militärisches dezentrales Netz aufzubauen, dass durch seine Struktur von hoher Ausfallsicherheit gekennzeichnet ist. In Kombination mit der Internetprotokollfamilie (IP) ergibt sich das TCP/IPReferenzmodell, was die frühe Grundlage des Internets darstellt. Es basiert auf vier Schichten die nachfolgend in Abbildung 2 dargestellt sind: 2 zusammenhält. Diese Schicht ermöglicht es jedem Host Pakete in jedes beliebige Netz einzuspeisen und diese werden unabhängig voneinander zum Ziel transportiert. Eine eventuell nötige Neuordnung der Pakete ist hierbei Aufgabe höher liegender Schichten. Die Internetschicht definiert ein offizielles Paketformat und Protokoll namens "IP"(Internet Protocol). Es ist Aufgabe der Schicht, diese IP-Pakete korrekt zuzustellen. Sog. "Paket-Routing" und das Vermeiden von Überlastungen sind hier die wichtigsten Begriffe. 3) Transport Layer Das "Transport Layer" oder auch "Transportschicht" ermöglicht, natürlich unter Verwendung der niederer gelegenen Schichten, gleichgestellten Einheiten auf zwei Hosts die Kommunikation. Hierzu wurden zwei Endpunktzu-Endpunkt-Übertragungsprotokolle definiert. "TCP" (Transmission Control Protocol), ein zuverlässiges, verbindungsorientiertes Protokoll, über das ein Bytestrom fehlerfrei einem anderen Rechner zugestellt wird. Das zweite Protokoll "UDP" (User Datagram Protocol), ist ein unzuverlässiges, verbindungsloses Protokoll. Dieses Protokoll ist für Anwendungen vorgesehen, die die Sicherstellung der Reihenfolge, sowie die Flusskontrolle lieber selbst bereitstellen. 4) Application Layer Das "Application Layer" oder auch "Anwendungsschicht" umfasst sämtliche Protokolle deren sich Anwendungen bedienen. Angefangen bei "TELNET", ein frühes Protokoll um sich an einem entfernten Rechner anzumelden, um auf ihm zu arbeiten, über "FTP"(File Transfer Protocol) um Dateien zu übertragen bis hin zu E-Mail-Protokollen, wie "SMTP"(Simple Mail Transfer Protocol) um E-Mails zu übertragen. Im Laufe der Zeit sind sehr viele weitere Protokolle hinzugekommen, wie zum Beispiel: "HTTP"(HyperText Transfer Protocol) zum Abruf von Webseiten aus dem "World Wide Web" oder "DNS"(Domain Name Service) zur Zuordnung von Hostnamen an deren Netzwerkadressen. Zu beachten ist hierbei die Aufteilung in die sog. "Transportschichten"(Physical Layer, Internet Layer und Transport Layer) und die "Anwendungsschicht"(Application Layer). Die Netzwerkprogrammierung beschäftigt sich nicht mit der Funktionsweise der Transportschichten, sondern nutzt lediglich den durch diese Schichten bereitgestellten Dienst. Abbildung 2 TCP/IP-Modell 1) Physical Layer Das "Physical Layer" oder auch "Netzzugangsschicht" enthält keine Protokolle aus der Internetprotokollfamilie. Aus Sicht der Netzwerkprogrammierung betrachtet man diese Schicht eher als Platzhalter für Techniken der Datenübertragung von Punkt zu Punkt. 2) Internet Layer Das "Internet Layer" oder auch "Internetschicht" ist die entscheidende Schicht und die Schnur die alles D. Das OSI-Referenzmodell Das OSI-Referenzmodell ist ein, im Vergleich zum TCP/IP-Modell, verfeinertes Modell. Es wurde 1979 mit der Entwicklung begonnen und 1983 hat die Internationale Organisation für Normung (ISO) das Modell standardisiert. Es basiert, ebenfalls wie das TCP/IP-Modell, auf der Idee der Schichten und man unterscheidet ebenfalls zwischen den "Transportschichten" (Schicht eins bis vier) und den "Anwendungsschichten" (Schicht fünf bis sieben). Das OSIModell arbeitet wesentlich klarer mit Begriffen wie Protokoll, Dienst und Schnittstelle, welche sogar die grundlegenden Konzepte des OSI-Modells darstellen und ist Seminararbeit - Netzwerkprogrammierung wesentlich universeller einsetzbar, da hier, im Gegensatz zum TCP/IP-Modell, das Konzept vor den entsprechenden Protokollen entwickelt wurde. So ist es zum Beispiel nicht möglich, Bluetooth mit dem TCP/IP-Modell zu beschreiben. Es gibt allerdings durchaus starke Ähnlichkeiten zwischen den beiden hier angeführten Modellen, was allein schon in der Namensgebung der nachfolgend in Abbildung 3 gezeigten Schichten deutlich wird. 3 2) Presentation Layer Das "Presentation Layer" oder auch "Darstellungsschicht" beschäftigt sich im Unterschied zu den unteren Schichten, welche vor allem mit der Bitübertragung beschäftigt sind, mit der Syntax und der Semantik der zu übertragenden Informationen. Damit Computer mit unterschiedlichen Datendarstellungen kommunizieren können, werden die ausgetauschten Datenstrukturen auf abstrakte Weise definiert. Die Darstellungsschicht verwaltet diese Datenstrukturen und ermöglicht somit den Austausch von Datenstrukturen auf höheren Ebenen. 3) Application Layer Das "Application Layer" oder auch "Anwendungsschicht" enthält wie die gleichnamige Schicht des TCP/IP-Modells eine Vielzahl von Protokollen. So sind "HTTP", "SMTP" und "FTP" auch im OSI-Modell in der Anwendungsschicht beheimatet. II. UMGANG MIT DEN TRANSPORTSCHICHTEN Wie schon vorangegangen erläutert, ist aus Sicht der Netzwerkprogrammierung die genaue Funktionsweise der Transportschichten von sekundärer Wichtigkeit, da nur die durch die Transportschichten angebotenen Dienste genutzt werden. Um diese Dienste nutzen zu können, ist jedoch ein grundlegendes Verständnis unabdingbar. Hierzu werden nachfolgend die wichtigsten Punkte vorgestellt. Abbildung 3 OSI-Modell Auch hier werden die Protokolle der Internetprotokollfamilie verwendet. So ist "IP" hier der Schicht drei zuzuordnen. "TCP" und "UDP" finden sich in Schicht vier. Für die Netzwerkprogrammierung interessant sind hier die Schichten fünf bis sieben, welche in ihrer Gesamtheit der Anwendungsschicht des TCP/IP-Modells relativ ähnlich sind. 1) Session Layer Das "Session Layer" oder auch "Sitzungsschicht" ermöglicht es Benutzern Sitzungen untereinander aufzubauen. Sitzungen bieten verschiedene Dienste an, wie zum Beispiel "Dialog Control", welcher verfolgt wer gerade Daten senden darf, oder "Token Management" welcher verhindert, dass zwei Parteien wichtige Operationen zur gleichen Zeit durchführen. Interessant ist hier noch "Synchronization" welcher bei langen Übertragungen sog. "Checkpoints" setzt, ab denen die Übertragung nach einem Absturz wieder aufgenommen werden kann. A. Internet Protocol Das "IP" ist, wie schon angeführt, der Netzwerkschicht zugeordnet und ermöglicht die Zustellung von Datenpaketen an den Zielhost. Diese Pakete können unterschiedliche Wege durch das Netzwerk wählen, was aus ihrer völligen Eigenständigkeit resultiert. Dies kann zur Folge haben, dass Pakete verloren gehen oder/und Pakete in der falschen Reihenfolge am Zielhost ankommen. Die Reorganisation ist hierbei höheren Schichten überlassen. Um die Paketzustellung zu ermöglichen, hat jeder Host (anwählbarer Computer des Netzes) im Netzwerk eine sog. "IP-Adresse", wie zum Beispiel:"192.168.2.45". Diese Adressen bestehen aus vier, durch Punkte getrennte, sog. "Oktetten". Der Name "Oktett" erklärt sich durch die Tatsache, dass jedes Oktett eine achtstellige Binärzahl repräsentiert. Genau wie im Beispiel "Philosoph-Übersetzer-SekretärinProblem" haben auch diese "IP-Pakete" einen "Header". Dieser enthält unter anderem die Absenderadresse und die Zieladresse. Der, diesem Header nachfolgende, "Datenteil" des Paketes, ist dann das wieder mit einem "Header versehene TCP oder UDP-Paket. B. Transportprotokolle Zur Transportschicht werden nachfolgend die zwei bekanntesten Protokolle, TCP und UDP. Beide sind sog. "Endpunkt-zu-Endpunkt" Protokolle. Diese Endpunkte werden durch sog. "Sockets" dargestellt. Jedem Socket ist eine sog. "Portnummer" zugeordnet. Diese Portnummern sind normale Integerwerte zwischen 0 und 65535. Jeder Seminararbeit - Netzwerkprogrammierung Socket, als möglicher Endpunkt einer Verbindung im Netzwerk ist durch eine IP-Adresse und eine Portnummer eindeutig identifiziert. Desweiteren kann ein Socket Endpunkt mehrerer Verbindungen sein. 1) Transmission Control Protocol TCP ist ein Protokoll zur Bereitstellung eines zuverlässigen Bytestroms zwischen zwei Endpunkten. TCPVerbindungen sind Duplex-Verbindungen, was bedeutet, dass der Verkehr gleichzeitig in beide Richtungen fliesen kann. Für die Netzwerkprogrammierung ist zu TCP zu sagen, dass es eine Verbindung herstellt, welche garantiert, dass die Pakete in der richtigen Reihenfolge ankommen. Eventuell verlorene Pakete werden erkannt und erneut gesendet. 2) User Datagram Protocol UDP ist im Gegensatz zu TCP ein verbindungsloses Protokoll. Es ist an sich recht schlank, da es im Wesentlichen aus den im Header der UDP-Pakete stehenden Portnummern besteht. UDP kann zum Beispiel für kurze Serveranfragen verwendet werden. Sendet beispielsweise ein Client (der anfragende Computer) eine kurze Anfrage an einen Server (der antwortende Computer) und dieser sendet ebenfalls eine kurze Antwort zurück, so ist der aufwändiger Aufbau einer TCP-Verbindung zwar möglich, sprengt jedoch weit den nötigen Rahmen. Sollte doch einmal ein UDP-Paket verloren gehen, so kann beim Sender ein Timer ablaufen, der definiert, nach welcher Zeit eine Antwort hätte erfolgen müssen. In diesem Fall wird das Paket erneut versandt. C. Umsetzung in C# Zur Verdeutlichung des zuvor beschriebenen hier nachfolgend ein kleines Beispiel in C#. Hier die Funktionsweise eines TCP Clients unter der Verwendung der .Net Socket Klasse: 1) Aufruf des Socket-Konstruktors sock=new Socket(AdressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); Um das das "Internet Protocol" zu verwenden, wird als Adressfamilie die "InterNetwork"-Familie gesetzt. Da TCP einen Bytestream realisiert wird der als Socket-Typ "Stream" gesetzt und natürlich der Protokolltyp "TCP" für einen TCPVerbindung. 2) Aufruf der Connect()-Methode sock.Connect(serverEndpoint); Der Methode wird eine Instanz von "IPEndPoint" übergeben. Dieses Objekt stellt die Kontaktdaten des anderen Endpunktes der Verbindung dar, wie IP-Adresse und Portnummer. 4 3) Senden und mit Send() sock.Send(byteBuffer, 0, byteBuffer.Length, SocketFlags.None); Hier stellt byteBuffer das Array dar, dass die zu sendenden Daten beinhaltet. An zweiter Stelle steht der Index des ersten Elementes im Array, das gesendet werden soll. An dritter Stelle die Anzahl der Bytes die gesendet werden sollen und an vierter Stelle können bei Bedarf Flags gesetzt werden, die aber hier zu weit hinein gehen. Für das Beispiel werden aus diesem Grund keine gesetzt. 4) Schliesen des Sockets sock.Close(); Ein Socket wird durch den schlichten Aufruf der Methode Close() geschlossen. Dieser Aufruf sollte in einem "finally"Block stehen. III. NETZWERKPROGRAMMIERUNG AUF HÖHEREN EBENEN Eine Implementierung einer größeren Anwendung direkt am Puls der Transportschichten ist sehr arbeitsintensiv, unübersichtlich und auch in den Möglichkeiten beschränkt. Aus diesem Grund wird dies auch nicht wirklich praktiziert und es werden stattdessen schon vorhandene Frameworks, Interfaces oder ähnliches verwendet. Man spricht von sog. "Middleware". Middleware läuft sozusagen über der Anwendungsschicht und nutzt Dienste der Anwendungsschicht. Es ist möglich diese Middleware in drei grobe Bereiche zu unterteilen. Zum einen wäre hier die "kommunikationsorientierte" Middleware, zum zweiten die "anwendungsorientierte" Middleware und zuletzt die "nachrichtenorientierte" Middleware. A. Die drei Typen von Middleware Zuerst eine kurze Beschreibung der Bereiche bevor weiterführend einige Inhalte näher besprochen werden. 1) Kommunikationsorientierte Middleware Bei kommunikationsorientierter Middleware liegt der Schwerpunkt auf der Abstraktion der transportschichtennahen Netzwerkprogrammierung. Beispiele sind hier "RPC" (Remote Procedure Call), JavaRMI (Remote Method Invocation) oder auch "Webservices". a) Remote Procedure Call Ein Remote Procedure Call ist sinngemäß ein Aufruf einer entfernten Prozedur. Diese Technik ermöglicht die Interprozesskommunikation. Hierbei laufen die aufgerufenen Funktionen in der Regel auf anderen Computern. b) Java Remote Method Invocation JavaRMI ist der Aufruf einer Methode eines entfernten Java-Objekts und realisiert die Java-eigene Art des Remote Procedure Call. "Entfernt" bedeutet hierbei, dass sich das Seminararbeit - Netzwerkprogrammierung Objekt auf einer anderen Java Virtual Machine befinden kann, die ihrerseits auf einem entfernten Rechner oder dem lokalen Rechner laufen kann. Dabei sieht der Aufruf für das aufrufende Objekt (bzw. dessen Programmierer) genauso aus wie ein lokaler Aufruf. Es müssen jedoch besondere Ausnahmen abgefangen werden, wie zum Beispiel ein Verbindungsabbruch. c) Webservices Webservices unterstützen die Zusammenarbeit zwischen Anwendungsprogrammen, die auf unterschiedlichen Plattformen und/oder Frameworks betrieben werden. Ein Webservice ist eine Software-Anwendung, die mit einem Uniform Resource Indetifier (URI) eindeutig identifizierbar ist und deren Schnittstelle als XML-Artefakt definiert, beschrieben und gefunden werden kann. Er unterstützt die direkte Interaktion mit anderen Software-Agenten unter Verwendung XML-basierter Nachrichten durch den Austausch über Protokolle der Internetprotokollfamilie. 2) Anwendungsorientierte Middleware Anwendungsorientierte Middleware unterstützt neben der Kommunikation vor allem verteilte Anwendungen, also Programme, die auf mehreren Rechnern/Prozessoren ablaufen. Solche Anwendungen entstehen zum Beispiel durch horizontale Schnitte durch das Softwareschichtenmodell. Die Aufgabe des Gesamtsystems wird also auf einzelne Softwarekomponenten aufgeteilt, die untereinander Informationen austauschen. Beispiele für solche anwendungsorientierte Middleware sind allgemeine Architekturen, wie "CORBA"(Common Object Request Broker Architecture), "JEE"(Java Platform, Enterprise Edition) oder die ".Net-Platform" a) Common Object Request Broker Architecture" Die "Common Object Request Broker Architecture" (CORBA) ist eine Spezifikation für eine objektorientierte Middleware, deren Kern ein sog. Object Request Broker, der ORB, bildet und die plattformübergreifende Protokolle und Dienste definiert. CORBA-konforme Implementierungen vereinfachen das Erstellen verteilter Anwendungen in heterogenen Umgebungen, also Umgebungen in denen mehrere unterschiedliche Softwaresysteme zusammenarbeiten. b) Java Platform, Enterprise Edition Die Java Plattform, Enterprise Edition ist eine Spezifikation der Softwarearchitektur für die Ausführung transaktionsbasierter, in Java programmierter Anwendungen. Sie ist eine der großen Plattformen, die um den MiddlewareMarkt kämpft. Größter Konkurrent ist dabei die .NetPlatform von Microsoft. Die Spezifikation dient dazu, einen allgemein akzeptierten Rahmen zur Verfügung zu stellen, um auf dessen Basis aus modularen Komponenten verteilte, mehrschichtige Anwendungen entwickeln zu können. Klar definierte Schnittstellen zwischen Komponenten und Containern sollen dafür sorgen, dass Softwarekomponenten unterschiedlicher Hersteller vereinbar sind, wenn sie die Spezifikation 5 einhalten, und dass die verteilte Anwendung gut skalierbar ist. c) .Net-Platform Microsoft bietet mit der .Net-Plattform gleich vier übergreifende Ansätze. Zum Einen eine moderne Implementierung des neuen Industriestandards "XMLWebservices". Eine Struktur für verteile Programme, im LAN, aber mit zunehmender Bedeutung auch für nichtkommerzielle Anwendungsgebiete im Internet. Desweitern die "Windows Communication Foundation" (WCF), die ".Net Remoting Services" und die ".Net Enterprise Services". Letztere sollen eine Konkurrenztechnik zur erfolgreichen Java Platform, Enterprise Edition sein. Die Windows Communication Foundation fasst die verschiedenen Kommunikationstechnologien "DCOM", "Enterprise Services", "MSMQ", "WSE" und Webservices unter einer einheitlichen API zusammen. Das Hauptanwendungsgebiet der WCF liegt in der Entwicklung von "Service-orientierter Architekturen" (SOA). 3) Nachrichtenorientierte Middleware Nachrichtenorientierte Middleware arbeitet nicht mit Methoden- oder Funktionsaufrufen, sondern über den Austausch von Nachrichten (messages). Das Nachrichtenformat gibt hier die eingesetzte Middleware vor. Eine nachrichtenorientierte Middleware kann sowohl synchron als auch asynchron arbeiten. Bei einer asynchronen Variante wird eine Warteschlange verwendet, in die der message-Produzent seine Nachrichten stellt. Ein Konsument kann die Nachrichten dann konsumieren. Vorteile sind unter anderem die vollständige Entkopplung von Nachrichtensender und -empfänger und dass Anwendungen auch weiterarbeiten können, wenn Teilkomponenten ausgefallen sind. Eine Beispiel-Architektur wäre der "Java Message Service" (JMS). a) Java Message Service Der Java Message Service ist eine durch die Java Community Process genormte API für die Ansteuerung einer nachrichtenorientierten Middleware zum Senden und Empfangen von Nachrichten aus einem Client heraus, der in der Programmiersprache Java geschrieben ist. JMS ermöglicht verteilte Kommunikation, welche lose gekoppelt, verlässlich und asynchron läuft. Für die Anwendung braucht man einen Provider, der die API umsetzt und somit den Dienst bereitstellt. Dafür gibt es sowohl kommerzielle Produkte, als auch Open-Source-Projekte. Beispiele wären hier der kommerzielle "Sun GlassFish Message Queue" von Sun Microsystems, der kommerzielle "WebsphereMQ" von IBM oder das Open-Source-Projekt "OpenJMS". Zu unterscheiden ist hier zwischen zwei Betriebsmodi. "Eigenständig" und "eingebettet". Wobei "eigenständig" bedeutet, dass der Provider als eigenständiger Prozess läuft und die Kommunikation beispielsweise über TCP/IP stattfindet. "Eingebettet" bedeutet der Provider läuft in der selben Java Virtual Machine. Ein Vorteil ist hier die schnellere Datenübertragung. Seminararbeit - Netzwerkprogrammierung B. Detailliertere Vorstellung einiger Technologien Abschließend zu dem Thema Middleware werden nachfolgend noch zwei vorangegangen erwähnte Technologien genauer erläutert um den Umgang aus Sicht des Programmierers darzustellen. 1) Common Object Request Broker Architecture Die CORBA-Spezifikation ist an keine bestimmte Programmiersprache gebunden. Vielmehr sind die Softwarehersteller oder Communities aufgerufen, auf der Grundlage dieser Spezifikation eigene Object-RequestBroker-Implementierungen zu erstellen. Ein Object-Request-Broker (ORB) ist ein Vermittler, der die Kommunikation von Objekten innerhalb eines verteilten Systems ermöglicht. Er ist sowohl betriebssystem- als auch programmiersprachenunabhängig. Die Aufgaben des ORBs bestehen unter anderem darin, Daten zu senden bzw. zu empfangen. Da Datenobjekte auf Quell- und Zielsystem unterschiedliche Darstellungen besitzen können, sorgt sog. "Marshalling" für die Umwandlung in ein eindeutiges Übertragungsformat. Unter Marshalling versteht man das Umwandeln von Daten in ein Format, das die Übermittlung an andere Prozesse ermöglicht. Auf der Empfängerseite werden aus diesem Format die Daten in ihrer ursprünglichen Struktur wiederhergestellt, was als "Unmarshalling" bezeichnet wird. Eine in der Praxis oft verwendete Form des Marshallings ist die Technik Objekte in das XML-Format umzuwandeln und auf Empfängerseite wieder als Objekt im Speicher aufzubauen. Wie entsteht nun eine CORBA-Anwendung? Der erste Schritt besteht üblicherweise in der Festlegung der Objektschnittstellen auf Basis einer "Interface Definition Language"-Spezifikation. Diese "Schnittstellendefinitionssprache" ermöglicht es, Objekte und die auf sie anwendbaren Methoden mitsamt den möglichen Parametern und Datentypen zu beschreiben, ohne dabei die Eigenschaften einer bestimmten Programmiersprache zu verwenden. Diese Sprache dient rein der Beschreibung, nicht jedoch der Formulierung von Algorithmen. Ist die IDL-Spezifikation festgelegt, können Entwickler unabhängig voneinander den Client und den Server in ihrer bevorzugten Programmiersprache entwickeln. Liegen diese Implementierungen vor, folgt deren Übersetzung zu einer ausführbaren Datei. In einem Zwischenschritt werden aus der IDLSpezifikation mit Hilfe eines sog. "IDL-Compilers" die sog. "Stellvertreterobjekte" generiert. Auf Clientseite existiert ein Stellvertreter des Servers. Dieser Stellvertreter bietet das gleiche API wie der Server selbst an. Seine Aufgabe besteht unter anderem darin, alle aktuellen Parameter über einen Kommunikationskanal in den entfernten Adressraum des Servers zu übertragen. Dort nimmt ein Stellvertreter des Clients die Daten entgegen und führt den eigentlichen Aufruf auf dem Server aus. Diese Stellvertreterobjekte sind von außen nicht von ihren "Originalen" unterscheidbar. Der Stellvertreter des Servers im Adressraum des Clients wird "Stub" genannt und der 6 Stellvertreter des Clients im Adressraum des Servers wird "Skeleton" genannt. Für die Generierung der Stellvertreterobjekte muss der IDL-Compiler des jeweiligen ORB verwendet werden. Der CORBA-Standard schreibt nicht vor, dass die Stellvertreterobjekte portabel über verschiedene ORBImplementierungen sein müssen. Die ausführbare Programmdatei einer CORBAAnwendung besteht somit aus drei Komponenten: 1. Der anwendungsspezifische Teil wird vom Entwickler beigesteuert und implementiert die Anwendungslogik. 2. Die Stellvertreterobjekte werden mit Hilfe eines IDLCompilers automatisch aus einer IDL-Spezifikation generiert. 3. Die generische Funktionalität des ORB-Kerns, die in Form einer Programmbibliothek zur Anwendung gebunden wird. 2) Webservices Client-Programme senden im Allgemeinen Anfragen an einen Webservice, und dieser antwortet mit der gewünschten Information. Es wird daher gelegentlich behauptet, dass Webservices für Rechner das sind, was Webseiten für den Menschen sind. Auch wenn das nur einen Teil der Möglichkeiten des Webservices beschreibt, ist dieser Vergleich durchaus zutreffend. Webservices sind nicht für menschliche Benutzer gedacht, sondern für Softwaresysteme, die automatisiert Daten austauschen und/oder Funktionen auf entfernten Rechnern aufrufen. Die grundlegenden Komponenten einer Serviceorientierten Architektur sind: Kommunikation, Dienstbeschreibung und Verzeichnisdienst. In einer Webservice-Architektur werden diese Komponenten mithilfe der folgenden Spezifikationen beschrieben: -SOAP beschreibt das XML-basierte Nachrichtenformat der Kommunikation und dessen Einbettung in ein Transportprotokoll. -WSDL ist eine ebenfalls XML-basierte Metasprache, um Webservices (Dienste) zu beschreiben. -UDDI beschreibt einen Verzeichnisdienst für Webservices. UDDI spezifiziert eine standardisierte Verzeichnisstruktur für die Verwaltung von Webservice-Metadaten. Zu den Metadaten zählen allgemeine Anforderungen, WebserviceEigenschaften oder die benötigten Informationen zum Auffinden von Webservices. Abbildung 4 Webservice-Architektur Seminararbeit - Netzwerkprogrammierung In vorangegangener Abbildung vier ist der Zusammenhang dieser Komponenten deutlich gemacht. Deutlich zu erkennen ist, wie der Client oder Servicekonsument über WSDL den Webservice in einer UDDI-Verzeichnisstruktur lokalisiert und anschließend über SOAP mit ihm kommuniziert Nachfolgend werden diese drei Komponenten erläutert. a) Simple Object Access Protocol Das "Simple Object Access Protocol" (SOAP) ist ein Protokoll zum Austausch XML-basierter Nachrichten über ein Computernetzwerk. Es regelt, wie Daten in der Nachricht abzubilden und zu interpretieren sind und gibt eine Konvention für entfernte Prozeduraufrufe mittels SOAPNachrichten vor. SOAP macht keine Vorschriften zur Semantik applikationsspezifischer Daten, die versendet werden sollen. Es stellt lediglich ein Framework zur Verfügung. Zum Senden der Nachrichten können beliebige Transportprotokolle verwendet werden, wie FTP, SMTP, HTTP oder auch JMS. In der Praxis wird jedoch meist auf HTTP zurückgegriffen. Der Aufbau einer SOAP-Nachricht sieht wie folgt aus: Eine SOAP-Nachricht ist ein XML-Dokument, das aus drei Teilen besteht. "SOAP Envelope", "SOAP Header" und "SOAP Body". (1) SOAP Envelope Der SOAP Envelope ist vergleichbar mit einem Briefumschlag. Der Envelope bildet das Wurzelelement des XML-Dokuments. In ihm sind die anderen beiden Teile der SOAP-Nachricht gekapselt. Zu Veranschaulichung hier die Struktur: <env: Envelope xmlns:env="http://www.w3.org/2003/05/soapenvelope"> <!- SOAP Header --> <!- SOAP Body --> </env:Envelope> Mit der Wahl des URI http://www.w3.org/2003/05/soapenvelope wird festgelegt, welche Version der SOAPSpezifikation in der konkreten SOAP-Nachricht verwendet wird. (2) 7 <env:Header> m:authentication xmlns:m="http://www.soabuch.de/Annahme env:role="http://www.soa-buch.de/Admin" env:mustUnderstand="true"> <m:security-token> afmaafdjioq230923 </m:secutiy-token> </authentication> <n:authorization xmlns:n="http://www.soa-buch.de/Annahme" env:role="http://www.soa-buch.de/Admin" env:mustUnderstand="true"> <n:rights> 110101101 </n:rights> </authorization> </env:Header> In diesem Beispiel besteht der SOAP-Header aus sicherheitsrelevanten Informationen. Im ersten Kindelement "authentication" wird Code übertragen, der den Absender identifiziert ("security token"). Das zweite Kindelement "authorization" enthält kodierte Informationen über die Rechte des Absenders. Das Übertragen von Sicherheitsinformationen ist ein typisches Anwendungsgebiet für den SOAP-Header. (3) SOAP Body Das zweite Kindelement einer SOAP-Nachricht ist der SOAP-Body. Dieser ist zwingend erforderlich und muss auch immer genau mit "Body" bezeichnet werden. Wie alle XMLElemente unterscheiden auch die Elementbezeichner der SOAP-Spezifikation Großund Kleinschreibung. Nachfolgend ist der Aufbau des SOAP-Body einer SOAPNachricht dargestellt: <env:Body> <m:nutzlast xmlns:m="http://www.soa-buch.de/"> <m:msg> Hier steht die eigentliche Information die transportiert werden soll!!! </m:msg> </m:nutzlast> </env:Body> SOAP Header Der erste Teil einer SOAP-Nachricht ist der SOAPHeader. Ein SOAP-Header kann genau einmal in einer SOAP-Nachricht vorkommen, und zwar ausschließlich als erstes Kindelement des SOAP-Envelopes. Der Inhalt des SOAP-Headers ist nicht in der SOAP-Spezifikation definiert, diese stellt lediglich die Möglichkeit zur Verfügung, den Header durch weitere Informationen anzureichern. Mögliche Inhalte des SOAP-Headers sind üblicherweise begleitende Spezifikationen. Zur Veranschaulichung hier ein Beispiel zur Struktur eines SOAP-Headers: Der SOAP-Body enthält die zu übertragende Information, das heißt die eigentlichen Nutzdaten der Nachricht. Wie in den Beispielen zu sehen ist, wird in einer SOAP-Nachricht intensiver Gebrauch von XML-Namensräumen gemacht. Für den Inhalt dieses SOAP-Body ist dies jedoch nicht zwingend notwendig. Für komplizierter aufgebaute Nachrichten ist dies jedoch unabdingbar, da sich ansonsten die Struktur kaum noch eindeutig formulieren ließe. Der Inhalt des SOAP-Body selbst muss ein wohl geformtes XML-Dokument darstellen - mit Ausnahme des Prologs, der an dieser Stelle nicht vorhanden sein darf. Der Seminararbeit - Netzwerkprogrammierung eigentliche Inhalt wird hier nicht näher spezifiziert, da dieser anwendungsbezogen variiert. Mit SOAP lassen sich alle Informationen verschicken, die sich als XML-Dokument darstellen lassen. Beispiele dafür sind HTML-Seiten, PDF-Dokumente, Verträge und Bestellformulare. Problematisch wird jedoch der Versand binärer Daten, da diese nicht unmittelbar als XML dargestellt werden können. 8 (1) (2) b) WebService Description Language Die WSDL ist eine XML-Metasprache zur Beschreibung von Webservice-Schnittstellen. Es werden im wesentlichen Operationen definiert, die von außen zugänglich sind, sowie Parameter und Rückgabewerte dieser Operationen. Webservices werden in der WSDL aus zwei Blickwinkeln beschrieben: abstrakt auf der Ebene der Funktionalität und konkret auf der Ebene der technischen Details. Hierzu wird die Beschreibung der Funktionalität, die ein Webservice anbietet, von den technischen Details über den Ort und die Art und Weise, wie ein Dienst angeboten wird, getrennt. Die Konstrukte der WSDL ermöglichen es hierbei, einzelne Bestandteile der abstrakten oder konkreten Beschreibung im anderen Kontext wiederzuverwenden. Für die Beschreibung eines Dienstes stehen der WSDL folgende Komponenten zur Verfügung: "Operation", "Message Exchange Pattern" und "Interface" für die abstrakte Beschreibung sowie "Binding", "Endpoint" und "Service" für die konkrete Beschreibung. Im Allgemeinen interessante Komponenten sind hierbei: "Interface", welche die abstrakte Funktionalität selbst beschreibt, "Binding", welche beschreibt, wie der Dienst aufgerufen wird, und "Service", welche beschreibt, wo der Dienst sich befindet. Die Anordnung der Komponenten in der WSDL-Datei ist an keine bestimmte Reihenfolge gebunden. Die einzige Ausnahme ist das "Description"-Element, das als Wurzelelement des XML-Dokuments an erster Stelle im Dokument steht. c) Universal Description Discovery & Integration Das "Universal Description Discovery & Integration"Prinzip ermöglicht, stark vereinfacht ausgedrückt, das Veröffentlichen und Auffinden eines Webservices im Web. Dazu stellt der Anbieter die WSDL-Beschreibung seines Dienstes in das UDDI-Verzeichnis (eine Datenbank). Ein potentieller Nutzer kann diesen Dienst im UDDI-Verzeichnis finden und die Schnittstellenbeschreibung in Form eines WSDL-Dokuments anfordern. Einen vereinfachten Zugang zum Prinzip von UDDI erhält man durch den Vergleich mit der Funktionsweise von Telefonbüchern. Ein Telefonbuch entspricht dabei einer der vier Haupttabellen der UDDI-Datenbank. Diese Haupttabellen werden gemäß des Sprachgebrauchs in Datenbanken als "Entitäten" bezeichnet". "White Pages" Mithilfe der White Pages können Unternehmen Informationen über sich selbst bereitstellen. Über diese Informationen kann ein potentieller Nutzer eine erste Entscheidung fällen, ob der den Dienst dieses Unternehmens nutzen möchte. "Yellow Pages" Sollte der Name des Unternehmens nicht bekannt sein, so kann der Nutzer überprüfen, in welche Kategorie ein potentieller Dienstanbieter gehört. Mit Hilfe dieser Entität erhält der Nutzer die Dienste aller Anbieter nach Branchen gruppiert. (3) "Green Pages" Mit der Entität der Green Pages können Beschreibungen zu jedem einzelnen Dienst hinterlegt werden. Sollte ein Nutzer also wissen, welchen Dienst er benötigt, aber keinen entsprechenden Anbieter kennen und/oder nicht weis zu welcher Branche besagter Anbieter gehört, kann er jeden Service von Hand durchsuchen. (4) "Service Type Registration" Während die Green Pages primär für den menschlichen Gebrauch bestimmt sind, finden sich in der Service Type Registration die Informationen in maschinenlesbarer Form. Beide Entitäten verweisen aufeinander. LITERATUR [1] Tanenbaum, Andrew S.: Computernetzwerke. Prentice Hall, Pearson Studium, 2003, S. 1-605 [2] Peterson, Larry L.; Davie, Bruce S.: Computernetze. dpunkt.verlag, 2003, S 232-382 [3] Kühnel, Andreas: Visual C# 2010 - Das umfassende Handbuch. Galileo Computing, 2010, S. 29-44, 703-711 [4] Puder, Arno; Römer, Kay: Middleware für verteilte Systeme - Konzepte und Implementierung anhand der CORBA Plattform MICO. dpunkt.verlag, 2001, S-37-46 [5] Makofske, David B.; Donahoo, Michael J.; Calvert, Kenneth L.: TCP/IP Sockets in C# - Practical Guide for Programmers. ELSEVIER, 2004, S.6-56 [6] Melzer, Ingo: Service-orientierte Architekturen mit Web Services. Spektrum, 2010, S.62-117 [8] Ullenboom, Christian: Java ist auch eine Insel´- Das umfassende Handbuch. Galileo Computing, 2009, S.1145-1230 [9] Weerawarana, Sanjiva; Curbera, Francisco; Leymann, Frank; Storey, Tony; Ferguson, Donald F.: WebServices Platform Architecture. Prentice Hall, 2008,S.1-171 [9] Bildquelle: http://holger.euhm.de/Uni/DplAr/img66.gif [10] Bildquelle: http://www.heftrich.de/gloss/images /tcpip_dod1.gif [11] Bildquelle: http://upload.wikimedia.org/wikipedia/de/9/ 95/Webservice.png [12] Bildquelle: http://www.hsgkl.de/faecher/inf/netze /schicht/tanenbaum36.gif