TCP

Das TCP (Transmission Control Protocol) stellt eine Verbindung zwischen 'Endverbrauchern' also in der Regel zwischen in Ausführung befindlichen Programmen auf unterschiedlichen Rechnern in unterschiedlichen Netzen zur Verfügung. Diese Eigenschaft fehlt auf der datagrammorientierten IP-Ebene. TCP geht von einem fortlaufenden Bytestrom aus den höheren Schichten aus und zerlegt diesen in sogenannte Segmente mit einer Länge von bis zu 65K Byte. TCP muss folgendes gewährleisten:

TCP ist ist formell im RFC 793 definiert. Im Laufe der Zeit wurden verschiedene Fehler und Inkonsistenzen gefunden. Ebenso haben sich Erweiterungen als nötig erwiesen. Die Fehlerkorrekturen und Erweiterungen sind im RFC 1122 bzw. im RFC 1323 beschrieben.

Ein Socket kann für mehrere Verbindungen gleichzeitig genutzt werden, d.h zwei oder mehr Verbindungen enden auf dem gleichen Socket. Portnummern unter 256 nennt man gut bekannte Ports (well known Ports). Diese Portnummern sind für die Standarddienste reserviert, Beispiele siehe oben. Eine Liste der gut bekannten Ports ist im RFC 1700 enthalten. Portnummern werden für TCP und UDP getrennt vergeben.

Eine schöne Veranschaulichung von Netzen, Hostadressen und Portnummern geben (Scheller, et al. 1994): In Analogie zum Telefonsystem stehen Portnummern auf der gleichen Stufe wie Nebenstellenanlagen. Die Netzadresse entspricht dabei der Ortsvorwahl, die Hostadresse der Rufnummer und der Port entspricht der Durchwahl des Teilnehmers.

TCP-Verbindungen sind immer Vollduplex und Punkt-zu-Punkt. Vollduplex bedeutet, daß Verkehr gleichzeitig in beide Richtungen fliessen kann. Punkt-zu-Punkt bedeutet, dass jede Verbindung genau zwei Endpunkte hat. TCP unterstützt weder Multicasting noch Broadcasting. Eine TCP-Verbindung ist ein Bytestrom, kein Nachrichtenstrom. Die Grenzen von Nachrichten werden nicht von Ende-zu-Ende beibehalten, d.h. der Empfänger kann nicht erkennen , in welchen Einheiten die Daten geschrieben wurden.

Die sendende und die empfangende TCP-Einheit tauschen Daten in Form von Segmenten aus. Ein Segment besteht aus einem festen 20-Byte-Header, einem optionalen Teil und den Datenbytes. Die TCP-Software entscheidet über die Segmentgröße. Sie kann Daten vom mehreren Schreiboperationen zu einem Segment zusammenfassen oder Daten aus einem Schreibvorgang zu einem Segment zusammenfassen oder auf mehrere Segmente aufteilen. Die Segmentgröße wird durch zwei Faktoren beschränkt:
Erstens muß jedes Segment, einschließlich des TCP-Headers in das IP-Nutzdatenfeld von 65535 Bytes passen. Zweites hat jedes Netz eine maximale Transfereinheit (MTU, Maximum Transfer Unit) in die jedes Segment passen muss. Normalerweise ist die MTU einige tausend Bytes gross und gibt die obere Grenze der Segmentlänge an. Genau wie bei den IP-Datagrammen müssen TCP-Segmente beim Durchlauf durch Netze mit kleinerer MTU vom entsprechenden Router fragmentiert werden. Jedes neue Segment erhält einen eigenen TCP- und IP-Header, so dass die Fragmentierung zusätzliche Belastung (jeweils 40 Byte) für das Übertragungsnetz bedeutet, ohne das der Durchsatz gesteigert wird.
TCP-Segmente benutzen das Sliding-Windows-Protokoll zur Flusskontrolle. Überträgt ein Sender ein Segment, startet er gleichzeitig einen Timer. Kommt nicht innerhalb einer vorbestimmten Zeitspanne ein Segment mit einer Bestätigungsnummer zurück, wird das Segment erneut übertragen. Es wird nun nicht extra zu diesem Bestätigungszweck ein Segment erzeugt, sondern die Bestätigungsnummer - die die Nummer des nächsten erwarteten Segmentes entspricht - wird huckepack mit dem nächsten Datensegment zurückgeschickt. Daher spricht man beim Sliding-Window-Protokoll auch von einem Piggyback-Verfahren (Tanenbaum, 1998). Auf die Feinheiten dieses Algorithmus - insbesonders im Zusammenhang mit der Segmentverdoppelung wegen vorzeitig abgelaufener Timer oder wegen Fragmentierung und Ausfall einiger Segmente - soll hier nicht eingegangen werden. In (Tanenbaum, 1998) und in (Tanenbaum, et al. 1995) finden sich Diskussionen dieser Problematik.

Nachfolgend soll analog zum IP-Datagramm-Header der Aufbau eines TCP-Headers schematisch wiedergegeben werden (Tanenbaum, 1998 und Miller, 1991).

0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
Quellport (Source Port) Zielport (Destination Port)
Folgenummer (Sequenz Number)
Bestätigungsnummer (Acknowledgement Number)
TCP-Header Länge
(Offset)
Reserviert U A P R S F Zeitfenstergrösse (Window Field)
Prüfsumme Urgent-Pointer
Options + Padding (0 oder mehr 32 Bit Worte)
Daten (optional)

Erläuterung:

Nach den 20-Bytes Kopfinformationen mit fest vorgegebenem Format folgen die Header-Optionen. Den Optionen können 65535-20-20=65515 Datenbytes folgen. Der zweite 20-Byte-Summand gehört zum IP-Header. Segmente ohne Daten sind zulässig und werden für Bestätigungen oder als Steuernachricht verschickt.