Was sind eigentlich Sockets?

Sockets sind sowohl ein Konzept als auch eine Software-Schnittstelle:


Die Metapher

Der Name Socket (dt. Stecker) ist Programm:


Lebenszyklus eines Sockets

Will ein Client-Prozess (Rechner, Programm ... ) mit einem Server-Prozess mittels solcher Sockets kommunizieren, muss er

Ein Server-Prozess muss nun, damit der Client ihn finden kann:

Wird nun vom Server-Prozess eine solche Verbindungsanforderung empfangen, muss er also

Vereinfachend kann man also sagen, dass ein Socket-Server sich von einem Socket-Client darin unterscheidet,


Definition Socket

Ein Socket ist ein Kommunikationsendpunkt (ein Objekt), durch das Datenpakete sowohl gesendet als auch empfangen werden (bidirektionaler Datenfluss). Man unterscheidet dabei zwei verschiedene Typen von Sockets:
  • Streamsockets (TCP Sockets = Transmission Control Portocol)
  • Datagrammsockets (UDP Sockest = User Datagramm Protocol)

Streamsockets

Sockets des Typen Streamsocket sind verbindungsorientiert und zuverlässig. Verbindungsorientiert bedeutet in diesem Fall, dass zwischen den beiden beteiligten Prozessen stets eine feste Verbindung gegeben ist. Diese feste Verbindung bei der Kommunikation gewährleistet, dass ein kontinuierlicher Datentransport in Form eines „Byte-Stroms“ vorhanden ist, was vor allem den Transport von besonders großen Datenmengen ermöglicht. Vergleichbar mit einer Standleitung, besteht die kontinuierliche Verbindung bis einer der beiden Kommunikationspartnern die Verbindung beendet und somit den Datenaustausch unterbricht.

Die Zuverlässigkeit der Streamsockets ergibt sich dadurch, dass bei jedem Datenaustausch die gesendeten Daten garantiert in der abgesendeten Reihenfolge ankommen. Die Kommunikation anhand der Steamsockets ist mit einem Telefonat zu vergleichen und ist den Datagrammsockets vorzuziehen wenn der Datenempfang unbedingt gewährleistet sein muss und große Datenmengen übertragen werden. Das Internet basiert z. B. auf diesem Sockettyp anhand des TCP/IP Protokolls.

Datagrammsockets

Im Gegensatz zu den Streamsockets sind Datagrammsockets verbindungslos und garantieren keine Zuverlässigkeit. Die Kommunikation anhand der Datagrammsockets erfolgt anhand des Versand von Paketen. Da zwischen den Kommunikationspartnern keine feste Verbindung besteht, muss jedes verschickte Datenpaket mit der Adresse des Empfängers versehen sein. Greift man beim Datenaustausch nun auf Datagrammsockets zurück, so wird nur das Absenden der Datenpakete garantiert, der Empfang und die richtige Reihenfolge können jedoch unter Umständen fehlerhaft sein.

Ein Beispiel für die Verwendung von Datagrammsockets ist die Anfrage an einen Server: Erfolgt nach kurzer Zeit keine Antwort, so wird erneut ein Datenpaket, welches die Zieladresse beinhaltet, losgeschickt. Ein weiteres Beispiel für die Verwendung von Datagrammsockets ist die Synchronisierung vom Systemuhren im Netzwerk. Kurz formuliert liegt die Stärke von Datagrammsockets darin, eine Meldungsübertragung an eine große Anzahl an Netzwerkadressen zu gewährleisten.

Ports

Den einzelnen Prozessen werden bei beiden Sockettypen Ports zugeordnet, dies sind Integer-Zahlen im Bereich 0...65535. Da die beiden Sockets in unterschiedlichen Namensräumen liegen, kann eine Port-Nummer gleichzeitig für TCP- und UDP Sockets verwendet werden.

Das nachfolgende Schaubild soll noch einmal anhand verschiedener Prozesse die Einordnung der einzelnen Sockettypen in den Gesamtprozess verdeutlichen:


       (Quelle: Microsoft Technischer Support)


Wie benutzt man Sockets und wie kommuniziert man über sie?

Um eine Socketverbindung aufzubauen und zu nutzen, muss zuerst ein Socket-Server eingerichtet werden. Das läuft in zwei Schritten ab.

     1.  Erst wird der Socket erstellt und anschließend wird ihm eine Portnummer zugewiesen,
          auf der er auf eingehende Verbindungen wartet.

Danach unterscheidet sich der Ablauf abhängig davon, ob ein Streamsocket oder ein Datagrammsocket eingesetzt wird.

     2.a)  Bei einem Stream-Socket meldet sich ein Client an und teilt dem Server dabei seine IP Adresse und die Portnummer mit.

Dann besteht eine dauerhafte Verbindung und es können Daten in beliebig vielen Lese- und Schreibzyklen ausgetauscht werden. Anschließend wird die Verbindung beendet. Dabei ist sichergestellt, dass alle Pakte eintreffen, da die Pakete durchnummeriert sind. Fehlt also ein Paket, stellt der Server oder der Client das Überspringen einer Nummer fest und kann darauf reagieren.


     2.b)  Bei einem Datagrammsocket findet keine Anmeldung statt.

Der Client schickt ohne Anmeldung sofort die zu Übertragenden Daten. Durch diese Pakete bekommt der Server die IP Adresse und die Portnummer mitgeteilt und kann gegebenenfalls dem Client antworten. Eine Verbindung muss nicht beendet werden, da jedes Paket selbstständig und ohne Kontrolle übertragen wird. Dadurch gehen allerdings leicht Daten verloren, da weder Server noch Client feststellen können ob der jeweils andere die Pakete erhalten hat.


Der Clientsocket muss ebenfalls zuerst erstellt werden. Dann muss ihm die IP Adresse und die Portnummer des Servers mitgeteilt werden, damit er sich dort anmelden (Streamsocket) bzw. direkt mit ihm kommunizieren kann (Datagrammsocket). Sind alle Daten ausgetauscht beendet der Client die Verbindung und kann wieder aus dem Speicher entfernt werden.


Sockets im Betriebssystem Windows

Die folgende Grafik verdeutlicht die Position dieses Windows-Sockets im Schichtenmodell:



(Quelle: Lars Gollub, Messen, Steuern und Regeln mit TCP/IP, Franzis' Verlag, Poing 2003)


        


(FvSG 30.1.2006)