Zum Inhalt springen
L

Wikipedia · einfach zusammengefasst · Stand

Socket

Ein Socket (von engl. Sockel, Steckverbindung oder Steckdose) ist ein vom Betriebssystem bereitgestelltes Objekt, das als Kommunikationsendpunkt dient.

Inhalt5 Abschnitte
  1. 1. Grundidee und Funktionsprinzip
  2. 2. Internet-Sockets und Adressen
  3. 3. Ablauf der Kommunikation
  4. 4. Sockets für lokale Prozesse und Verbreitung
  5. 5. BSD-Sockets-API und Programmierbeispiele

Grundidee und Funktionsprinzip

Ein Socket ist ein vom Betriebssystem bereitgestelltes Objekt und dient als Kommunikationsendpunkt. Programme verwenden Sockets, um Daten mit anderen Programmen auszutauschen. Das andere Programm kann auf demselben Computer laufen; dann handelt es sich um Interprozesskommunikation. Es kann sich aber auch auf einem anderen, über ein Netzwerk erreichbaren Computer befinden. Die Kommunikation ist in der Regel bidirektional: Über ein Socket können Daten gesendet und empfangen werden.

Sockets bilden eine plattformunabhängige, standardisierte Schnittstelle (API) zwischen der Netzwerkprotokoll-Implementierung des Betriebssystems und der Anwendungssoftware. Ein Programm fordert ein Socket beim Betriebssystem an. Dieses verwaltet die verwendeten Sockets und die zugehörigen Verbindungsinformationen. Nach der Initialisierung kann ein Programm mit einem Socket ähnlich wie mit einer Datei arbeiten.

Internet-Sockets und Adressen

Internet-Sockets ermöglichen Kommunikation mit bestimmten Netzwerkprotokollen. Man unterscheidet vor allem Stream Sockets und Datagram Sockets:

  • Stream Sockets übertragen einen Zeichen-Datenstrom und verwenden meist TCP. TCP ist verlässlich; Reihenfolge und Zustellung der Pakete werden garantiert. Das entspricht dem Prinzip „ganz oder gar nicht“.
  • Datagram Sockets übertragen einzelne Nachrichten und verwenden üblicherweise UDP. UDP ist für bestimmte Aufgaben effizienter, flexibler und oft zeitlich schneller. Reihenfolge und Zustellung werden jedoch nicht garantiert; auch Duplikate sind möglich.

Stream- und Datagram-Sockets verbergen den TCP- beziehungsweise UDP-Header normalerweise und setzen ihn automatisch. Raw Sockets erlauben dagegen, eigene TCP- und UDP-Header zu erstellen. Sie werden vor allem in netzwerknahen Anwendungen eingesetzt, etwa für Router, Packet-Sniffer oder Packet-Injection.

Ein Internet-Socket ist normalerweise mit einem entfernten Programm und dessen Adressinformation verbunden. Typischerweise besteht diese aus IP-Adresse und Portnummer. Auch dem Socket selbst ist eine eigene Adresse zugeordnet. Eine Internet-Socket-Adresse der Familie AF_INET wird durch sin_family, die Identifikationsnummer des localhost beziehungsweise dessen 32-Bit-IP-Adresse, und die 16-Bit-Portnummer des localhost repräsentiert. Welche Informationen verwendet werden, hängt vom Protokoll ab.

Bei UNIX Domain Sockets besteht die Identifikation nicht aus IP-Adresse und Port, sondern aus einem Dateipfad und der Adressfamilie AF_UNIX. Ein Server kann an eine bestimmte Adresse gebunden werden oder auf allen Adressen seines Rechners auf Anfragen warten. Dafür gibt es Wildcard-Adressen. Bei TCP/IP und UDP/IP ist dabei nur die Portnummer relevant; unter Linux lautet die Wildcardadresse 0.0.0.0 und wird durch die symbolische Konstante INADDR_ANY bezeichnet.

Ein Server-Socket, der auf Anfragen wartet, bleibt beim Eingang einer Client-Anfrage erhalten. Aus ihm wird ein neuer, verbundener Server-Socket für genau diesen Client abgeleitet. Dieser neue Socket wird für die Kommunikation mit dem Client verwendet und bleibt bis zum Ende der Verbindung bestehen. Dadurch können Server Anfragen parallel bearbeiten, beispielsweise indem sie sich bei einer Anfrage forken und ein Kindprozess die Bearbeitung übernimmt.

Der verbundene Server-Socket hat dieselbe IP-Adresse und Portnummer wie der lauschende Server-Socket. Gleichzeitige Verbindungen werden durch das Paar aus Server-Socket und Client-Socket unterschieden. Dieses Paar muss auf jedem der beteiligten Kommunikationspartner eindeutig sein. Ein HTTP-Server auf Port 80 kann beispielsweise die Paare (<Server-IP>:80;<Client_A-IP>:<Client_A_Port_1>), (<Server-IP>:80;<Client_A-IP>:<Client_A_Port_2>) und (<Server-IP>:80;<Client_B-IP>:<Client_B_Port_1>) gleichzeitig führen.

Ablauf der Kommunikation

Bei Stream Sockets läuft die Kommunikation typischerweise in mehreren Schritten ab.

Auf der Client-Seite wird zunächst ein Socket erstellt. Anschließend verbindet sich der Client mit der Server-Adresse, von der Daten angefordert werden sollen. Danach werden Daten gesendet und empfangen. Am Ende kann das Socket mit shutdown() und close() heruntergefahren und geschlossen werden; damit wird die Verbindung getrennt.

Auf der Server-Seite wird ein Server-Socket erstellt und an eine Adresse, in der Regel einen Port, gebunden. Danach wartet der Server auf Anfragen. Nimmt er eine Anfrage an, entsteht ein neues Socket-Paar für diesen Client. Die Anfrage wird auf dem neuen, verbundenen Socket bearbeitet. Anschließend wird das Client-Socket wieder geschlossen, während das ursprüngliche Server-Socket weitere Verbindungen annehmen kann.

Bei Datagram Sockets ist der Ablauf einfacher. Der Client erstellt ein Socket und sendet eine Nachricht an eine Adresse. Der Server erstellt und bindet ein Socket und wartet anschließend auf eingehende Pakete. Da Datagram Sockets einzelne Nachrichten übertragen, ist kein dauerhafter Verbindungsaufbau wie bei Stream Sockets erforderlich.

Sockets für lokale Prozesse und Verbreitung

Unix-Betriebssysteme verwenden für lokale Interprozesskommunikation POSIX Local Inter-Process Communication Sockets, auch IPC Sockets oder Unix Domain Sockets genannt. Es gibt dabei ebenfalls Datagram- und Stream-Sockets. Da die Kommunikation im Kernel stattfindet, verhalten sich beide Varianten sehr ähnlich. Bei Datagram Sockets besteht hier beispielsweise keine Gefahr von Datenverlust.

Ein Unix Domain Socket wird als Spezialdatei im Dateisystem dargestellt. Sein vollständiger Pfad dient als eindeutige Identifikation, etwa /var/run/snmpd.sock. Gegenüber Verbindungen über die Loopback-Schnittstelle bieten Unix Domain Sockets für die Interprozesskommunikation einen wesentlich höheren Durchsatz. Alternativen zur Interprozesskommunikation mit Sockets sind Pipes und Shared Memory.

Sockets setzen das zentrale Unix-Designprinzip „Alles ist eine Datei“ um. Die häufigsten Systemaufrufe für Dateien sind open() zum Öffnen, read() zum Lesen, write() zum Schreiben und close() zum Schließen. Die Socket-API wurde 1983 für BSD-Unix entwickelt und später in den POSIX-Standard übernommen. Deshalb ist sie heute auf jedem POSIX-konformen Betriebssystem verfügbar. Auch Microsoft Windows mit Winsock und OS/2 übernahmen die Socket-API. Ihre Verbreitung wurde neben dem Socket-Design durch die allgemeine Verfügbarkeit des Quellcodes unter der BSD-Lizenz begünstigt.

Unix und unixartige Systeme wie Linux nutzen BSD-Sockets häufig für Netzwerkkommunikation und Unix Domain Sockets für lokale Kommunikation. Windows verwendet die der BSD-API nachempfundene Windows Sockets API, kurz Winsock.

BSD-Sockets-API und Programmierbeispiele

Unix Sockets und Windows Sockets basieren auf der 1983 veröffentlichten BSD Sockets API. Die wichtigsten Funktionen sind:

  • socket() erzeugt ein neues Socket eines bestimmten Typs, reserviert Systemressourcen und gibt zur Identifizierung eine eindeutige Integer-Zahl zurück.
  • bind() bindet ein Socket an eine Socket-Adresse, normalerweise an IP-Adresse und Port; es wird typischerweise auf der Serverseite verwendet.
  • listen() versetzt ein gebundenes STREAM-Socket, also ein TCP/IP-Socket, in den Lauschen-Modus.
  • connect() teilt die Adressinformation eines anderen Sockets mit, ordnet einen freien lokalen Port zu und versucht bei einem STREAM-Socket, eine neue TCP/IP-Verbindung aufzubauen. Die Funktion wird typischerweise auf der Clientseite verwendet.
  • accept() nimmt einen eingehenden Verbindungsversuch an und erzeugt bei Erfolg ein neues Socket, das dem Adresspaar der Verbindung zugeordnet ist.
  • send() und recv(), alternativ write() und read() oder bei Datagrammen sendto() und recvfrom(), schreiben und lesen Daten. Ein einzelner recv()-Aufruf garantiert besonders bei STREAM-Sockets nicht, dass alle mit send() übertragenen Daten auf einmal empfangen werden.
  • close() gibt die vom Betriebssystem für das Socket reservierten Ressourcen frei. Bei einem TCP/IP-Socket wird dabei die Verbindung beendet.

In C verwendet die von Linux abgeleitete POSIX-Sockets-API unter anderem socket(AF_INET, SOCK_STREAM, 0), um ein TCP-Socket zu erzeugen. Ein Beispiel verbindet den Client mit der Server-IP-Adresse 1.2.3.4 und Port 1234. Die Portnummer wird mit htons(1234) in Network-Byte-Order (Big Endian) eingetragen. Nach connect() erfolgt der Datenaustausch mit write() und read(). shutdown(sockfd, SHUT_WR) sendet ein EOF-Signal, sodass der Server beim nächsten read() den Rückgabewert 0 erhält; anschließend wird das Socket mit close() geschlossen.

C# nutzt unter anderem IPAddress, IPEndPoint und ein Socket-Objekt vom Typ Stream mit dem TCP-Protokoll. Das Beispiel verbindet sich mit 192.168.xxx.yyy auf Port 9999, sendet Nachrichten und empfängt sie in einem Puffer von 1024 Bytes. Mit Shutdown(SocketShutdown.Both) und Close() wird die Verbindung beendet.

Java unterstützt Socket-Programmierung plattformunabhängig im Paket java.net. Die Klassen Socket und ServerSocket kapseln die jeweilige Implementierung in der Klassenbibliothek der virtuellen Maschine. Ein ServerSocket wird mit einer Portnummer erstellt, wartet mit accept() auf Clients, liest über einen InputStream bis zu 1024 Bytes und schließt anschließend das Client-Socket. Die NewIO-(nio)-Bibliothek bietet zusätzlich eine aufwändigere, möglicherweise schnellere Arbeitsweise. Das Multiplexing mehrerer Sockets übernimmt ein Selector, der mit dem Unix-Systemaufruf select vergleichbar ist.

Haskell stellt über das Modul Network eine plattformunabhängige Socket-Schnittstelle bereit. Das Beispiel verwendet Port 2048: Ein Server lauscht, akzeptiert Verbindungen und startet für jede Verbindung einen Thread. Er gibt Öffnen, empfangene Textzeilen und Schließen auf der Standardausgabe aus. Der Client verbindet sich mit localhost, liest Textzeilen von der Standardeingabe, sendet sie mit hPutStrLn und hFlush und schließt danach das Handle. Der gezeigte Server ermöglicht wahrscheinlich keine sichere Beendigung.

Ruby bietet in der Standardbibliothek socket eine plattformunabhängige TCP-Schnittstelle. Der Beispielserver verwendet TCPServer auf Port 2048, akzeptiert Clients in einer Schleife und startet für jeden Client einen Thread, der Hello! sendet und die Verbindung schließt.

Das Python-3-Beispiel verwendet auf dem Server 127.0.0.1 und Port 5000. Der Server bindet und lauscht, nimmt eine Verbindung an, empfängt bis zu 1024 Bytes, gibt die Nachricht aus und sendet sie mit sendall() zurück. Der Client verbindet sich, liest Eingaben ein, sendet sie und zeigt die Antwort an. In Node.js ermöglicht das Standardmodul net TCP-Sockets. Der Beispielserver lauscht auf 127.0.0.1:1337, schreibt zunächst Echo server und leitet anschließend mit socket.pipe(socket) die empfangenen Daten zurück.

Lernvideos zu Socket

Weiterlesen

Englische Sprache Die englische Sprache (Eigenbezeichnung: [ˈɪŋɡlɪʃ]) ist eine ursprünglich in England beheimatete germanische Sprache, die zum westgermanischen Zweig gehört. Betriebssystem Betriebssysteme bestehen in der Regel aus einem Kernel (deutsch: Kern), der die Hardware des Computers verwaltet, sowie speziellen Programmen, die beim Start … Interprozesskommunikation Deadlocks. Bearbeiten. → Hauptartikel: Deadlock (Informatik). Eine Menge von Prozessen befindet sich in einem Deadlock-Zustand, wenn jeder Prozess aus der … Netzwerk Als Netze oder Netzwerke (englisch net oder englisch network) werden interdisziplinär Systeme bezeichnet, deren zugrundeliegende Struktur sich mathematisch … Netzwerkprotokoll Ein Netzwerkprotokoll (auch Netzprotokoll) ist ein Kommunikationsprotokoll für den Austausch von Daten zwischen Computern bzw. Prozessen, die in einem … Kommunikationsprotokoll In seiner einfachsten Form kann ein Protokoll definiert werden als eine Menge von Regeln, die Syntax, Semantik und Synchronisation der Kommunikation bestimmen. Datenstrom Mit Datenströmen (englisch data streams) bezeichnet man in der Informatik einen kontinuierlichen Datenfluss von Datensätzen, dessen Ende meist nicht im … Transmission Control Protocol Das Transmission Control Protocol (TCP, englisch für „Übertragungssteuerungsprotokoll“) ist ein Netzwerkprotokoll, das definiert, auf welche Art und Weise … User Datagram Protocol Das User Datagram Protocol (UDP) ist ein minimales, verbindungsloses Netzwerkprotokoll, das zur Transportschicht der Internetprotokollfamilie gehört. Router Router (['ruːtə(r)] oder ['raʊ̯tər]) oder Netzwerkrouter sind Netzwerkgeräte, die Netzwerkpakete zwischen mehreren Rechnernetzen weiterleiten können. IP-Adresse Im Falle von Ethernet-Netzen dient das ARP (Address Resolution Protocol) zum Auffinden der Hardwareadresse. ARP arbeitet auf der zweiten Schicht des OSI … Port (Netzwerkadresse) Zusammen mit der IP-Adresse ermöglicht der Port die Adressierung eines Servers oder Clients. Durch Angabe von Quell- und Zieladresse, jeweils bestehend aus IP …