LINUXMAKER, OpenSource, Tutorials

Transportschicht

Transport Layer

Diese Schicht stellt den "anwendungsorientierten" Schichten einen logischen Übertragungskanal zur Verfügung, so dass diese ihre Daten sequentiell an die Schnittstelle senden. Protokolle der Transportschicht steuern die Blocklängen, die Geschwindigkeit, mit der Pakete an die unteren Schichten weiter gegeben werden und realisieren (oft) eine Fehlersicherung. Zu den Aufgaben der Transportschicht (engl. Transport Layer; auch Ende-zu-Ende-Kontrolle, Transport-Kontrolle) zählen die Segmentierung des Datenstroms und die Stauvermeidung (engl. congestion avoidance).

Ein Datensegment ist dabei eine Service Data Unit, die zur Datenkapselung auf der vierten Schicht (Transportschicht) verwendet wird. Es besteht aus Protokollelementen, die Schicht-4-Steuerungsinformationen enthalten. Als Adressierung wird dem Datensegment eine Schicht-4-Adresse vergeben, also ein Port. Das Datensegment wird in der Schicht 3 in ein Datenpaket gekapselt. Die Transportschicht bietet den anwendungsorientierten Schichten 5 bis 7 einen einheitlichen Zugriff, so dass diese die Eigenschaften des Kommunikationsnetzes nicht zu berücksichtigen brauchen.

Damit sich Sender und Empfänger auch verstehen, muss auf beiden Seiten dasselbe Transportprotokoll zum Einsatz gelangen, d.h. beide Kommunikationspartner müssen dieselbe Sprache sprechen.

Bekannte Protokolle sind TCP und UDP.

Transmission Control Protocol (TCP)

Aus Sicht einer Anwendung eröffnet das Transmission Control Protocol einen bidirektionalen, virtuellen Datenkanal zwischen den beiden Kommunikationsendpunkten. Die Daten werden scheinbar in einem Fluss übertragen. Intern gehen diese natürlich blockweise übers Netz, wobei die Blockgröße dynamisch anhand von Parametern wie der Netzauslastung, der Fenstergröße oder der Empfangs- bzw. Sendepuffer angepasst wird. Im Unterschied zum nachfolgend erwähnten User Datagram Protocol kümmert sich TCP selbst um die sichere Übertragung. Es verwendet hierzu Sequenznummern, Prüfsummen, Quittungen und Wiederholung des Transfers bei einer Zeitüberschreitung. Andere wesentliche Eigenschaften sind das Sliding-Window-Verfahren und die Kennzeichnung von Vorrangdaten.

Die Bedeutung der Felder des Protokollkopfes

Senderport, Empfängerport Analog zum Telefonat spielt der Sender einen aktiven und der Empfänger einen passiven Teil. Der Sender adressiert den Partner über IP-Adresse des Zielrechners und eine 16-Bit lange Portnummer. Beide zusammen bezeichnet man unter Unix als Socket. Um den Empfänger adressieren zu können, muss der Sender dessen Portnummer kennen. Der Sender wiederum kann (meist) eine beliebige freie Portnummer wählen, da er seine eigene Nummer dem Kommunikationspartner mitteilt. Für die Standarddienste stehen die Portnummern in der Datei /etc/services. Des Weiteren ist anzumerken, dass UDP einen eigenen Adressraum verwendet und gleiche Portnummern sich somit nicht überschneiden.
Sequenznummer Dieser 32-Bit Wert kennzeichnet eindeutig die Stellung eines Pakets innerhalb des Datenstroms in Senderichtung. Die initiale Sequenznummer wird zu Beginn des Verbindungsaufbaus von jedem Kommunikationspartner festgelegt, wobei gilt, dass sie für die maximal mögliche Lebensdauer des Pakets (TimetoLive des Internet Protokolls) bez. der verbundenen Rechner eindeutig ist. Die Sequenznummer eines folgenden Pakets berechnet sich aus der initialen Sequenznummer und der Anzahl bisher gesendeter Bytes. Somit ist es möglich, bei Verlust oder Beschädigung eines Pakets gezielt dieses wiederholt zu senden.
Quittungsnummer Die Quittungsnummer sendet der Empfänger eines Pakets als Bestätigung für den Empfang. Sie gibt an, wie viele Bytes bislang beim Partner unversehrt eingetroffen sind. Sollten Sequenznummer oder Quittungsnummer im Laufe einer Sitzung einmal überlaufen, so wird bei 0 fort gefahren.
Offset Beenden der Verbindung. Ein Partner, der dieses Bit setzt, muss seinerseits die Verbindung offenhalten, bis auch das Gegenüber das FIN-Bit sendet. Er selbst darf aber keine weiteren Daten senden (Ausnahme sind die Quittungen auf eintreffende Pakete).
Reserve Keine Verwendung
Fenstergröße Momentane Kapazität des Empfangspuffers auf Absenderseite. Sein Gegenüber darf maximal so viele Daten (auch aufgeteilt auf mehrere Pakete) senden, wie durch die Fenstergröße angegeben ist. TCP arbeitet nun so, dass es versucht, die Fenstergröße automatisch an die Kapazität des Übertragungsmediums anzupassen. Dazu wird das Fenster allmählich vergrößert, bis Pakete aufgrund des zu hohen Datenaufkommens verworfen werden müssen. Treten nun vermehrt solche Übertragungsfehler auf, wird das Fenster wieder verkleinert, um es anschließend erneut mit einer Erhöhung zu versuchen. Dieses Sliding-Window-Prinzip lässt sich sehr gut beim Download von Dateien beobachten, wobei die Datentransferrate ständig schwankt.
Prüfsumme Prüfsumme über das gesamte Paket.
Zeiger auf Vorrangdaten Der Zeiger gibt einen Offset innerhalb der Daten im Paket an. Die dem Zeiger folgenden Daten werden somit als besonders wichtig deklariert. Eine Anwendung wird beim Eintreffen solcher Daten unterrichtet. Sie sollte nun ihre bisherige Arbeit unterbrechen und die dringliche Nachricht bearbeiten. Gebrauch von diesem Mechanismus macht wohl nur Telnet.
Optionen Beim Verbindungsaufbau wird meist "MaximumSegmentSize" gesendet, um dem Partner mitzuteilen, dass größere Pakete empfangen werden können. Die weiteren Optionen sind "EndOfOptionList" und "NoOperation".

Die sechs Steuerbits

URG   Die Daten im Feld "Vorrangdaten" sind gültig
ACK Die Quittungsnummer ist gültig
PSH Die Daten sollten sofort der Anwendung übergeben werden
RES Rücksetzen der Verbindung
SYN Wunsch nach Aufbau einer Verbindung
FIN Beenden der Verbindung. Ein Partner, der dieses Bit setzt, muss seinerseits die Verbindung offenhalten, bis auch das Gegenüber das FIN-Bit sendet. Er selbst darf aber keine weiteren Daten senden (Ausnahme sind die Quittungen auf eintreffende Pakete).

Das Zusammenspiel von Sequenz- und Quittungsnummer wird in den meisten Fällen die Unversehrtheit der übertragenen Daten garantieren. Jedoch verlangt eine ausstehende Quittung das Warten auf diese. Ist nun der Partner ausgefallen, würde ein Sender bis in alle Ewigkeit auf die Bestätigung des Empfangs seines Pakets lauern. Um einen solchen "Hänger" zu verhindern, werden beim Versand eines Pakets gleich mehrere Zeitgeber gestartet.

Der wichtigste Ticker stoppt die seit dem Senden vergangene Zeit. Läuft er ab, ohne dass eine Quittung eintraf, muss das Paket erneut auf die Reise geschickt werden. Diese Zeitspanne wird allerdings dynamisch berechnet (aus dem Mittelwert der bisherigen Paketlaufzeiten), sodass sie sich an veränderte Situationen (hohe Netzlast, alternative Route) allmählich anpasst.

Ein weiterer Wecker wird verwendet, um die Bereitschaft des Empfängers zu überprüfen. Dieser Zeitgeber garantiert, dass ein Datentransfer nicht blockiert, weil dessen Fenstergröße auf 0 steht, das Paket zum Öffnen des Empfangsfensters aber verloren ging.

Der letzte hier vorgestellte Timer hält einen Port noch eine gewisse Zeit geschlossen, nachdem die Verbindung schon abgebaut wurde. Die Zeitspanne entspricht in etwa der maximalen Lebensdauer (TimeToLive) eines Datenpakets und ist nützlich, um die nächste auf dem selben Port eröffnete Verbindung nicht durch alte irrgeleitete Pakete durcheinander zu bringen.

User Datagram Protocol (UDP)

Neben TCP spielt das User Datagram Protocol eine bedeutende Rolle als Transportprotokoll. Es arbeitet verbindungslos und garantiert keinen Erfolg der Übertragung. Es beinhaltet einzig eine Prüfsumme über die Daten, um beim Empfänger deren Unversehrtheit kontrollieren zu können. Dienste, die UDP verwenden, implementieren häufig eigene Routinen zur Fehlersicherung.

UDP verwendet Ports, um versendete Daten dem richtigen Programm auf dem Zielrechner zukommen zu lassen. Dazu enthält jedes Datagramm die Portnummer des Dienstes, der die Daten erhalten soll. Diese Erweiterung der Host-zu-Host-Übertragung des Internet Protocols auf eine Prozess-zu-Prozess-Übertragung wird als Anwendungsmultiplexen und -demultiplexen bezeichnet. Zusätzlich bietet UDP die Möglichkeit einer Integritätsüberprüfung an, indem eine Prüfsumme mitgesendet wird. Dadurch können fehlerhaft übertragene Datagramme erkannt werden.

Der schlanke Protokollkopf und der Verzicht auf jegliche Sicherungsmechanismen oder eine Flusssteuerung prädistinieren das Protokoll für zeitkitische Übertragungen auf sicheren Medien (wo ein Datenverlust ziemlich unwahrscheinlich ist). Auch verwenden die meisten RPC-basierten Dienste UDP, da eine solche Abfrage eher einen Telegrammcharakter trägt (einmalige, kurze Nachrichten).