Sockets: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „=Allgemein= *Ein Socket ist ein vom Betriebssystem bereitgestelltes Objekt, das als Kommunikationsendpunkt dient. *Ein Programm verwendet Sockets, um Daten mit…“)
 
 
(21 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
=Allgemein=
+
= Allgemein =
*Ein Socket ist ein vom Betriebssystem bereitgestelltes Objekt, das als Kommunikationsendpunkt dient.
+
* Ein Socket ist ein vom Betriebssystem bereitgestelltes Objekt, das als Kommunikationsendpunkt dient.
*Ein Programm verwendet Sockets, um Daten mit anderen Programmen auszutauschen.
+
* Ein Programm verwendet Sockets, um Daten mit anderen Programmen auszutauschen.
*Das andere Programm kann sich dabei auf demselben Computer (Interprozesskommunikation) befinden  
+
* Das andere Programm kann sich dabei auf demselben Computer (Interprozesskommunikation) befinden oder auf einem anderen, über das Netzwerk erreichbaren Computer.
*Oder einem anderen, via Netzwerk erreichbaren Computer befinden.
+
* Die Kommunikation über Sockets erfolgt in der Regel bidirektional (Senden und Empfangen).
*Die Kommunikation über Sockets erfolgt in der Regel bidirektional,
 
*Daten können über das Socket können Daten sowohl empfangen als auch gesendet werden.
 
=Allgemeines Funktionsprinzip=
 
*Sockets bilden eine plattformunabhängige standardisierte Schnittstelle 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.
 
*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.
 
  
 +
= Funktionsprinzip =
 +
* Sockets bilden eine plattformunabhängige Schnittstelle zwischen der Netzwerkprotokoll-Implementierung des Betriebssystems und der Anwendungssoftware.
 +
* Ein Computerprogramm fordert einen Socket vom Betriebssystem an; dieses verwaltet alle benutzten Sockets und Verbindungsinformationen.
  
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).
+
==== Multiplexing und das 5-Tupel ====
 +
* Ein einzelner Server-Port kann tausende Verbindungen gleichzeitig bedienen.
 +
* Das Betriebssystem unterscheidet die Pakete anhand des 5-Tupels: {Quell-IP, Quell-Port, Ziel-IP, Ziel-Port, Protokoll}.
 +
* Solange ein Wert abweicht, wird das Paket einer eindeutigen Verbindung zugeordnet.
  
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.
+
= Internet-Sockets =
 +
* Man unterscheidet Stream-Sockets (kontinuierlicher Datenstrom, meist TCP) und Datagram-Sockets (geschlossene Nachrichten, meist UDP).
 +
* Ein Socket repräsentiert die Verbindungsstelle durch Adressinformationen (IP und Port) sowohl der lokalen als auch der entfernten Seite.
  
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:
+
==== Privilegierte Ports unter Unix/Linux ====
 +
* Ports von 0 bis 1023 sind privilegiert; nur Prozesse mit Root-Rechten dürfen diese binden.
 +
* Dies verhindert, dass unbefugte Benutzer Standard-Dienste (wie SSH oder HTTP) fälschen.
  
(<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-Logik =
 +
* Ein Server wartet auf Anfragen; bei Erfolg wird die Verbindung oft geklont (Forking), damit der Haupt-Socket weiter auf neue Anfragen warten kann.
 +
* Der geklonte Prozess bedient nur diesen einen Client, bis die Verbindung beendet wird.
  
Ablauf der Socket-Kommunikation
+
==== Ephemeral Ports und TIME_WAIT ====
Stream Sockets
+
* Clients nutzen zufällige, kurzlebige Ports (Ephemeral Ports) für ausgehende Verbindungen.
Client-seitig:
+
* Nach dem Schließen verbleibt ein Socket oft kurz im Zustand TIME_WAIT, um verspätete Pakete der alten Verbindung abzufangen.
  
Socket erstellen
+
= TCP Status =
erstellten Socket mit der Server-Adresse verbinden, von welcher Daten angefordert werden sollen
+
* '''listening:''' Der Server wartet auf eingehende Anfragen; der Socket ist noch nicht fest verbunden.
Senden und Empfangen von Daten
+
* '''connected:''' Eine konkrete Instanz einer Verbindung; ein Client wird aktiv bedient.
evtl. Socket herunterfahren (shutdown(), close())
 
Verbindung trennen, Socket schließen
 
Server-seitig:
 
  
Server-Socket erstellen
+
= Die drei Arten von Sockets =
Binden des Sockets an eine Adresse (Port), über welche Anfragen akzeptiert werden
 
auf Anfragen warten
 
Anfrage akzeptieren und damit ein neues Socket-Paar für diesen Client erstellen
 
Bearbeiten der Client-Anfrage auf dem neuen Client-Socket
 
Client-Socket wieder schließen.
 
Datagram Sockets
 
Client-seitig:
 
  
Socket erstellen
+
== TCP Sockets ==
An Adresse senden
+
* Kombination aus IP-Adresse und Port, einem Service fest zugewiesen.
Server-seitig:
+
* Nutzt eine etablierte Verbindung (Aufbau/Abbau).
 +
{{#drawio:tcp-sockets}}
 +
* '''Beispiel:''' tcp 192.168.4.1:80 LISTEN httpd
  
Socket erstellen
+
== UDP Sockets ==
Socket binden
+
* Kombination aus IP-Adresse und Port, verbindungslos.
warten auf Pakete
+
{{#drawio:udp-sockets}}
Sockets und Interprozesskommunikation
+
* '''Beispiel:''' udp 0.0.0.0:5353 avahi-daemon (0.0.0.0 bedeutet Bindung an alle lokalen IPs).
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.
 
  
 
+
== UNIX Sockets ==
 
+
* Kommunikation lokaler Prozesse über eine spezielle Datei im Dateisystem.
*TCP Sockets
+
* Unterstützt sowohl "stream" als auch "datagram".
*UDP Sockets
+
{{#drawio:unix-socket}}
*Unix Sockets
+
* '''Beispiel:''' unix LISTENING /run/snapd.socket
 +
* '''Dateityp prüfen:''' ls -l /run/snapd.socket (Kennung 's' am Anfang: srw-rw-rw-).

Aktuelle Version vom 29. März 2026, 11:16 Uhr

Allgemein

  • Ein Socket 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) befinden oder auf einem anderen, über das Netzwerk erreichbaren Computer.
  • Die Kommunikation über Sockets erfolgt in der Regel bidirektional (Senden und Empfangen).

Funktionsprinzip

  • Sockets bilden eine plattformunabhängige Schnittstelle zwischen der Netzwerkprotokoll-Implementierung des Betriebssystems und der Anwendungssoftware.
  • Ein Computerprogramm fordert einen Socket vom Betriebssystem an; dieses verwaltet alle benutzten Sockets und Verbindungsinformationen.

Multiplexing und das 5-Tupel

  • Ein einzelner Server-Port kann tausende Verbindungen gleichzeitig bedienen.
  • Das Betriebssystem unterscheidet die Pakete anhand des 5-Tupels: {Quell-IP, Quell-Port, Ziel-IP, Ziel-Port, Protokoll}.
  • Solange ein Wert abweicht, wird das Paket einer eindeutigen Verbindung zugeordnet.

Internet-Sockets

  • Man unterscheidet Stream-Sockets (kontinuierlicher Datenstrom, meist TCP) und Datagram-Sockets (geschlossene Nachrichten, meist UDP).
  • Ein Socket repräsentiert die Verbindungsstelle durch Adressinformationen (IP und Port) sowohl der lokalen als auch der entfernten Seite.

Privilegierte Ports unter Unix/Linux

  • Ports von 0 bis 1023 sind privilegiert; nur Prozesse mit Root-Rechten dürfen diese binden.
  • Dies verhindert, dass unbefugte Benutzer Standard-Dienste (wie SSH oder HTTP) fälschen.

Server-Logik

  • Ein Server wartet auf Anfragen; bei Erfolg wird die Verbindung oft geklont (Forking), damit der Haupt-Socket weiter auf neue Anfragen warten kann.
  • Der geklonte Prozess bedient nur diesen einen Client, bis die Verbindung beendet wird.

Ephemeral Ports und TIME_WAIT

  • Clients nutzen zufällige, kurzlebige Ports (Ephemeral Ports) für ausgehende Verbindungen.
  • Nach dem Schließen verbleibt ein Socket oft kurz im Zustand TIME_WAIT, um verspätete Pakete der alten Verbindung abzufangen.

TCP Status

  • listening: Der Server wartet auf eingehende Anfragen; der Socket ist noch nicht fest verbunden.
  • connected: Eine konkrete Instanz einer Verbindung; ein Client wird aktiv bedient.

Die drei Arten von Sockets

TCP Sockets

  • Kombination aus IP-Adresse und Port, einem Service fest zugewiesen.
  • Nutzt eine etablierte Verbindung (Aufbau/Abbau).
  • Beispiel: tcp 192.168.4.1:80 LISTEN httpd

UDP Sockets

  • Kombination aus IP-Adresse und Port, verbindungslos.
  • Beispiel: udp 0.0.0.0:5353 avahi-daemon (0.0.0.0 bedeutet Bindung an alle lokalen IPs).

UNIX Sockets

  • Kommunikation lokaler Prozesse über eine spezielle Datei im Dateisystem.
  • Unterstützt sowohl "stream" als auch "datagram".
  • Beispiel: unix LISTENING /run/snapd.socket
  • Dateityp prüfen: ls -l /run/snapd.socket (Kennung 's' am Anfang: srw-rw-rw-).