Fachkonzept - Socket
Sockets im Internet-Schichtenmodell
Ein Socket ist eine Schnittstelle, über die ein Anwendungsprogramm auf die Transportschicht zugreifen kann. Das Programm befindet sich also in der Anwendungsschicht. Die übrigen Schichten werden vom Betriebssystem bereitgestellt.
In Wirklichkeit wandert die Nachricht bei dem Sender über den Socket in die Transportschicht und anschließend durch alle Schichten nach "unten", bis sie in der Bitübertragungsschicht zu dem Empfänger übertragen wird. Bei dem Empfänger wandert die Nachricht dann über alle Schichten "nach oben", bis sie über den Socket bei einem Anwendungsprogramm des Empfängers ankommt. Die beiden Anwendungsprogramme bemerken dies jedoch nicht. Für sie "sieht es so aus", als seien die beiden Sockets direkt miteinander verbunden:
Wir verwenden Sockets, die auf der Transportschicht das Protokoll TCP nutzen. TCP überträgt also Daten von einem Socket zu einem anderen Socket. Dabei stellt es sicher, dass die gesendeten Daten vollständig, in der richtigen Reihenfolge und fehlerfrei bei dem Empfänger ankommen. Im Kapitel Datentransport zwischen Anwendungsprozessen erfährst du, wie TCP funktioniert.
Sockets und Port-Nummern
Daten, die über ein Netzwerk verschickt werden, müssen bei dem richtigen Computer ankommen. Deshalb besitzt jeder Computer (mindestens) eine IP-Adresse.
Wenn ein Computerprogramm gestartet wird, wird ein Prozess erzeugt. Zu einem Programm kann es also mehrere Prozesse geben - nämlich dann, wenn das Programm mehrmals gestartet wurde. Außerdem können Prozesse zu verschiedenen Programmen existieren. In der folgenden Abbildung kommt gerade ein Datenpaket über das Netzwerk an. Woher weiß der Computer, an welchen Prozess diese Daten weitergeleitet werden müssen? Dazu besitzt jeder Socket eine Port-Nummer:
Baut ein Client eine Verbindung zu einem Server auf, muss also die IP-Adresse und die Port-Nummer des Server angegeben werden:
>>> import socket
>>> komm_s = socket.socket()
>>> # IP-Adresse und Port-Nummer des Servers
>>> adresse = ('192.168.0.1', 5000)
>>> komm_s.connect(adresse)
Der Socket komm_s
des Clients besitzt ebenfalls eine Port-Nummer. Diese wird vom Betriebssystem des Clients automatisch gewählt.