TCP (Transmission Control Protocol) ist das verbindungsorientierte Protokoll der Transportschicht. Es stellt eine Verbindung von einem Rechner zu einem anderen her ungeachtet der Zwischenstationen, die die einzelnen Pakete in der darunter liegenden Schicht nehmen müssen.
TCP arbeitet Vollduplex und ist kein Broadcast-Protokoll. Es arbeitet Punkt zu Punkt. Es mact eine Fehlerüberprüfung mittels Prüfsumme und Bestätigungen und regelt den Datenfluss per Flusskontrolle.
Jedes Byte wird bei TCP bestätigt. Der Empfänger antwortet immer mit einer Bestätigungsnummer, die auf das nächste erwartete Byte zeigt. Um Spoofing zu erschweren, wird beim Beginn einer Verbindung mit einer zufälligen Nummer begonnen.
ACK = SEQ + Anzahl empfangene Bytes.
Bei TCP muss nicht jedes Paket einzeln bestätigt werden. Durch ein Sliding Window kann der Sender mehere Pakete senden bevor er eine Bestätigung vom Empfänger braucht. Dieser kann mit einem ACK alle auf einmal bestätigen (ACK Delay).
Bei TCP gibt es auch die Möglichkeit nur bestimmte Segmente neu anzufordern (SACK).
TCP arbeitet mit einem dynamischen Sliding Window, dass sich beim Empfänger in erster Linie auf die Größe des vorhandenen Puffers bezieht. Der Empfänger teilt dem Sender regelmäßig mit, wie groß dieser Puffer ist. Ist der Puffer voll darf der Sender nichts mehr senden und muss darauf warten, dass er vom Empfänger Bescheid bekommt, dass wieder etwas frei ist. Um zu vermeiden, dass bei einem Überlasteten Empfänger sehr viele kleine Pakete geschickt werden (Silly Window Syndrom), sendet der Empfänger erst eine Nachricht über seinen zuvor voll gewesenen Puffer, wenn er zu mindestens 25% leer ist oder bis die MSS (Maximum Segement Size) erreicht ist. Dieses verfahren nennt man Silly Window Syndrom Avoidance.
Genauso muss der Sender die Daten, die von der Anwendung kommen nicht unbedingt sofort in kleinen Segmenten losschicken, sondern kann einige Daten sammeln und diese dann gemeinsam losschicken. Ist kein PSH-Flag gesetzt wird solange gewartet bis die MSS erreicht ist oder ein ACK auf ein vorhergehendes Segment angekommen ist.
Durch unterschiedlich schneller Netze in den unteren Schichten ist es bei TCP nicht sinnvoll einen festen Retransmission Timeout zu setzen. Statt dessen wird ständig die aktuelle RTT (Round Trip Time) gemessen und eine gemittelte (smoothed) RTO berechnet:
TS,i = alpha x TS,i-1 + (1 - alpha) x TRTT
TRTT: aktuell gemessen RTT
alpha: Faktor, meißtens 0.9
Daraus wird eine RTO (TR)berechnet:
TR= min(Tmax, max(Tmin, beta x TS,i))
beta: Faktor, z.B. 2
Tmin, Tmax: Unter- und Obergrenze
TCP ist auch für die Überlastüberwachung zuständig. Um langsam anzutesten, wie viel das Netz verträgt, wird der sogenannte "Slow-Start" angewendet. Gleichzeitig passt der Sender sein Sendefenster dynamisch an um das Netz nicht zu überlasten. Gehen Pakete verloren, wird dies angenommen und das Fenster wird verkleinert und somit langsamer gesendet. Diese Funktion nennt man Congestion Avoidance
Je 16 Bit für den Quell- und Zielport. So kann die entsprechende Anwendung bei den Rechnern angesteuert werden. Für bestimmte Dienste gibt es von der IANA festgelegte Ports, z.B. HTTP = Port 80.
32 Bit für die Sequenznummer. Sie beginnt bei einem zufälligen Wert und erhöht sich jeweils um die Anzahl der gesendeten Bytes.
SEQi = SEQi-1 + Anzahl gesendet Bytes in Segment SEQi-1
Bei TCP steht hier immer das nächste erwartete Daten-Byte
Die Header-Länge in 32 Bit Worten (4Bit)
16 Bit für die Anzahl der Bytes, die der Empfänger im Puffer frei hat.
16 Bit für die Prüfsumme des Headers (die IP wird hier mit eingerechnet)
Zeiger auf Vorrangdaten in den Nutzdaten
Variable Optionen in nx32 Bit.
Zum Verbindungsaufbau wird in TCP ein Three-Way-Handshake verwendet.
Zum Abbau einer Verbindung wird bei TCP auch ein Drei-Wege-Handshake angewendet.