TCP - Transmission Control Protocol

Das Transmission Control Protocol, kurz TCP, ist Teil der Protokollfamilie TCP/IP. TCP ist ein verbindungsorientiertes Protokoll und soll maßgeblich Datenverluste verhindern, Dateien und Datenströme aufteilen und Datenpakete Anwendungen zuordnen können.

Das Transmission Control Protocol (TCP) im TCP/IP-Protokollstapel

Schicht Dienste / Protokolle / Anwendungen
Anwendung HTTP IMAP DNS SNMP
Transport TCP UDP
Internet IP (IPv4 / IPv6)
Netzzugang Ethernet, ...

Funktionen von TCP

Funktionsweise von Sequenzierung, Verbindungsmanagement und Fehlerbehandlung

Die Funktionsweise von TCP besteht darin, den Datenstrom verschiedener Anwendungen aufzuteilen (Sequenzierung). Die Pakete werden mit einem Header zu versehen, in dem Steuer- und Kontroll-Informationen enthalten sind. Danach wird das Paket an das Internet Protocol (IP) übergeben. Die Größe der Pakete wird an die physikalischen Eigenschaften des Übertragungsmediums angepasst (Maximum Transmission Unit). Beim Empfänger werden die Datenpakete in die richtige Reihenfolge gebracht und an die adressierte Anwendung übergeben.

Für die Anwendungen ist TCP transparent. Die Anwendungen übergeben ihren Datenstrom an den TCP/IP-Stack und nehmen ihn von dort auch wieder an. Sie bekommen dabei nur Schwankungen der Geschwindigkeit mit. Mit der für die Übertragung nötige TCP-Paketstruktur sowie die Parameter der ausgehandelten Verbindung haben die Anwendungen nichts zu tun.

Durch TCP stehen Sender und Empfänger ständig in Kontakt zueinander. Obwohl es sich eher um eine virtuelle Verbindung handelt, werden während der Datenübertragung ständig Kontrollmeldungen ausgetauscht. Der Empfänger bestätigt dem Sender jedes empfangene Datenpaket. Trifft keine Bestätigung ein, wird das Paket noch mal verschickt.
Da es bei Übertragungsproblemen zu doppelten Datenpaketen und Quittierungen kommen kann, werden alle TCP-Pakete und TCP-Meldungen mit einer fortlaufenden Sequenznummer gekennzeichnet. So sind Sender und Empfänger in der Lage, die Reihenfolge und Zuordnung der Datenpakete und Meldungen zu erkennen.

TCP hat einen Algorithmus, der die Datenrate dynamisch an die Netzauslastung anpasst. TCP erhöht nach dem Verbindungsaufbau die Übertragungsrate kontinuierlich, bis irgendwo auf dem Weg zum Empfänger Pakete verloren gehen. TCP reagiert dann umgehend mit der Halbierung der Datenrate.
TCP nutzt freie Übertragungskapazität aus. Diese Steuerung findet in den Endgeräten statt. Ein Problem ist das dann, wenn Anwendungen einfach mehrere TCP-Verbindungen öffnen. Die Zuteilungsregeln von TCP können Übertragungsstrecken überlasten.

Windows-Size

TCP arbeitet mit einer Windows-Size von etwa 64 kByte/s. Doch die Datenpakete können nur mit einer bestimmten Maximalgeschwindigkeit transportiert werden. Nach jedem Paket wartet TCP beim Sender auf ein ACK (Bestätigung) vom Empfänger. In dieser Zeit ist die Verbindung ungenutzt. Im ungünstigsten Fall wartet TCP länger auf die Bestätigung als die Datenübertragung dauert.
Um das zu vermeiden, wird die Windows-Size so groß gewählt, dass die ungenutzte Zeit möglichst klein ist. Dabei steigt jedoch das Risiko, dass bei einem Datenverlust, ein Datenpaket noch mal übertragen werden muss.
Um die Wartezeiten zwischen Datenpaketen, Bestätigungen und nächsten Datenpaketen zu reduzieren, werden mehrere Datenpakete hintereinander verschickt (Sliding Window). Die Bestätigungen treffen dann mit Verzögerung ein. Weitere Datenpakete werden aber nur dann verschickt, wenn auch vorhergehenden Datenpakete bestätigt wurden.

Der kleine Bruder: UDP - User Datagram Protocol

Neben dem verbindungsorientierten TCP gibt es auch das verbindungslose und unsichere UDP. Das User Datagram Protocol (UDP) ist ebenso auf der Schicht 4, der Transportschicht, des OSI-Schichtenmodells angeordnet. Es hat die selbe Aufgabe wie TCP, nur das ihm nahezu alle Kontrollfunktionen fehlen und dadurch schlanker daher kommt und einfacher zu verarbeiten ist.

Zuordnung zwischen Datenpaket und Anwendung: Der TCP-Port

Zuordnung zwischen Datenpaket und Anwendung: Der TCP-Port
Datenpakete, die über IP ihr Ziel erreichen, werden von TCP zusammengesetzt an eine Anwendung übergeben. Da mehrere Anwendungen zugleich TCP-Verbindungen aufbauen können, muss eine Zuordnung zwischen Datenpaket und Anwendung erfolgen. Zu diesem Zweck wird eine Übergabekennung zwischen Daten und Anwendung definiert, die als Port bezeichnet wird. Es handelt sich dabei um eine fortlaufende Nummer zwischen 0 bis 65.535. TCP-Pakete sind mit diesen Port-Nummern (Sender- und Empfänger-Port) versehen, damit sie einer Anwendung zugeordnet werden können.

Die Port-Nummern, die für TCP und UDP gelten, werden von der IANA (Internet Assigned Numbers Authority) bzw. ICANN (Internet Corporation for Assigned Names and Numbers) verwaltet und vergeben.
Die Port-Nummern 0 bis 1.023 sind jeweils einer Anwendung, einem Dienst oder einem Anwendungs-Protokoll fest zugeordnet. Um Fehler und die damit einhergehende Fehlersuche zu vermeiden sollte diese Zuordnung nicht verändert werden.
Die Port-Nummern von 1.024 bis 49.151 sind zur Registrierung freigegeben. Im Prinzip kann sich jeder einen Port bei der IANA/ICANN für seine Anwendung reservieren, wenn er es begründen kann.
Die darüberliegenden Port-Nummern, ab 49.152, können frei belegt werden, sofern sie gerade von keinem anderen Dienst belegt sind.

Wenn Anwendungen zu einem Server Kontakt aufnehmen wollen, dann vergibt TCP die festgelegte Nummer für den Empfänger-Port und vergibt einen freie Nummer für den Sender-Port. Wenn der Server die Daten erhalten hat und eine Antwort zurückschickt, dann werden die Port-Nummern vertauscht. Damit wird sichergestellt, dass die Daten nicht an eine falsche Anwendung übergeben werden.
Mit den Ports ist es möglich, dass mehrere Anwendungen gleichzeitig über das Netzwerk Verbindungen zu mehreren Kommunikationspartner aufbauen können.

TCP-Port-Übersicht

Well Known Ports 0 - 1.023 Diese Ports sind fest einer Anwendung oder einem Protokoll zugeordnet. Die feste Zuordnung ermöglicht eine einfachere Konfiguration durch den Benutzern. Er kommt so mit dem Protokoll TCP in Kontakt.
Registered Ports 1.024 - 49.151 Diese Ports sind für Dienste vorgesehen.
Dynamically Allocated Ports 49.152 - 65.535 Diese Ports werden dynamisch zugewiesen. Jeder Client kann diese Ports nutzen

Beispiele für TCP-Ports

Port-NummerProtokollAnwendung
21FTP Dateitransfer (FTP-Server)
23Telnet Konsole (Server)
25SMTP Postausgang (SMTP-Server)
80HTTP World Wide Web (Webserver)
110 POP Posteingang (POP-Server)
119NNTP Usenet (News-Server)

Was ist ein "offener Port"?

Was bedeutet es, wenn von einem "offenen Port" die Rede ist? Ein Port gilt dann als offen, wenn eine Anwendung an einem Port Datenpakete entgegennimmt, die an diesen Port geschickt werden, ohne dass die Anwendung dieses Datenpaket angefordert hat.
Ein Port wird dann "geöffnet", wenn eine Anwendung gestartet wird, die an diesem Port "lauscht".

Aufbau des TCP-Headers

Aufbau des TCP-Headers
Jedem Datenpaket, das TCP verschickt, wird ein Header vorangestellt, der die folgenden Daten enthält:

Aufbau des TCP-Headers TCP-Pakete setzen sich aus dem Header-Bereich und dem Daten-Bereich zusammen. Im Header sind alle Informationen enthalten, die für eine gesicherte TCP-Verbindung wichtig sind. Der TCP-Header ist in mehrere 32-Bit-Blöcke aufgeteilt. Mindestens enthält der Header 5 solcher Blöcke. Somit hat ein TCP-Header eine Länge von mindestens 20 Byte.

Bedeutung der Felder im TCP-Header

FeldinhaltBitBeschreibung
Quell-Port
(Source-Port)
16 Hier steht der Quell-Port, von der die Anwendung das TCP-Paket verschickt. Bei einer Stellenanzahl von 16 Bit beträgt der höchste Port 65.535.
Ziel-Port
(Destination-Port)
16 Hier steht der Ziel-Port, über welchen das TCP-Paket der Anwendung zugestellt wird. Bei einer Stellenanzahl von 16 Bit beträgt der höchste Port 65.535.
Sequenz-Nummer32 Bei jeder TCP-Verbindung werden Nummern zwischen den Kommunikationspartner ausgehandelt. Während der Verbindung werden diese Nummern verwendet um die TCP-Pakete eindeutig zu identifizieren.
Acknowledgement-Nummer32 Alle Datenpakete werden bestätigt. Dazu dient das ACK-Flag und die Acknowledgement-Nummer, die sich aus der Sequenz-Nummer und der Anzahl von empfangenen Bytes errechnet. Damit kann der Sender feststellen, ob die Daten beim Empfänger vollständig angekommen sind.
Data Offset4 Hier steht die Anzahl der 32-Bit-Blöcke des TCP-Headers. Die Mindestmenge beträgt 5.
Reserviert6 Dieser Bereich ist auf 000000 gesetzt und für Erweiterungen des TCP-Headers gedacht.
Flags 6 Kennzeichnung bestimmter für die Kommunikation und Weiterverarbeitung der Daten wichtiger Zustände (URG, ACK, PSH, RST, SYN, FIN).
Window-Größe16 Der Empfänger sendet dem Sender in diesem Feld die Anzahl an Daten, die der Sender senden darf. Dadurch wird das Überlaufen des Empfangspuffers beim Empfänger verhindert. Den Vorgang nennt man Windowing und dient der Datenflusssteuerung.
Check-Summe16 Dieses Feld dient der Kontrolle von Header- und Datenbereich.
Urgent-Pointer16 Zusammen mit der Sequenz-Nummer gibt dieser Wert die genaue Position der Daten im Datenstrom an. Der Wert ist nur gültig, wenn das URG-Flag gesetzt ist.
Optionen/Füllbits
(Options/Padding),
jeweils 32 Bit lang
Dieses Feld beinhaltet optionale Informationen. Um die 32-Bit-Grenze einzuhalten wird das Options-Feld mit Nullen aufgefüllt.

TCP-Flags zur Steuerung der Kommunikation

TCP-Flag Beschreibung
Urgent-Pointer-Flag
(URG-Flag)
Ist das URG-Flag gesetzt wird das Urgent-Pointer-Feld ausgewertet. Ein solches Datenpaket ist keiner Anwendung zugeordnet. Es hat eine besondere Priorität.
Acknowledgement-Flag
(ACK-Flag)
Da sich die Acknowledgement-Nummer nicht bei jedem Datenpaket ändert, kennzeichnet ein gesetztes ACK-Flag die Gültigkeit der Acknowledgement-Nummer.
Push-Flag
(PSH-Flag)
TCP puffert einzelne Datenpakete bis eine größere zusammenhängende Datenmenge vorhanden ist. Ist das PSH-Flag gesetzt, wird dieses Paket sofort an den TCP-Port weitergeleitet.
Reset-Flag
(RST-Flag)
Ist ein Abbruch der TCP-Verbindung notwendig, wird das RST-Flag gesetzt. Es kommt auch zum Einsatz, wenn eine TCP-Verbindung abgewiesen wird.
Syncronization-Flag
(SYN-Flag)
Das SYN-Flag wird gesetzt, wenn zwischen Sender und Empfänger eine Verbindung aufgebaut werden soll.
Final-Flag
(FIN-Flag)
Sind zwischen zwei Stationen alle Daten übertragen, senden beide Stationen ein TCP-Paket mit gesetztem FIN-Flag. Danach gilt die TCP-Verbindung als beendet.

TCP-Verbindungsaufbau

TCP-Verbindungsaufbau
Der Verbindungsaufbau läuft nach dem Three-Way-Handshake ab. Zuerst schickt der Client an den Server einen Verbindungswunsch (SYN). Der Server bestätigt den Erhalt der Nachricht (ACK) und äußert ebenfalls seinen Verbindungswunsch (SYN). Der Client bestätigt den Erhalt der Nachricht (ACK). Danach erfolgt der Datenaustausch zwischen Client und Server.

TCP-Datenaustasuch

TCP-Kommunikation
Der Sender beginnt mit dem Senden des ersten Datenpakets (Send Paket 1). Der Empfänger nimmt das Paket entgegen (Receive Paket 1) und bestätigt den Empfang (Send ACK Paket 1). Der Sender nimmt die Bestätigung entgegen (Receive ACK Paket 1) und sendet das zweite Datenpaket (Send Paket 2). Der Empfänger nimmt das zweite Paket entgegen (Receive Paket 2) und bestätigt den Empfang (Send ACK Paket 2). Der Sender nimmt die zweite Bestätigung entgegen (Receive ACK Paket 2).
Und so läuft der Datenaustausch weiter, bis alle Pakete übertragen wurden.

TCP-Kommunikation mit Timer

TCP-Kommunikation mit Timer
Um festzustellen, ob Datenpakete ankommen, wird ein Timer gesetzt. Läuft der Timer ab, dann muss der Sender das Datenpaket noch mal schicken.
Im Prinzip läuft die Kommunikation wie gewohnt. Der Sender beginnt mit dem Senden des ersten Datenpakets (Send Paket 1). Gleichzeitig setzt er einen Timer. Bekommt er die Bestätigung (Send ACK Paket 1) des Empfängers, dann sendet er das zweite Paket. Läuft der Timer jedoch ab, dann geht der Sender von einem Paketverlust aus und sendet das Datenpaket noch mal (Send Paket 1).

TCP-Verbindungsabbau

TCP-Verbindungsabbau
Der Verbindungsabbau kann sowohl vom Client als auch vom Server vorgenommen werden. Zuerst schickt einer der beiden der Gegenstelle einen Verbindungsabbauwunsch (FIN). Die Gegenstelle bestätigt den Erhalt der Nachricht (ACK) und schickt gleich darauf ebenfalls einen Verbindungsabbauwunsch (FIN). Danach bekommt die Gegenstelle noch mitgeteilt, dass die Verbindung abgebaut ist (ACK).