Socket: Netzwerk-Endpunkte einfach erklärt
Ein Socket ist ein vom Betriebssystem verwalteter Kommunikationsendpunkt. Ein Programm nutzt ihn, um Daten an ein anderes Programm zu senden oder von ihm zu empfangen – auf demselben Rechner oder über ein Netzwerk.
Auf dieser Seite lernst du, wie IP-Adresse und Port einen Netzwerk-Socket adressieren, wie sich TCP- und UDP-Sockets unterscheiden und welche Schritte Client und Server ausführen.
Hake ab, was du schon kannst — und komm am Ende hierher zurück!
Was ist ein Socket?
Stell dir zwei Programme vor, die Nachrichten austauschen sollen. Sie greifen nicht selbst auf Netzwerkkarte, Übertragungswege und sämtliche Protokolldetails zu. Stattdessen fordern sie beim Betriebssystem jeweils einen Socket an.
Socket
Ein Socket ist ein vom Betriebssystem bereitgestelltes Objekt, über das ein Prozess Daten sendet und empfängt. Ein Prozess ist ein gerade ausgeführtes Programm. Der Socket bildet die Schnittstelle zwischen der Anwendung und den Kommunikationsfunktionen des Betriebssystems.
Bei einer Netzwerkübertragung gibt die Anwendung ihre Daten am Socket ab. Das Betriebssystem verarbeitet sie in den darunterliegenden Protokollschichten. Auf dem Zielrechner läuft der Weg in umgekehrter Richtung, bis die Daten über den dortigen Socket die empfangende Anwendung erreichen.
Für die beiden Programme kann es dadurch so wirken, als seien ihre Sockets direkt miteinander verbunden. Tatsächlich liegen mehrere Kommunikationsschichten und möglicherweise viele Netzwerkgeräte dazwischen.
Der Socket ist nicht das gesamte Netzwerk und auch nicht das übertragene Datenpaket. Er ist der Endpunkt, über den ein Programm die Kommunikationsdienste des Betriebssystems nutzt.
Wie finden Daten das richtige Programm?
Auf einem Rechner laufen meist viele Prozesse gleichzeitig. Deshalb genügt es nicht, nur den Zielrechner zu bestimmen. Die Daten müssen auch beim richtigen Kommunikationsendpunkt ankommen.
IP-Adresse und Port
Die IP-Adresse bezeichnet bei der Netzwerkkommunikation den Zielrechner beziehungsweise eine seiner Netzwerkschnittstellen. Der Port ist eine 16-Bit-Nummer, mit der das Betriebssystem den passenden TCP- oder UDP-Endpunkt und damit die zugehörige Anwendung zuordnet.
Eine typische Internet-Socket-Adresse besteht deshalb aus zwei Teilen:
- IP-Adresse: Welcher Rechner beziehungsweise welche Schnittstelle?
- Port: Welcher Kommunikationsendpunkt auf diesem Rechner?
Beispielsweise bezeichnet 192.168.0.1:5000 die IP-Adresse 192.168.0.1 und den Port 5000. Ein Client muss diese Serveradresse kennen. Seinen eigenen lokalen Port wählt das Betriebssystem häufig automatisch aus.
TCP-Ports und UDP-Ports bilden getrennte Namensräume. TCP-Port 5000 ist daher nicht derselbe Endpunkt wie UDP-Port 5000.
Ein Schulserver bietet einen TCP-Dienst unter 192.168.0.1:5000 an. Zwei Clients verbinden sich mit automatisch gewählten lokalen Ports:
- Client A:
192.168.0.20:53110 - Client B:
192.168.0.21:53111
Beide Verbindungen haben auf der Serverseite dieselbe IP-Adresse und denselben Port. Trotzdem kann das Betriebssystem sie unterscheiden, weil jede TCP-Verbindung durch beide Endpunkte gekennzeichnet ist: lokale IP und lokaler Port sowie entfernte IP und entfernter Port.
Wann passt TCP und wann UDP?
Sockets können unterschiedliche Kommunikationsarten verwenden. Besonders wichtig sind Stream-Sockets mit TCP und Datagramm-Sockets mit UDP.
TCP als geordneter Datenstrom
Ein TCP-Socket überträgt einen zuverlässigen, geordneten Byte-Datenstrom. Vor dem Datenaustausch wird eine Verbindung aufgebaut. TCP erkennt Übertragungsfehler und sorgt dafür, dass fehlende Daten erneut übertragen und in der richtigen Reihenfolge bereitgestellt werden.
Ein Byte-Datenstrom besitzt jedoch keine eingebauten Nachrichtengrenzen. Ein Aufruf wie recv(1024) bedeutet nur: Empfange bis zu 1024 Byte. Er garantiert nicht, dass genau eine vollständige Nachricht oder alle zuvor gesendeten Daten zurückgegeben werden. Die Anwendung braucht deshalb eine eigene Regel für Nachrichtengrenzen, etwa eine bekannte Länge oder ein eindeutiges Trennzeichen.
UDP als einzelne Datagramme
Ein UDP-Socket überträgt einzelne Datagramme, also abgegrenzte Nachrichten. Vorher ist kein TCP-artiger Verbindungsaufbau nötig. UDP garantiert jedoch weder Zustellung noch Reihenfolge. Datagramme können verloren gehen, doppelt eintreffen oder in anderer Reihenfolge ankommen.
TCP bietet einen zuverlässigen, geordneten Byte-Datenstrom, aber keine automatischen Nachrichtengrenzen. UDP erhält einzelne Datagramme, bietet dafür jedoch keine entsprechenden Zustell- und Reihenfolgegarantien.
Wie bauen Client und Server eine TCP-Verbindung auf?
Beim Client-Server-Modell übernimmt der Server eine bekannte Adresse und wartet. Der Client beginnt den Verbindungsaufbau.
Ablauf auf der Serverseite
socket()erzeugt einen Stream-Socket.bind()bindet ihn an eine lokale IP-Adresse und einen Port.listen()versetzt ihn in den Listening-Modus.accept()wartet auf einen Verbindungsversuch und liefert einen neuen Connected-Socket für diesen Client.- Über den Connected-Socket werden Daten empfangen und gesendet.
close()gibt den Kommunikations-Socket wieder frei.
Der ursprüngliche Listening-Socket bleibt für weitere Verbindungsversuche zuständig. Der von accept() gelieferte Socket dient dagegen der Kommunikation mit einem bestimmten Client. So kann ein Server mehrere Verbindungen unterscheiden und – mit zusätzlichen Threads, Prozessen oder asynchroner Verarbeitung – gleichzeitig bearbeiten.
Ablauf auf der Clientseite
socket()erzeugt einen Stream-Socket.connect()erhält die IP-Adresse und den Port des Servers und startet den Verbindungsaufbau.- Der Client sendet und empfängt Daten.
close()schließt den Socket und gibt Ressourcen frei.
Ein Echo-Dienst läuft unter 127.0.0.1:5000. Die Adresse 127.0.0.1 verweist auf den eigenen Rechner.
Der Server führt socket → bind → listen → accept aus. Danach besitzt er weiterhin seinen Listening-Socket und zusätzlich einen Connected-Socket. Der Client führt socket → connect aus. Über die verbundenen Sockets sendet der Client die Bytes einer Nachricht; der Server sendet sie zurück. Beide Seiten müssen vereinbaren, wie eine vollständige Nachricht erkannt und wann die Verbindung beendet wird.
Welche Grenzen und Fehler solltest du erkennen?
Kurze Lehrbeispiele zeigen oft nur den Grundablauf. Für echte Anwendungen fehlen dann noch wichtige Regeln.
- Teilweiser Empfang:
recv()kann weniger Daten liefern als erwartet. Die Anwendung muss weiter lesen und Nachrichtengrenzen selbst erkennen. - Teilweises Senden: Auch beim Senden muss die Anwendung sicherstellen, dass alle vorgesehenen Bytes verarbeitet wurden. Hilfsfunktionen wie
sendall()können dies vereinfachen. - Leere Empfangsdaten: Bei TCP zeigt ein Empfang von null Byte an, dass die Gegenseite ihren Sendekanal geschlossen hat.
- Blockieren:
accept()undrecv()können warten. Timeouts oder eine geeignete Nebenläufigkeit verhindern, dass das ganze Programm unbegrenzt feststeckt. - Ressourcen: Sockets müssen auch nach Fehlern geschlossen werden, damit Betriebssystemressourcen freikommen.
- Sicherheit: Ein normaler TCP-Socket verschlüsselt Daten nicht automatisch. Vertrauliche Netzwerkkommunikation benötigt zusätzliche Schutzmechanismen wie TLS und eine passende Authentifizierung.
Die Warteschlange eines Listening-Sockets und die Zahl gleichzeitig bearbeiteter Clients sind verschiedene Dinge. Der Parameter von listen() betrifft noch nicht angenommene Verbindungsversuche. Ob mehrere bereits angenommene Clients gleichzeitig bedient werden, hängt vom Aufbau des Serverprogramms ab.
Lokale Prozesse können statt einer Internetadresse auch einen Unix Domain Socket verwenden. Er wird durch einen Dateipfad wie /var/run/example.sock adressiert und vermeidet Teile des Netzwerk-Overheads. Diese Socket-Art ist vor allem auf Unix-artigen Systemen verbreitet.
Karteikasten
Überlege zuerst selbst und drehe die Karte anschließend zum Prüfen um.
Alles auf einen Blick
- Socket
- Aufgabe: verbindet Anwendung und Kommunikationsdienste des Betriebssystems
- Adressierung: IP-Adresse und Port
- TCP: verbundener, zuverlässiger und geordneter Byte-Datenstrom
- UDP: einzelne Datagramme ohne Zustell- und Reihenfolgegarantie
- Server: bind, listen und accept
- Client: connect
- Datenaustausch: senden, empfangen und Nachrichtengrenzen beachten
- Abschluss: Socket schließen und Ressourcen freigeben
Abschluss-Check
Wenn du Socket, IP-Adresse, Port, Transportart und Socket-Rolle auseinanderhalten kannst, kannst du den Weg einer Nachricht erklären und viele typische Fehler in einfachen Client-Server-Programmen gezielt diagnostizieren.
Mit Google fortfahren