Das Transmission Control Protocol

Was ist eigentlich TCP?

TCP ist der meist genutzte Transport-Dienst in IP-Netzen. Tatsächlich wird er so exzessiv genutzt, das man statt vom IP-Protokoll normalerweise von TCP/IP spricht. Er bietet eine ganze Reihe von Features für den darunter liegenden IP-Layer und die darüber liegenden Dienste. Am wichtigsten dabei: Er bietet ein verbindungsorientiertes Protokoll für die höheren Schichten, das garantiert das Pakete vollständig und in der richtigen Reihenfolge ankommen.

TCP-Ende-zu-Ende-Verbindung

TCP kümmert sich um den Datenfluss zwischen den Anwendungen und der IP-Schicht, räumt auf wenn eine Anwendung terminiert, korrigiert Fehler auf der IP-Schicht, und verwaltet eine Tabelle aller TCP-Verbindungen und deren Zustand. Es ist daher eher kompliziert, erspart es aber den Anwendungen all das selbst zu implementieren. Eine TCP-Verbindung wird wie eine Datei geöffnet und geschlossen, und in eine TCP-Verbindung kann im Grunde wie in eine Datei geschrieben und wie aus einer Datei gelesen werden.

Der Weg einer TCP-Nachricht

  • TCP empfängt von einer Anwendung einen Zeichenstrom und verpackt ihn in TCP-Pakete. Jedes Paket hat dabei eine Prüfsumme und eine Folgenummer. Die Segmentlänge wird dabei von TCP/IP selbst bestimmt oder ist vom Systemadministrator eingestellt.

  • Ist eine Zweiwege-Verbindung gewünscht wird vor dem Senden der Pakete eine virtuelle Verbindung, ein sogenannter Socket aufgebaut. Dazu sendet die TCP-Software einen Request für eine TCP-Verbindung aus.

    Dieser Request enthält eine sogenannte Socket-Nummer, die die Verbindung zwischen der sendenden, und der empfangenden Maschine kennzeichnet. Die empfangende Maschine weist nun ihre eigene eindeutige Socketnummer zu, und sendet diese zurück.

  • Ist diese virtuelle Verbindung erstellt, gibt die TCP-Software die TCP-Pakete an die IP-Schicht weiter, die für den Transport über das Netz sorgt.

  • War die Nachricht mehr als ein TCP-Segment lang, setzt die TCP-Software auf der Gegenseite die Pakete anhand der Folgenummer wieder zusammen, bevor sie zur Weiterverarbeitung durchgereicht wird. Wurde ein Teil beschädigt, fordert die TCP-Schicht zuerst das Paket mit der Folgenummer der fehlerhaften Sequenz erneut an.

    Ist das Paket erfolgreich empfangen worden, sendet die TCP-Software der empfangenden Maschine ein Acknowledgement.

Die TCP-Software der empfangenden Maschine kann eine einfache Form der Flusskontrolle nutzen. Sie tut dies, indem sie eine Puffergröße, ein sogenanntes Window zum Sender schickt. Der Sender darf nur bis dieses Fenster gefüllt ist Daten senden. Danach muss er warten bis ein neues Fenster geschickt wird.

Weiterhin verwendet TCP Timer zur Flusskontrolle. Zum Beispiel läuft während des Wartens auf eine Empfangsbestätigung ein Timer. Läuft dieser ab bevor eine Empfangsbestätigung kommt, so gilt das Paket als nicht empfangen.

Werden Teile von Paketen doppelt empfangen, so werden die überflüssigen Teile verworfen. Der TCP-Stack ist nur daran interessiert das Pakete empfangen werden. Wie oft ist ihm egal.

Der Transmission Control Block und die Flußkontrolle

TCP verwaltet eine Menge Informationen über bestehende Verbindungen, und das tut es, indem es zu jeder Verbindung einen TCP Transmission Control Block mit folgendem Inhalt verwaltet.

Variablenname Beschreibung
Sendevariablen
SND.UNA Send Unacknowledged - Anzahl der gesendeten aber nicht bestätigten TCP-Pakete
SND.NXT Send Next - Folgenummer des nächsten Paketes
SND.WND Send Window
SND.UP Sequence number of last urgent set
SND.WL1 Sequence number for last window update
SND.WL2 Acknowledgment number for last window update
SND.PUSH Sequence number of last pushed set
ISS Initial send sequence number
Receive Variables
RCV.NXT Sequence number of next received set
RCV.WND Number of sets that can be received
RCV.UP Sequence number of last urgent data
RCV.IRS Initial receive sequence number

Beispiel: Maschine A möchte 5 Datenblöcke an Maschine B schicken. Die Fenstergroeße, also die Anzahl der Blöcke die ohne Bestätigung geschickt werden dürfen ist 7. Die Variable SND.UNA enthält danach die Anzahl der unbestätigten Pakete (5) und die Variable SND.NEXT die Folgenummer des nächsten Paketes (6). Der Wert der Variable SND.WND gibt an wievele Blöcke noch ohne Bestätigung gesendet werden können (2), bevor auf eine Betsätigung von Maschine B gewartet werden muß.