- Die Transportschicht
- Ports
- Umgang mit Sockets durch Client und Server
- Transmission Control Protocol (TCP): Zuverlässig
- User Datagram Protocol (UDP) fire and forget
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.
- Der Server macht sich bereit für Anfragen. Dazu muss er ständig verfügbar sein. Er holt sich einen Socket und bindet ihn durch den Aufruf von bind an den well known port, für den er zuständig sein will. Dann liest er diesen Socket aus. Solange keine Anfrage vorliegt, wird er vom Betriebssystem schlafen gelegt, bis ihn eine Anfrage weckt.
- Der Client startet die Anfrage. Dazu fordert er einen Socket mit einem beliebigen Port an. Der Client bestückt seinen Socket mit der Zieladresse und dem bekannten Port und bittet durch den Aufruf von connect um eine Verbindung.
- Der Client sendet seine Anfrage durch Aufruf von send über den Socket. Anschließend liest er auf diesem Socket durch Aufruf von receive, weil er hofft, eine Antwort zu bekommen. Der Aufruf von receive führt dazu, das der Prozess in die Warteschlange schlafen gelegt wird.
- Der Server wacht auf. Er stellt über die Funktion accept fest, dass da jemand an seinem Port ankommt. Er merkt sich den Port des Clients, um über diesen durch Aufruf von receive die Anfrage zu lesen. seine Antwort zu senden.
- Bei den meisten Servern wird das Programm einen Parallelprozess eröffnen, damit während der Bearbeitung dieser Anfrage auch andere Clients seinen Dienst benutzen können.
- Der Server beginnt mit der Bearbeitung. Beispielsweise holt er die Webseite, die der Client lesen will. Er sendet sie durch send über seinen Socket an den Client-Port, den er sich zuvor gemerkt hat. Anschließend gibt es nichts für ihn zu tun und er wartet auf den nächsten Auftrag.
- Der Client wird durch die Antwort des Servers geweckt. Er liest per receive seinen Socket aus und verarbeitet die Antwort, indem er beispielsweise die Webseite darstellt.
- Da er keine weiteren Anfragen an den Server hat, schließt er den Socket wieder und gibt damit seinen Port wieder frei.
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 |
- Quell-Port und Ziel-Port: Die IP-Adressen stehen bereits im IP-Paket, das das TCP-Paket transportiert.
- Sequenznummer: Gibt die Nummer des Bytes im Datenstrom an, bei dem dieses Paket beginnt.
- Acknowledgement-Nummer: Enthält die die nächste Sequenznummer, die der Absender der Bestätigung erwartet. Dies ist also die Sequenznummer plus 1 des letzten erfolgreich empfangenen Datenbytes. Dieses Feld ist nur gültig, wenn das ACK-Flag eingeschaltet ist. Sobald eine Verbindung hergestellt ist, ist das ACK-Flag immer eingeschaltet.
- Länge: Die Länge des Headers, kann wegen des Optionsfeldes variieren.
- Flags:
- URG: Das Segement enthält urgent data (dringende Daten).
- ACK: Zeigt, dass die Acknowledgment-Nummer gilt. Der Empfänger möge bitte darauf achten.
- PSH: Der Sender verwendete die Push-Operation.
- RST: Der Empfänger ist verwirrt und wünscht den Abbruch der Beziehungen.
- SYN: Verbindungsaufbau
- FIN: Verbindungsabbau
- Empfangsfenster: Hier kann der Client eintragen, wie viele Bytes er maximal empfangen will.
- Prüfsumme
- Urgent Data Pointer
- Optionen: Enthält die maximum segment size (MSS)
- Payload: Die Daten, wegen derer man sich den ganzen Stress macht
TCP-Verbindungs-Handshake
Da TCP verlässlich die Daten übertragen soll, gibt es einen Handshake.- Client sendet: SYN seq=x (x ist zufällig gewählt)
- Server antwortet: SYN-ACK ack=x+1 seq=y (y ist zufällig gewählt)
- Client sendet: ACK ack=y+1 seq=x+1, gefolgt von den Daten.
- Client oder Server sendet: fin seq=x (x ist zufällig gewählt)
- Gegenüber antwortet: ack=x+1 und dann fin=y (y ist zufällig gewählt)
- Client oder Server sendet: ack=y+1
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 ...
- Keine Verzögerung durch Verbindungsaufbau
- Kein Verbindungsstatus bei Sender oder Empfänger notwendig
- Kleiner Header
- Keine Überlastkontrolle
Das UDP-Paket
32 Bits | |
---|---|
Quell-Port | Ziel-Port |
Länge | Prüfsumme |
Payload |