Socket (Software): Unterschied zwischen den Versionen

Aus Foxwiki
Keine Bearbeitungszusammenfassung
 
(7 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 2: Zeile 2:


== Beschreibung ==
== Beschreibung ==
Ein '''Socket''' (von [[Englische Sprache|engl.]] ''Sockel'', ''Steckverbindung'' oder ''Steckdose'') ist ein vom [[Betriebssystem]] bereitgestelltes Objekt, das als Kommunikationsendpunkt dient. Ein [[Computerprogramm|Programm]] verwendet Sockets, um Daten mit anderen Programmen auszutauschen. Das andere Programm kann sich dabei auf demselben Computer ([[Interprozesskommunikation]]) oder einem anderen, via [[Netzwerk]] erreichbaren Computer befinden. Die Kommunikation über Sockets erfolgt in der Regel [[bidirektional]], das heißt, über das Socket können Daten sowohl empfangen als auch gesendet werden.
Ein '''Socket''' (von [[Englische Sprache|engl.]] ''Sockel'', ''Steckverbindung'' oder ''Steckdose'') ist ein vom [[Betriebssystem]] bereitgestelltes Objekt, das als Kommunikationsendpunkt dient.  
* Ein [[Computerprogramm|Programm]] verwendet Sockets, um Daten mit anderen Programmen auszutauschen.  
* Das andere Programm kann sich dabei auf demselben Computer ([[Interprozesskommunikation]]) oder einem anderen, via [[Netzwerk]] erreichbaren Computer befinden.  
* Die Kommunikation über Sockets erfolgt in der Regel [[bidirektional]], das heißt, über das Socket können Daten sowohl empfangen als auch gesendet werden.


== Funktionsweise ==
== Funktionsweise ==
=== Allgemeines Funktionsprinzip ===
=== Funktionsprinzip ===
Sockets bilden eine plattformunabhängige [[Standard|standardisierte]] Schnittstelle ([[Application Programming Interface|API]]) zwischen der [[Netzwerkprotokoll]]-[[Implementierung]] des [[Betriebssystem]]s und der eigentlichen [[Anwendungssoftware]]. Ein Computerprogramm fordert einen Socket vom Betriebssystem an. Das Betriebssystem hat die Aufgabe, alle benutzten Sockets sowie die zugehörigen Verbindungsinformationen zu verwalten.
; Allgemeines Funktionsprinzip
Sockets bilden eine plattformunabhängige, [[Standard|standardisierte]] Schnittstelle ([[Application Programming Interface|API]]) zwischen der [[Netzwerkprotokoll]]-[[Implementierung]] des [[Betriebssystem]]s und der eigentlichen [[Anwendungssoftware]].  
* Ein Computerprogramm fordert einen Socket vom Betriebssystem an.  
* Das Betriebssystem hat die Aufgabe, alle benutzten Sockets sowie die zugehörigen Verbindungsinformationen zu verwalten.


=== Internet-Sockets ===
=== Internet-Sockets ===
Internet-Sockets ermöglichen die Kommunikation mittels bestimmter [[Kommunikationsprotokoll]]e.
Internet-Sockets ermöglichen die Kommunikation mittels bestimmter [[Kommunikationsprotokoll]]e.
Generell kann man unterscheiden zwischen '''Stream Sockets''' und '''Datagram Sockets''': Stream Sockets kommunizieren über einen [[Zeichen]]-[[Datenstrom]]; Datagramm Sockets über einzelne Nachrichten. In der Netzwerkkommunikation verwenden Stream Sockets meist [[Transmission Control Protocol|TCP]], Datagramm Sockets üblicherweise [[User Datagram Protocol|UDP]]. TCP ist verlässlicher, die Reihenfolge und Zustellung von Paketen werden garantiert (Prinzip: ganz oder gar nicht). UDP ist für bestimmte Aufgaben effizienter und flexibler, oft auch schneller (zeitlich) – Reihenfolge und Zustellung der Pakete werden jedoch nicht garantiert (weiterhin sind Duplikate möglich).
Generell kann man unterscheiden zwischen '''Stream Sockets''' und '''Datagram Sockets''': Stream Sockets kommunizieren über einen [[Zeichen]]-[[Datenstrom]]; Datagramm Sockets über einzelne Nachrichten.  
* In der Netzwerkkommunikation verwenden Stream Sockets meist [[Transmission Control Protocol|TCP]], Datagramm Sockets üblicherweise [[User Datagram Protocol|UDP]].  
* TCP ist verlässlicher, die Reihenfolge und Zustellung von Paketen werden garantiert (Prinzip: ganz oder gar nicht).  
* UDP ist für bestimmte Aufgaben effizienter und flexibler, oft auch schneller (zeitlich) – Reihenfolge und Zustellung der Pakete werden jedoch nicht garantiert (weiterhin sind Duplikate möglich).


Während Stream Sockets und Datagramm Sockets den TCP- oder UDP-[[Header]] eines [[Datenpaket]]s normalerweise verbergen und automatisch setzen, lassen '''Raw Sockets''' (''Raw'': roh) das Erstellen eigener TCP- und UDP-Header zu. Raw Sockets werden am ehesten in netzwerknahen Applikationen verwendet, z. B. für [[Router]], [[Sniffer|Packet-Sniffer]] oder bei [[Packet-Injection]].
Während Stream Sockets und Datagramm Sockets den TCP- oder UDP-[[Header]] eines [[Datenpaket]]s normalerweise verbergen und automatisch setzen, lassen '''Raw Sockets''' (''Raw'': roh) das Erstellen eigener TCP- und UDP-Header zu.  
* Raw Sockets werden am ehesten in netzwerknahen Applikationen verwendet, z. B. für [[Router]], [[Sniffer|Packet-Sniffer]] oder bei [[Packet-Injection]].


Ein Socket ist normalerweise die Verbindungsstelle zu einem bestimmten entfernten Programm, repräsentiert durch dessen Adressinformation (z. B. IP-Adresse und Portnummer). Dem Socket selbst ist natürlich auch die eigene Adressinformation zugeordnet. Eine Internet-Socket-[[Adresse]] der Familie AF_INET wird durch folgende Informationen repräsentiert:
Ein Socket ist normalerweise die Verbindungsstelle zu einem bestimmten entfernten Programm, repräsentiert durch dessen Adressinformation (z. B. IP-Adresse und Portnummer).  
* <code>sin_family</code>, das heißt der zugehörigen Adressfamilie des Netzwerks (z.&nbsp;B. AF_INET = Adressfamilie Internetadresse)
* Dem Socket selbst ist natürlich auch die eigene Adressinformation zugeordnet.  
* Eine Internet-Socket-[[Adresse]] der Familie AF_INET wird durch folgende Informationen repräsentiert:
* <code>sin_family</code>, das heißt der zugehörigen Adressfamilie des Netzwerks (z.&nbsp;B.&nbsp;AF_INET = Adressfamilie Internetadresse)
* die Identifikationsnummer des ''[[localhost]]'' / seiner 32-Bit-IP-Adresse
* die Identifikationsnummer des ''[[localhost]]'' / seiner 32-Bit-IP-Adresse
* die Portnummer des ''localhost'' / 16 Bit
* die Portnummer des ''localhost'' / 16 Bit
Diese Informationen sind allerdings vom verwendeten [[Netzwerkprotokoll|Protokoll]] abhängig. Typischerweise handelt es sich bei der Adressinformation im Internet um die [[IP-Adresse]] und den [[Port (Netzwerkadresse)|Port]]. Bei '''UNIX Domain Sockets''' ([[#Sockets und Interprozesskommunikation|s.&nbsp;u.]]) besteht die Identifikation aus einem Dateipfadnamen und der Adressfamilie AF_UNIX.
Diese Informationen sind allerdings vom verwendeten [[Netzwerkprotokoll|Protokoll]] abhängig.  
* Typischerweise handelt es sich bei der Adressinformation im Internet um die [[IP-Adresse]] und den [[Port (Netzwerkadresse)|Port]].  
* Bei '''UNIX Domain Sockets''' ([[#Sockets und Interprozesskommunikation|s.&nbsp;u.]]) besteht die Identifikation aus einem Dateipfadnamen und der Adressfamilie AF_UNIX.


Ein Server kann entweder auf Anfragen von einer bestimmten Adresse warten (und bindet sich von vornherein an diese Adresse) oder er wartet auf allen Adressen seines Rechners auf Anfragen. Dafür gibt es bei einigen Protokollen eine sogenannte ''Wildcard-Adresse'', bei der ein oder mehrere Teile der Adressinformation nicht spezifisch sind. Im Beispiel von TCP/IP und UDP/IP ist bei einer Wildcard-Adresse nur die Port-Nummer relevant, das heißt, es wird eine spezielle (ungültige) IP-Adresse angegeben, um zu signalisieren, dass Verbindungen auf allen IP-Adressen akzeptiert werden sollen. Unter Linux ist diese Wildcardadresse [[0.0.0.0]] (symbolische Konstante INADDR_ANY).
Ein Server kann entweder auf Anfragen von einer bestimmten Adresse warten (und bindet sich von vornherein an diese Adresse) oder er wartet auf allen Adressen seines Rechners auf Anfragen.  
* Dafür gibt es bei einigen Protokollen eine sogenannte ''Wildcard-Adresse'', bei der ein oder mehrere Teile der Adressinformation nicht spezifisch sind.  
* Im Beispiel von TCP/IP und UDP/IP ist bei einer Wildcard-Adresse nur die Port-Nummer relevant, das heißt, es wird eine spezielle (ungültige) IP-Adresse angegeben, um zu signalisieren, dass Verbindungen auf allen IP-Adressen akzeptiert werden sollen.  
* Unter Linux ist diese Wildcardadresse [[0.0.0.0]] (symbolische Konstante INADDR_ANY).


Wenn der Server eine Anfrage von einem Client erhält, wird aus dem lauschenden („listening“) Server-Socket der in Verbindung stehende („connected“) Server-Socket abgeleitet: Der ursprüngliche Server-Socket bleibt erhalten und wartet weiterhin auf neue Verbindungen, während ein neuer, auf den bestimmten Client gerichteter Socket geöffnet wird, der nur für die Kommunikation mit diesem einen Client verwendet wird. Dieser bleibt solange bestehen, bis die Verbindung zum Client von einer der beiden Seiten beendet wird. Dieses Ableiten kann dazu genutzt werden, eine parallelisierte Serverarchitektur zu schaffen, in der sich der Server bei einer Anfrage [[fork (Unix)|forkt]] und ein Kindprozess die Anfrage selbst beantwortet.
Wenn der Server eine Anfrage von einem Client erhält, wird aus dem lauschenden („listening“) Server-Socket der in Verbindung stehende („connected“) Server-Socket abgeleitet: Der ursprüngliche Server-Socket bleibt erhalten und wartet weiterhin auf neue Verbindungen, während ein neuer, auf den bestimmten Client gerichteter Socket geöffnet wird, der nur für die Kommunikation mit diesem einen Client verwendet wird.  
* Dieser bleibt solange bestehen, bis die Verbindung zum Client von einer der beiden Seiten beendet wird.  
* Dieses Ableiten kann dazu genutzt werden, eine parallelisierte Serverarchitektur zu schaffen, in der sich der Server bei einer Anfrage [[fork (Unix)|forkt]] und ein Kindprozess die Anfrage selbst beantwortet.


Das heißt, dass ein mit einem Client-Socket verbundener („connected“) Server-Socket genau die gleiche IP-Adresse und Port-Nummer trägt wie der lauschende („listen“) Server-Socket. Die Unterscheidung von gleichzeitigen Client-Verbindungen zum selben Server erfolgt daher durch das Paar von Server-Socket und Client-Socket. Dieses Paar muss zu jedem Zeitpunkt eindeutig auf jedem der beteiligten Kommunikationspartner sein.
Das heißt, dass ein mit einem Client-Socket verbundener („connected“) Server-Socket genau die gleiche IP-Adresse und Port-Nummer trägt wie der lauschende („listen“) Server-Socket.  
Als Beispiel sei ein HTTP-Server gegeben, der auf Port 80 lauscht. Die Verbindungen des Servers zu verschiedenen Clients führt zu folgenden eindeutigen „Connected“-Socket-Paaren auf dem Server-Rechner:
* Die Unterscheidung von gleichzeitigen Client-Verbindungen zum selben Server erfolgt daher durch das Paar von Server-Socket und Client-Socket.  
* Dieses Paar muss zu jedem Zeitpunkt eindeutig auf jedem der beteiligten Kommunikationspartner sein.
Als Beispiel sei ein HTTP-Server gegeben, der auf Port 80 lauscht.  
* Die Verbindungen des Servers zu verschiedenen Clients führt zu folgenden eindeutigen „Connected“-Socket-Paaren auf dem Server-Rechner:


(<Server-IP>:80;<Client_A-IP>:<Client_A_Port_1>), (<Server-IP>:80;<Client_A-IP>:<Client_A_Port_2>), (<Server-IP>:80;<Client_B-IP>:<Client_B_Port_1>) usw.
(<Server-IP>:80;<Client_A-IP>:<Client_A_Port_1>), (<Server-IP>:80;<Client_A-IP>:<Client_A_Port_2>), (<Server-IP>:80;<Client_B-IP>:<Client_B_Port_1>) usw.
Zeile 36: Zeile 58:
# erstellten Socket mit der Server-Adresse verbinden, von welcher Daten angefordert werden sollen
# erstellten Socket mit der Server-Adresse verbinden, von welcher Daten angefordert werden sollen
# Senden und Empfangen von Daten
# Senden und Empfangen von Daten
# evtl. Socket herunterfahren (<code>shutdown()</code>, <code>close()</code>)
# evtl.&nbsp;Socket herunterfahren (<code>shutdown()</code>, <code>close()</code>)
# Verbindung trennen, Socket schließen
# Verbindung trennen, Socket schließen


Zeile 59: Zeile 81:
== Interprozesskommunikation ==
== Interprozesskommunikation ==
; Sockets und Interprozesskommunikation
; Sockets und Interprozesskommunikation
[[Unixoides System|Unix-Betriebssysteme]] verwenden zur lokalen [[Interprozesskommunikation]] sogenannte [[POSIX local inter-process communication socket|POSIX Local Inter-Process Communication Sockets]] (auch '''IPC Sockets''', von "inter-process communication sockets", oder '''Unix Domain Sockets'''). Auch hier gibt es Datagram und Stream Sockets; da die Kommunikation aber im Kernel stattfindet, verhalten sich Stream und Datagram Sockets sehr ähnlich (z.&nbsp;B. besteht hier auch bei Datagram Sockets keine Gefahr von Datenverlust). Ein Unix Domain Socket wird als Spezialdatei im Dateisystem repräsentiert. Anstelle von IP-Adresse und Port-Nummer dient der vollständige Pfad des Sockets als eindeutige Identifikation (z.&nbsp;B. /var/run/snmpd.sock). Unix Domain Sockets haben für die IPC gegenüber Verbindungen, die die [[Loopback]]-Schnittstelle nutzen, den Vorteil eines wesentlich höheren Durchsatzes.
[[Unixoides System|Unix-Betriebssysteme]] verwenden zur lokalen [[Interprozesskommunikation]] sogenannte [[POSIX local inter-process communication socket|POSIX Local Inter-Process Communication Sockets]] (auch '''IPC Sockets''', von "inter-process communication sockets", oder '''Unix Domain Sockets''').  
* Auch hier gibt es Datagram und Stream Sockets; da die Kommunikation aber im Kernel stattfindet, verhalten sich Stream und Datagram Sockets sehr ähnlich (z.&nbsp;B.&nbsp;besteht hier auch bei Datagram Sockets keine Gefahr von Datenverlust).  
* Ein Unix Domain Socket wird als Spezialdatei im Dateisystem repräsentiert.  
* Anstelle von IP-Adresse und Port-Nummer dient der vollständige Pfad des Sockets als eindeutige Identifikation (z.&nbsp;B.&nbsp;/var/run/snmpd.sock).  
* Unix Domain Sockets haben für die IPC gegenüber Verbindungen, die die [[Loopback]]-Schnittstelle nutzen, den Vorteil eines wesentlich höheren Durchsatzes.


Alternativen zu Sockets in der Interprozesskommunikation sind [[Pipe (Informatik)|Pipes]] oder [[Shared Memory]].
Alternativen zu Sockets in der Interprozesskommunikation sind [[Pipe (Informatik)|Pipes]] oder [[Shared Memory]].


== Geschichte ==
== Geschichte ==
Ein zentrales Designprinzip von [[Unix]] ist: Alles ist eine Datei. Die vier am häufigsten benutzten Systemaufrufe für die Arbeit mit Dateien heißen: <code>open()</code> zum Öffnen, <code>read()</code> zum Lesen, <code>write()</code> zum Schreiben und <code>close()</code> zum Schließen. Sockets stellen die Umsetzung dieses Designprinzips dar.
; Ein zentrales Designprinzip von [[Unix]] ist: Alles ist eine Datei.  
* Die vier am häufigsten benutzten Systemaufrufe für die Arbeit mit Dateien heißen: <code>open()</code> zum Öffnen, <code>read()</code> zum Lesen, <code>write()</code> zum Schreiben und <code>close()</code> zum Schließen.  
* Sockets stellen die Umsetzung dieses Designprinzips dar.


Ursprünglich entwickelt worden ist die Socket-[[Programmierschnittstelle|API]] 1983 für [[Berkeley Software Distribution|BSD-Unix]]. Später ist die Spezifikation in den Standard [[POSIX]] eingeflossen. Damit ist sie heute auf jedem POSIX-konformen Betriebssystem verfügbar. Auch andere Betriebssysteme wie Microsoft Windows ([[Winsock]]) oder OS/2 haben die Socket-API übernommen. Die allgemeine Verbreitung von Sockets ist nicht nur dem Design von Sockets, sondern auch der allgemeinen Verfügbarkeit des Quellcodes dank der BSD-Lizenz geschuldet.
; Ursprünglich entwickelt worden ist die Socket-[[Programmierschnittstelle|API]] 1983 für [[Berkeley Software Distribution|BSD-Unix]].  
* Später ist die Spezifikation in den Standard [[POSIX]] eingeflossen.  
* Damit ist sie heute auf jedem POSIX-konformen Betriebssystem verfügbar.  
* Auch andere Betriebssysteme wie Microsoft Windows ([[Winsock]]) oder OS/2 haben die Socket-API übernommen.  
* Die allgemeine Verbreitung von Sockets ist nicht nur dem Design von Sockets, sondern auch der allgemeinen Verfügbarkeit des Quellcodes dank der BSD-Lizenz geschuldet.


== Verwendung in Betriebssystemen ==
== Verwendung in Betriebssystemen ==
[[Unix]] und [[Unixoides System|unixartige Betriebssysteme]] (wie [[Linux]]) benutzen sehr häufig BSD-Sockets zur Netzwerkkommunikation. Zur lokalen [[Interprozesskommunikation]] verwenden sie die oben beschriebenen [[Unix Domain Socket]]s (die Teil des [[POSIX]]-Standards sind) und mit denen Prozesse auf einfache Art und Weise miteinander kommunizieren können. Nach der Initialisierung des Sockets kann der Programmierer mit diesem wie mit einer Datei arbeiten.
; [[Unix]] und [[Unixoides System|unixartige Betriebssysteme]] (wie [[Linux]]) benutzen sehr häufig BSD-Sockets zur Netzwerkkommunikation.  
* Zur lokalen [[Interprozesskommunikation]] verwenden sie die oben beschriebenen [[Unix Domain Socket]]s (die Teil des [[POSIX]]-Standards sind) und mit denen Prozesse auf einfache Art und Weise miteinander kommunizieren können.  
* Nach der Initialisierung des Sockets kann der Programmierer mit diesem wie mit einer Datei arbeiten.


[[Microsoft Windows|Windows]] verwendet eine den BSD-Sockets nachempfundene sogenannte [[Winsock|Windows Sockets API]] (Winsock).
; [[Microsoft Windows|Windows]] verwendet eine den BSD-Sockets nachempfundene sogenannte [[Winsock|Windows Sockets API]] (Winsock).


<noinclude>
<noinclude>
Zeile 77: Zeile 111:
== Anhang ==
== Anhang ==
=== Siehe auch ===
=== Siehe auch ===
{{Special:PrefixIndex/{{BASEPAGENAME}}}}
{{Special:PrefixIndex/socket}}
 
==== Links ====
==== Links ====
===== Weblinks =====
===== Weblinks =====
# https://de.wikipedia.org/wiki/Socket_(Software)
# [https://docs.freebsd.org/44doc/psd/20.ipctut/paper.pdf UNIX Programmer’s Supplementary Documents (PSD: 20-1)] (PDF; englisch)
# [https://docs.freebsd.org/44doc/psd/20.ipctut/paper.pdf UNIX Programmer’s Supplementary Documents (PSD: 20-1)] (PDF; englisch)
# [https://docs.python.org/3/howto/sockets.html Socket-Programmierung in Python] (englisch)
# [https://docs.python.org/3/howto/sockets.html Socket-Programmierung in Python] (englisch)
# [https://wiki.haskell.org/Concurrency_demos/Graceful_exit Realistisches Beispiel für die Konstruktion eines Socket-Servers mit sicherer Beendigung in Haskell]
# [https://wiki.haskell.org/Concurrency_demos/Graceful_exit Realistisches Beispiel für die Konstruktion eines Socket-Servers mit sicherer Beendigung in Haskell]
# [https://www.gnu.org/savannah-checkouts/gnu/libc/manual/html_node/Sockets.html ''Sockets''.] GNU-info-Page
# [https://www.gnu.org/savannah-checkouts/gnu/libc/manual/html_node/Sockets.html ''Sockets''.] GNU-info-Page
[[Kategorie:Programmierung]]
[[Kategorie:Linux/Datei/Typ]]
</noinclude>
</noinclude>
[[Kategorie:Programmierung]]
[[Kategorie:Netzwerk/Architektur]]
[[Kategorie:Linux/Datei]]
[[Kategorie:Linux/Architektur]]

Aktuelle Version vom 1. August 2024, 10:37 Uhr

Socket - von Betriebssystemen bereitgestellter Kommunikationsendpunkt

Beschreibung

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

  • Ein Programm verwendet Sockets, um Daten mit anderen Programmen auszutauschen.
  • Das andere Programm kann sich dabei auf demselben Computer (Interprozesskommunikation) oder einem anderen, via Netzwerk erreichbaren Computer befinden.
  • Die Kommunikation über Sockets erfolgt in der Regel bidirektional, das heißt, über das Socket können Daten sowohl empfangen als auch gesendet werden.

Funktionsweise

Funktionsprinzip

Allgemeines Funktionsprinzip

Sockets bilden eine plattformunabhängige, standardisierte Schnittstelle (API) zwischen der Netzwerkprotokoll-Implementierung des Betriebssystems und der eigentlichen Anwendungssoftware.

  • Ein Computerprogramm fordert einen Socket vom Betriebssystem an.
  • Das Betriebssystem hat die Aufgabe, alle benutzten Sockets sowie die zugehörigen Verbindungsinformationen zu verwalten.

Internet-Sockets

Internet-Sockets ermöglichen die Kommunikation mittels bestimmter Kommunikationsprotokolle. Generell kann man unterscheiden zwischen Stream Sockets und Datagram Sockets: Stream Sockets kommunizieren über einen Zeichen-Datenstrom; Datagramm Sockets über einzelne Nachrichten.

  • In der Netzwerkkommunikation verwenden Stream Sockets meist TCP, Datagramm Sockets üblicherweise UDP.
  • TCP ist verlässlicher, die Reihenfolge und Zustellung von Paketen werden garantiert (Prinzip: ganz oder gar nicht).
  • UDP ist für bestimmte Aufgaben effizienter und flexibler, oft auch schneller (zeitlich) – Reihenfolge und Zustellung der Pakete werden jedoch nicht garantiert (weiterhin sind Duplikate möglich).

Während Stream Sockets und Datagramm Sockets den TCP- oder UDP-Header eines Datenpakets normalerweise verbergen und automatisch setzen, lassen Raw Sockets (Raw: roh) das Erstellen eigener TCP- und UDP-Header zu.

Ein Socket ist normalerweise die Verbindungsstelle zu einem bestimmten entfernten Programm, repräsentiert durch dessen Adressinformation (z. B. IP-Adresse und Portnummer).

  • Dem Socket selbst ist natürlich auch die eigene Adressinformation zugeordnet.
  • Eine Internet-Socket-Adresse der Familie AF_INET wird durch folgende Informationen repräsentiert:
  • sin_family, das heißt der zugehörigen Adressfamilie des Netzwerks (z. B. AF_INET = Adressfamilie Internetadresse)
  • die Identifikationsnummer des localhost / seiner 32-Bit-IP-Adresse
  • die Portnummer des localhost / 16 Bit

Diese Informationen sind allerdings vom verwendeten Protokoll abhängig.

  • Typischerweise handelt es sich bei der Adressinformation im Internet um die IP-Adresse und den Port.
  • Bei UNIX Domain Sockets (s. u.) besteht die Identifikation aus einem Dateipfadnamen und der Adressfamilie AF_UNIX.

Ein Server kann entweder auf Anfragen von einer bestimmten Adresse warten (und bindet sich von vornherein an diese Adresse) oder er wartet auf allen Adressen seines Rechners auf Anfragen.

  • Dafür gibt es bei einigen Protokollen eine sogenannte Wildcard-Adresse, bei der ein oder mehrere Teile der Adressinformation nicht spezifisch sind.
  • Im Beispiel von TCP/IP und UDP/IP ist bei einer Wildcard-Adresse nur die Port-Nummer relevant, das heißt, es wird eine spezielle (ungültige) IP-Adresse angegeben, um zu signalisieren, dass Verbindungen auf allen IP-Adressen akzeptiert werden sollen.
  • Unter Linux ist diese Wildcardadresse 0.0.0.0 (symbolische Konstante INADDR_ANY).

Wenn der Server eine Anfrage von einem Client erhält, wird aus dem lauschenden („listening“) Server-Socket der in Verbindung stehende („connected“) Server-Socket abgeleitet: Der ursprüngliche Server-Socket bleibt erhalten und wartet weiterhin auf neue Verbindungen, während ein neuer, auf den bestimmten Client gerichteter Socket geöffnet wird, der nur für die Kommunikation mit diesem einen Client verwendet wird.

  • Dieser bleibt solange bestehen, bis die Verbindung zum Client von einer der beiden Seiten beendet wird.
  • Dieses Ableiten kann dazu genutzt werden, eine parallelisierte Serverarchitektur zu schaffen, in der sich der Server bei einer Anfrage forkt und ein Kindprozess die Anfrage selbst beantwortet.

Das heißt, dass ein mit einem Client-Socket verbundener („connected“) Server-Socket genau die gleiche IP-Adresse und Port-Nummer trägt wie der lauschende („listen“) Server-Socket.

  • Die Unterscheidung von gleichzeitigen Client-Verbindungen zum selben Server erfolgt daher durch das Paar von Server-Socket und Client-Socket.
  • Dieses Paar muss zu jedem Zeitpunkt eindeutig auf jedem der beteiligten Kommunikationspartner sein.

Als Beispiel sei ein HTTP-Server gegeben, der auf Port 80 lauscht.

  • Die Verbindungen des Servers zu verschiedenen Clients führt zu folgenden eindeutigen „Connected“-Socket-Paaren auf dem Server-Rechner:

(<Server-IP>:80;<Client_A-IP>:<Client_A_Port_1>), (<Server-IP>:80;<Client_A-IP>:<Client_A_Port_2>), (<Server-IP>:80;<Client_B-IP>:<Client_B_Port_1>) usw.

Socket-Kommunikation

Ablauf der Socket-Kommunikation

Stream Sockets

Client-seitig
  1. Socket erstellen
  2. erstellten Socket mit der Server-Adresse verbinden, von welcher Daten angefordert werden sollen
  3. Senden und Empfangen von Daten
  4. evtl. Socket herunterfahren (shutdown(), close())
  5. Verbindung trennen, Socket schließen
Server-seitig
  1. Server-Socket erstellen
  2. Binden des Sockets an eine Adresse (Port), über welche Anfragen akzeptiert werden
  3. auf Anfragen warten
  4. Anfrage akzeptieren und damit ein neues Socket-Paar für diesen Client erstellen
  5. Bearbeiten der Client-Anfrage auf dem neuen Client-Socket
  6. Client-Socket wieder schließen.

Datagram Sockets

Client
  1. Socket erstellen
  2. An Adresse senden
Server-seitig
  1. Socket erstellen
  2. Socket binden
  3. warten auf Pakete

Interprozesskommunikation

Sockets und Interprozesskommunikation

Unix-Betriebssysteme verwenden zur lokalen Interprozesskommunikation sogenannte POSIX Local Inter-Process Communication Sockets (auch IPC Sockets, von "inter-process communication sockets", oder Unix Domain Sockets).

  • Auch hier gibt es Datagram und Stream Sockets; da die Kommunikation aber im Kernel stattfindet, verhalten sich Stream und Datagram Sockets sehr ähnlich (z. B. besteht hier auch bei Datagram Sockets keine Gefahr von Datenverlust).
  • Ein Unix Domain Socket wird als Spezialdatei im Dateisystem repräsentiert.
  • Anstelle von IP-Adresse und Port-Nummer dient der vollständige Pfad des Sockets als eindeutige Identifikation (z. B. /var/run/snmpd.sock).
  • Unix Domain Sockets haben für die IPC gegenüber Verbindungen, die die Loopback-Schnittstelle nutzen, den Vorteil eines wesentlich höheren Durchsatzes.

Alternativen zu Sockets in der Interprozesskommunikation sind Pipes oder Shared Memory.

Geschichte

Ein zentrales Designprinzip von Unix ist
Alles ist eine Datei.
  • Die vier am häufigsten benutzten Systemaufrufe für die Arbeit mit Dateien heißen: open() zum Öffnen, read() zum Lesen, write() zum Schreiben und close() zum Schließen.
  • Sockets stellen die Umsetzung dieses Designprinzips dar.
Ursprünglich entwickelt worden ist die Socket-API 1983 für BSD-Unix.
  • Später ist die Spezifikation in den Standard POSIX eingeflossen.
  • Damit ist sie heute auf jedem POSIX-konformen Betriebssystem verfügbar.
  • Auch andere Betriebssysteme wie Microsoft Windows (Winsock) oder OS/2 haben die Socket-API übernommen.
  • Die allgemeine Verbreitung von Sockets ist nicht nur dem Design von Sockets, sondern auch der allgemeinen Verfügbarkeit des Quellcodes dank der BSD-Lizenz geschuldet.

Verwendung in Betriebssystemen

Unix und unixartige Betriebssysteme (wie Linux) benutzen sehr häufig BSD-Sockets zur Netzwerkkommunikation.
  • Zur lokalen Interprozesskommunikation verwenden sie die oben beschriebenen Unix Domain Sockets (die Teil des POSIX-Standards sind) und mit denen Prozesse auf einfache Art und Weise miteinander kommunizieren können.
  • Nach der Initialisierung des Sockets kann der Programmierer mit diesem wie mit einer Datei arbeiten.
Windows verwendet eine den BSD-Sockets nachempfundene sogenannte Windows Sockets API (Winsock).


Anhang

Siehe auch

Links

Weblinks
  1. https://de.wikipedia.org/wiki/Socket_(Software)
  2. UNIX Programmer’s Supplementary Documents (PSD: 20-1) (PDF; englisch)
  3. Socket-Programmierung in Python (englisch)
  4. Realistisches Beispiel für die Konstruktion eines Socket-Servers mit sicherer Beendigung in Haskell
  5. Sockets. GNU-info-Page