Transportschicht: Sockets und Ports
Willemers Informatik-Ecke

Die Transportschicht

Die Daten, die über ein Netzwerk laufen, werden von Programmen gesendet und empfangen. Genauer gesagt sind es Prozesse, also die gestarteten Prozesse. So sendet ein Firefox eine Anfrage an den Webserverprozess (meist Apache) und erhält von diesem die gewünschte Seite.

Die Kunst der Transportschicht besteht also darin, die Prozesse miteinander zu verbinden. Um die Verbindung zum Host, auf dem Prozesse laufen, kümmert sich die Transportschicht nicht. Das ist Aufgabe der Netzwerkschicht.

Die Transportschicht selbst wird von der Anwenderschicht beauftragt, also beispielsweise von HTTP, SMTP oder DNS.

Anwendungsschicht
Transportschicht
Netzwerkschicht

Die Pakete dieser Schichten werden ineinander geschachtelt, wie die folgende Grafik zeigt.

Das äußere Paket ist das Ethernetpaket, das durch die Hardware transportiert wird und liegt damit in der untersten Schicht. Darin befindet sich das IP-Paket der Netzwerkschicht und darin wiederum das Paket der Transportschicht. In den TCP/UDP Nutzdaten wird dann das Paket der Anwenderschicht transportiert, beispielsweise eine Anfrage oder Antwort im Web mit dem Protokoll HTTP.

Ports

Die Transportschicht verbindet die Prozesse miteinander. Damit ein Prozess innerhalb eines Computers angesprochen werden kann, muss es eine Identifizierung geben. Diese nennt man einen Port, der eine ganze 16-Bit-Zahl darstellt, also zwischen 0 und 65535.

Ähnlich wie die IP-Adressen werden die Ports als Adressen für Empfänger und Absender in die Pakete der Transportschicht gesteckt.

Will das Programm Firefox auf dem Server-Host das Programm Apache erwischen, muss es neben der IP-Adresse auch den Port des Webserver-Prozesses kennen, sonst weiß der Zielrechner nicht, welcher Prozess die Anfrage erhalten soll.

Well known port

Jeder kommunikationswillige Prozess erhält vom Betriebssystem eine für diesen Host eindeutige Nummer, den Port. Ein Client kann irgendeine Nummer verwenden und tatsächlich verteilt das System die Nummern mehr oder weniger zufällig.

Der Client wird die Anfrage initiieren und muss natürlich wissen, unter welchem Port der Server zu erreichen ist. Damit das funktioniert, gibt es eine Vereinbarung, welcher Server unter welchem Port erreichbar ist.

Beispielsweise binden sich Web-Server an den Port 80, wenn sie unverschlüsselte Webseiten anzubieten haben. Diese Konvention kennt jeder Browser und ruft darum den Port 80.

Einen solchen festgelegten Port nennt man einen "well-known-port". Ein well known port hat eine Nummer zwischen 0 und 1023. Eine Liste der wichtigsten Ports findet man in der Datei services. Diese befindet sich bei UNIX, Linux oder Mac im Verzeichnis /etc, wo sich alle Konfigurationsdateien befinden.

Der Client wird sich dagegen irgendeinen Port geben lassen und bekommt dann einen Port aus dem höheren Bereich (1024 oder höher).

Falls Sie doch einmal nicht einen Standard-Well-Known-Port verwenden wollen, können Sie diesen in der URL angeben. Er wird durch einen Doppelpunkt getrennt hinter die IP-Adresse bzw. den Hostname gesetzt.

Umgang mit Sockets durch Client und Server

Als Client wird der Prozess bezeichnet, der eine Anfrage startet. Ein Server wartet auf Anfragen von Clients, bearbeitet diese Anfragen und sendet die Ergebnisse an den Client zurück.

Um von einem Programm aus auf eine Netzwerk-Ressource zuzugreifen, hat man das Konzept des Sockets erfunden. Ein Socket verhält sich aus der Sicht des Programmierers fast wie eine Datei. Er kann sie öffnen, etwas hineinschreiben, etwas herauslesen und sie wieder schließen. Der Socket stellt also die Verbindung mit dem Netzwerk dar.

Beispiel für eine Socket-Programmierung in C

Transmission Control Protocol (TCP): Zuverlässig

Die Daten, die der Client an den Server sendet oder von ihm bekommt, wurden zum Transport in Pakete verpackt. Als Programmierer werden sie erwarten, dass die Pakete vollständig und in der richtigen Reihenfolge ankommen. Leider können Pakete aber verloren gehen, zerstört werden oder aufgrund von Umwegen in der falschen Reihenfolge eintreffen.

Damit die Programme dennoch einfach so arbeiten können, als würden sie es mit Dateien zu tun haben, verwendet man in der Transportschicht das Transmission Control Protocol (TCP). Das führt alle Reparaturen automatisch aus und der Programmierer muss sich nicht darum kümmern. Kein Wunder, dass die meisten Anwendungsprotokolle wie HTTP, SMTP oder FTP TCP als Grundlage verwenden.

Das TCP-Paket

Damit die Kontrolle durchgeführt werden kann, müssen einige Informationen im Paket untergebracht werden.

32 Bits
Quell-Port Ziel-Port
Sequenznummer
Acknowledgement-Nummer
Länge, Flags Empfangsfenster
Prüfsumme Urgent Data Pointer
Optionen
Payload

TCP-Verbindungs-Handshake

Da TCP verlässlich die Daten übertragen soll, gibt es einen Handshake. Auch der Abbau der Verbindung folgt einem Handshake

Time-Out

Im Internet kann ein Paket durchaus auch einmal verloren gehen. Aber es kann sich auch nur verzögert haben. Auf das Paket zu lang zu warten, verzögert sich die Antwort. Wird zu schnell aufgegeben, kann das doch noch eintreffende, nun doppelte Paket Ärger machen und zur Überlast führen.

Wie lang ist also ein gut gewählter Time-Out. Hier ist die Transportschicht gegenüber der Verwaltung durch das Anwenderprogramm im Vorteil. Es kann die bisherigen Sendungen analysieren und daraus seine Schlüsse ziehen.

Als Basis für eine Vorhersage dient die Roundtrip-Zeit (RTT). Dazu wird immer wieder die SampleRTT verwendet. Das ist die gemessene Zeit von der Segmentübertragung bis zum ACK-Empfang. Über die bisherigen RTTs wird der Durchschnitt ermittelt und damit ältere Daten immer weniger relevant werden, werde neu hinzukommende Messungen stärker gewichtet.

Überlastung

Wenn ein Sender deutlich schneller Daten sendet als der Empfänger sie speichern kann, muss das über kurz oder lang zu Verlusten führen. Um das zu vermeiden, führt das TCP-Paket ein Feld namens RcvWindow mit, dass dem Sender mitteilt, wie groß die Pakete sein dürfen.

User Datagram Protocol (UDP) fire and forget

TCP ist zwar zuverlässig, aber das muss bezahlt werden. Erstens sind die Pakete größer und kostet durchaus seine Zeit, all die Korrekturen durchzuführen und auch nur vorzubereiten.

In manchen Fällen ist Geschwindigkeit wichtiger als Zuverlässigkeit. So ist beim Streamen von Audio-Signalen der Verlust von einem Paket in den meisten Fällen gar nicht zu hören. Und wenn es etwas knackst, denkt der Hörer vielleicht, es wäre eine echte Vinylplatte und es kommen nostalgische Gefühle auf.

In anderen Fällen sind die Verbindungsdaten vielleicht so klein, dass es sinnvoller ist, das Paket einfach noch einmal anzufordern, als sich mit Reparaturen herumzuärgern.

Will der Programmierer eine solche Verbindung haben, gibt er bei Anforderung seines Sockets als Protokoll UDP an. Logischerweise wird dieser Socket nur mit einem UDP-Port auf Serverseite verbunden.

Die Vorteile sind ...

Das UDP-Paket

32 Bits
Quell-Port Ziel-Port
Länge Prüfsumme
Payload