TCP (Transmission Control Protocol) – das Transportprotokoll im Porträt
Wollen wir uns mit dem Internet verbinden, stellen wir mit einigen, wenigen Handgriffen eine Verbindung zwischen Router und Computer bzw. Mobilgerät her – wahlweise per Kabel oder drahtlosem Log-in. Weitere Schritte sind nicht erforderlich, denn die Anmeldung im Netzwerk funktioniert ebenso automatisch wie der Bezug einer individuellen Internetadresse, die Sie für das Empfangen und Senden von Daten benötigen. Möglich macht dies eine Sammlung verschiedener Protokolle, die auch als Internetprotokollfamilie bezeichnet wird. Eines der ältesten und wichtigsten Mitglieder ist dabei das Transmission Control Protocol (TCP). Es legt fest, wie die im Netzwerk vereinten Geräte Daten auszutauschen haben.
Was ist TCP (Transmission Control Protocol)?
Das Transmission Control Protocol, kurz TCP oder TCP-Protokoll, ist eine standardisierte Vereinbarung zur Datenübertragung zwischen verschiedenen Teilnehmern eines Computernetzwerks. Die Geschichte dieses Protokolls geht bis in das Jahr 1973 zurück, in dem die beiden Informatiker Robert E. Kahn und Vinton G. Cerf im Rahmen ihrer Forschungsarbeit bereits eine erste Version veröffentlichten. Bis zur Standardisierung von TCP im RFC 793 sollten allerdings noch acht weitere Jahre vergehen. Seitdem gab es eine Reihe von Verbesserungen und Erweiterungen, wobei das Protokoll im Kern bis heute unverändert geblieben ist. Die aktuelle Version, die im RFC 7323 festgehalten wurde, stammt aus dem Jahr 2014.
Der heutige Entwicklungsstatus des TCP-Protokolls erlaubt es zwei Endpunkten in einem gemeinsamen Computernetz, eine Verbindung aufzubauen, die eine beidseitige Datenübertragung erlaubt. Dabei werden jegliche Datenverluste erkannt und automatisch behoben, weshalb man es auch als zuverlässiges Protokoll bezeichnet. In der Internetprotokollfamilie bildet TCP gemeinsam mit UDP und SCTP die Gruppe der Transportprotokolle, die nach dem OSI-Modell in der Netzwerk-Architektur auf der Transportschicht eingestuft werden. Da das TCP-Protokoll in fast allen Fällen auf dem Internet Protocol (IP) aufsetzt und diese Verbindung die Basis für den Großteil aller öffentlichen und lokalen Netzwerke und Netzwerkdienste bildet, ist häufig auch vom TCP/IP-Protokollstapel die Rede, wenn im eigentlichen Sinne die Internetprotokollfamilie gemeint ist.
Wie funktionieren Verbindungen mit dem TCP-Protokoll genau?
TCP lässt die Übertragung von Informationen in beide Richtungen zu. Computersysteme, die über TCP kommunizieren, können also wie bei einem Telefongespräch zur gleichen Zeit Daten senden und empfangen. Die grundlegenden Übertragungseinheiten, auf die das Protokoll dabei zurückgreift, sind Segmente (Pakete), die zusätzlich zu den Nutzdaten auch Steuerungsinformationen enthalten können und auf eine Größe von 1.500 Byte beschränkt sind. Der Auf- und Abbau der Verbindungen, die sich als Ende-zu-Ende-Verbindungen einstufen lassen, sowie die Datenübertragung selbst werden von TCP-Software im Netz-Protokollstapel des jeweiligen Betriebssystems übernommen.
Die TCP-Software wird von den verschiedenen Netzwerkanwendungen wie Webbrowsern oder Servern über spezifische Schnittstellen angesteuert, wobei jede Verbindung immer durch zwei klar definierte Endpunkte (Client und Server) identifiziert werden muss. Welche Seite die Client- und welche die Serverrolle übernimmt, spielt dabei keine Rolle – wichtig ist, dass die TCP-Software pro Endpunkt ein eindeutiges, geordnetes Paar aus IP-Adresse und Port (auch als „2-Tupel“ oder „Socket“ bezeichnet) zur Verfügung stehen hat.
Der Drei-Wege-Handshake: So funktioniert der TCP-Verbindungsaufbau im Detail
Die Voraussetzungen für den Aufbau einer gültigen TCP-Verbindung: Beide involvierten Endpunkte müssen bereits über eine eindeutige IP-Adresse (IPv4 oder IPv6) verfügen und den gewünschten Port für die Datenübertragung deklariert und freigegeben haben. Während erstere als Identifikationsmerkmal fungiert, ist letzterer für die Zuordnung der Verbindungen zu den konkreten Client- und Serveranwendungen durch das Betriebssystem relevant.
Wie genau das Zusammenspiel zwischen TCP und IP funktioniert, erfahren Sie in unserem großen TCP/IP-Artikel.
Der konkrete Ablauf beim Verbindungsaufbau mit dem TCP-Protokoll sieht folgendermaßen aus:
- Im ersten Schritt sendet der verbindungssuchende Client dem Server ein SYN-Paket bzw. -Segment (von engl. synchronize = „synchronisieren“) mit einer individuellen, zufälligen Sequenznummer. Diese Nummer stellt die vollständige Übertragung in der korrekten Reihenfolge (ohne Duplikate) sicher.
- Hat der Server das Segment erhalten, stimmt er dem Verbindungsaufbau zu, indem er ein SYN-ACK-Paket (von engl. acknowledgement = „Bestätigung“) inklusive der um 1 erhöhten Sequenznummer des Clients zurückschickt. Zusätzlich übermittelt er dem Client seine eigene Sequenznummer.
- Zum Abschluss bestätigt der Client den Erhalt des SYN-ACK-Segments, indem er ein eigenes ACK-Paket versendet, das in diesem Fall die um 1 erhöhte Sequenznummer des Servers enthält. Gleichzeitig kann er bereits die ersten Daten an den Server übertragen.
Da der Verbindungsaufbau via Transmission Control Protocol also insgesamt drei Schritte umfasst, hat sich für diesen Prozess der Name „Drei-Wege-Handshake“ etabliert.
Ist der Port des Servers geschlossen bzw. der Zugriff blockiert, erhält der Client anstelle eines Bestätigungspakets ein TCP-RST-Paket (von engl. reset = „zurücksetzen“).
TCP-Teardown: So funktioniert der geregelte TCP-Verbindungsabbau
Beide Kommunikationspartner können eine etablierte TCP-Verbindung trennen und sogar ein einseitiger Verbindungsabbau ist möglich. Letzteres wird auch als halb geschlossene Verbindung bezeichnet, bei der es der Gegenseite auch dann noch erlaubt ist, Daten zu übertragen, wenn ein Teilnehmer die Verbindung bereits getrennt hat.
Die einzelnen Stationen des beiderseitigen Verbindungsabbaus (der Einfachheit halber auch in diesem Fall vom Client initiiert) lassen sich folgendermaßen zusammenfassen:
- Der Client sendet ein FIN-Segment an den Server und teilt diesem damit mit, dass er keine Daten mehr senden möchte. Wie beim Verbindungsaufbau sendet er eine eigene Sequenznummer mit.
- Den Erhalt des Pakets quittiert der Server mit einem ACK-Segment, das die um 1 erhöhte Sequenznummer enthält.
- Ist der Server seinerseits mit der Datenübertragung fertig, sendet er ebenfalls ein FIN-Paket, dem er wiederum seine Sequenznummer beifügt.
- Nun ist der Client an der Reihe, ein ACK-Paket inklusive der um 1 erhöhten Sequenznummer zu senden, wodurch die TCP-Verbindung für den Server offiziell beendet ist.
Für die Partei, die das letzte ACK-Segment gesendet hat (in unserem Fall: der Client), ist die Verbindung allerdings noch nicht sofort beendet. Da es keine Garantie dafür gibt, dass das zuletzt geschickte Paket auch tatsächlich angekommen ist, verweilt der jeweilige Kommunikationspartner zunächst in einem Wartemodus (auch „Time-Wait-Zustand“), bis die maximalen Laufzeiten des ACK- und eines eventuell neu verschickten FIN-Segments abgelaufen sind (nach RFC 793 jeweils zwei Minuten).
Wie sieht der Aufbau des TCP-Headers aus?
Protokolltypisch befinden sich die entscheidenden Daten, die für den Verbindungsaubau und die Datenübertragung mit dem Transmission Control Protocol benötigt werden, im Header eines TCP-Pakets. Diese Kopfdaten (auch Steuerinformationen) stehen der zu übertragenden Nutzlast (Payload) voran und haben typischerweise eine Größe von 20 Byte (160 Bit), gefolgt von bis zu 40 Byte (320 Bit) Zusatzinformationen, die optional sind und nicht in allen Paketen Verwendung finden.
Sollen lediglich Bestätigungen, Fehlernachrichten etc. übermittelt werden, wie z. B. bei den SYN- und FIN-Nachrichten (Verbindungsaufbau/-abbau), sind auch TCP-Segmente ohne Nutzdaten, also im Prinzip reine Header, zulässig.
Im Detail setzt sich der TCP-Header wie folgt zusammen:
Die einzelnen Komponenten bzw. Felder der Kopfzeile des TCP-Protokolls haben dabei folgende Bedeutung:
Quell-Port (16 Bit): Gibt die Portnummer des Senders an.
Ziel-Port (16 Bit): Gibt die Portnummer des Empfängers an.
Sequenznummer (32 Bit): Die Sequenznummer gibt wahlweise das erste Byte der angehängten Nutzdaten an oder wird im Rahmen des Verbindungsaufbaus bzw. -abbaus mitgeschickt. Sie dient gleichermaßen der Validierung und Sortierung (im Anschluss an die Übertragung) der Segmente.
Bestätigungsnummer (32 Bit): In diesem Feld wird die Bestätigungsnummer angegeben, die der Absender als nächstes erwartet. Voraussetzung für die Gültigkeit ist ein gesetztes ACK-Flag (im Feld „Flags“).
Offset (4 Bit): Das Feld „Offset“ weist die Länge des TCP-Headers in 32-Bit-Blöcken aus, um den Startpunkt der Nutzdaten hervorzuheben. Dieser ist aufgrund des variablen Optionsfelds von Segment zu Segment verschieden.
Reserviert (6 Bit): RFC 793 entsprechend für künftige Nutzung reserviert, bis dato nicht verwendet. Dieses Feld muss immer den Wert „0“ haben.
Flags (6 Bit): Über die sechs möglichen Einzel-Bits im Flags-Feld lassen sich verschiedene TCP-Aktionen aktivieren, um die Kommunikation und Datenverarbeitung zu organisieren. Bei den Flags, die hierfür entweder gesetzt oder nicht gesetzt werden, handelt es sich um folgende:
- URG: Das „Urgent“-Flag (dt. „dringend“) signalisiert der TCP-Anwendung, dass die Nutzdaten bis zum gesetzten Urgent-Pointer (s. u.) sofort zu verarbeiten sind.
- ACK: In Kombination mit der Bestätigungsnummer hat das ACK-Flag die Funktion, den Empfang von TCP-Paketen zu quittieren. Ist das Flag nicht gesetzt, ist automatisch auch die Bestätigungsnummer ungültig.
- PSH: Das „Push“-Flag sorgt dafür, dass ein TCP-Segment sofort bereitgestellt wird, ohne zunächst im Puffer von Sender und Empfänger zu landen.
- RST: Ist bei der Übertragung ein Fehler aufgetreten, lässt sich die Verwendung durch ein TCP-Paket mit gesetztem RST-Flag („Reset“) zurücksetzen.
- SYN: Nachrichten mit gesetztem SYN-Flag stellen den ersten Schritt des Drei-Wege-Handshakes dar – initiieren also den Verbindungsaufbau.
- FIN: Das „Finish“-Flag signalisiert dem Gegenüber, dass ein Kommunikationspartner die Übertragung beendet.
Fenstergröße (16 Bit): In diesem Feld wird dem Kommunikationspartner die Anzahl an Bytes übermittelt, die der Sender bereit ist zu empfangen.
Prüfsumme (16 Bit): Das Transmission Control Protocol kann Übertragungsfehler zuverlässig erkennen. Hierfür wird die Prüfsumme herangezogen, die aus dem Header, den Nutzdaten und dem sogenannten Pseudo-Header berechnet wird.
Urgent-Pointer (16 Bit): Der Urgent-Pointer („Dringend“-Anzeiger) gibt die Position des ersten Bytes nach den dringlich zu behandelnden Nutzdaten an. Folglich ist dieses Feld nur gültig und relevant, wenn das URG-Flag gesetzt ist.
Optionen (0–320 Bit): Sollen TCP-Funktionen bereitgestellt werden, die nicht in den generellen Header gehören, geschieht dies über das Optionsfeld – ein mögliches Beispiel ist die Definition der maximalen Segmentgröße. Die Optionen müssen immer eine Länge des Vielfachen von 32 Bit haben, andernfalls ist die Auffüllung mit Null-Bits (Padding) erforderlich.
So funktioniert die Datenübertragung via TCP-Protokoll im Detail
Noch bevor die ersten Daten übertragen werden, einigen sich Sender und Empfänger typischerweise zunächst auf die maximale Größe der zu versendenden TCP-Segmente (Maximum Segment Size – MSS). Standardmäßig sind dabei bis zu 1.500 Byte pro Segment möglich, wobei mindestens 20 Byte für den TCP-Header und weitere 20 Byte für den IP-Header einzuplanen sind, sodass 1.460 Byte für Nutzdaten übrigbleiben. Ist eine individuelle Größe gewünscht, muss dies wie oben beschrieben über das Optionsfeld spezifiziert werden, wodurch weitere Abstriche für den Nutzdatenteil zu machen sind.
Rechnet man mit der maximalen Segmentgröße abzüglich der Header, bedeutet das also, dass ein TCP-Paket lediglich Daten mit einer Größe von 1,46 Kilobyte bzw. 0,00146 Megabyte übertragen kann. Damit nun Webinhalte wie Bilder, die auch mal mehrere Hunderte Kilobyte groß sind, über das TCP-Protokoll ausgetauscht werden können, kommt die Segmentierung zum Einsatz, bei der die Anwendungsdaten vor dem Transport in mehrere Datenblöcke aufgeteilt, nummeriert und dann in zufälliger Abfolge versendet werden. Da der Empfänger den Erhalt jedes einzelnen Segments quittieren muss und die tatsächliche Reihenfolge anhand der Sequenznummern rekonstruieren kann, kann er die erhaltenen Nutzdaten im Anschluss an die TCP-Übertragung problemlos und vollständig wieder zusammensetzen.
Erhält der Sender für ein verschicktes Segment keine Rückmeldung, kommt der sogenannte Retransmission Timeout (RTO) zum Tragen. Läuft dieser Timer nach dem Versand eines Pakets ab, bevor eine Antwort übertragen wird, wird automatisch der erneute Versand initiiert. Die Laufzeit des Timers, die dynamisch durch einen Algorithmus angepasst wird, hängt dabei von der individuellen Übertragungsgeschwindigkeit ab.
Die wichtigsten Fakten zum Transmission Control Protocol in der Zusammenfassung
Rund ein halbes Jahrhundert lang hat das TCP-Protokoll die Geschichte und Entwicklung von Computernetzwerken bereits geprägt. Das liegt einerseits an der guten Kombinierbarkeit mit dem ebenfalls geschichtsträchtigen Internetprotokoll (IP), andererseits an den vorwiegend vorteilhaften Eigenschaften, durch die sich TCP von Alternativen wie UDP und SCTP abhebt. Die wichtigsten Merkmale lassen sich dabei wie folgt zusammenfassen:
- TCP ist verbindungsorientiert und ermöglicht eine wechselseitige Kommunikation zwischen zwei Endpunkten nach dem sogenannten Drei-Wege-Handshake.
- TCP ist zuverlässig, denn das Protokoll stellt sicher, dass alle Daten vollständig übertragen werden und vom Empfänger in der richtigen Reihenfolge zusammengesetzt werden können.
- TCP sieht den Versand der Daten in einzelnen Segmenten vor, die eine maximale Größe von 1.500 Bytes (inklusive Header) haben können.
- TCP wird – im OSI-Modell – auf der Transportschicht (Layer 4) eingestuft.
- TCP setzt in den meisten Fällen auf dem Internetprotokoll (IP) auf, weshalb häufig auch vom TCP/IP-Protokollstapel gesprochen wird.
- Der TCP-Header hat eine Standardgröße von 20 Byte – es können bis zu 40 Byte an Zusatzoptionen hinzukommen.