Jede TCP-Verbindung wird eindeutig durch zwei Endpunkte identifiziert. Dabei stellt ein Endpunkt ein geordnetes Paar dar. Das besteht aus IP-Adresse und Portnummer und bildet eine bidirektionale Schnittstelle, die wird auch als Socket bezeichnet. Die IP-Adresse identifiziert die beteiligten Rechner und die Ports identifizieren die beiden miteinander kommunizierenden Programme, auf diesen Rechnern. Durch das Verwenden von Portnummern ist es möglich, dass ein Webserver auf einem Port (normal Port 80) gleichzeitig mehrere Verbindungen zu einem anderen Rechner geöffnet haben kann.
Verbindungsaufbau und –abbau
Der Drei-Wege-Handshake
Drei-Wege-Handshake ist ein Verfahren aus der Netztechnik, dass eine sichere Datenübertragung zwischen 2 so genannten Instanzen(zb. Personal Computer) ermöglicht.
Verbindungsaufbau

TCP-Handshake
Wird das Paket empfangen und der Zielport ist geschlossen, wird mit TCP+RST geantwortet, um eben dies dem Sender zu signalisieren. Ist er offen wird als Antwort ebenfalls ein SYN-Paket mit Start-Sequenznummer y gesendet.Zudem wird zur Bestätigung das erste SYN-Paket zurückgesendet.
Dabei wird jedoch die Seq Nr. x um 1 erhöht und ein ACK-Teil(Bestätigung) des Headers angefügt. Nach dem Empfang des SYN/ACK-Pakets wird vom ursprünglichen Sender ebenfalls ein ACK-Paket mit der Seq. Nr. y+1 versand(plus x+1 zur Sicherheit).Genannt wird dieser Vorgang Forward Acknowledgement. Dieses ACK-Segment erhält dann der Server, das ACK-Segment ist durch das gesetzte ACK-Flag gekennzeichnet. Die Verbindung ist damit aufgebaut.
Verbindungsabbau

TCP-Teardown
Der geregelte Verbindungsabbau erfolgt ähnlich. Statt des SYN-Bits kommt das FIN-Bit (Finish-Abschluss) zum Einsatz, welches anzeigt, dass keine Daten mehr vom Sender kommen.
Der Erhalt des Pakets wird wiederum mittels ACK bestätigt. Der Empfänger des FIN-Pakets sendet zuletzt seinerseits ein FIN-Paket, das ihm ebenfalls bestätigt wird. Obwohl so eigentlich vier Wege genutzt werden, handelt es sich beim Verbindungsabbau auch um einen Drei-Wege-Handshake, da die ACK- und FIN-Operationen vom Server zum Client als ein Weg gewertet werden. Zudem ist es möglich, das FIN und ACK genau wie beim Verbindungsaufbau im selben Paket untergebracht werden. Die maximum segment lifetime (MSL) ist die maximale Zeit, die ein Segment im Netzwerk verbringen kann, bevor es verworfen wird. Nach dem Senden des letzten ACKs wechselt der Client in einen zwei MSL andauernden Wartezustand (Waitstate), in dem alle verspäteten Segmente verworfen werden. Dadurch wird sichergestellt, dass keine verspäteten Segmente als Teil einer neuen Verbindung fehlinterpretiert werden. Außerdem wird eine korrekte Verbindungsterminierung sichergestellt. Geht ACK y+1 verloren, läuft beim Server der Timer ab, und das sogenannte LAST_ACK Segment wird erneut übertragen.
Aufbau eines TCP-Headers
Allgemein
Ein TCP-Segment besteht immer aus zwei Teilen: dem Header und der Nutzlast (Payload). Im Header stehen Daten, die für die Kommunikation erforderlich sind, sowie Informationen die über das Dateiformat Aufschluss geben. Ein typischer Header hat eine Größe von 20Byte, da das Optionsfeld meist nicht genutzt wird. Angegeben werden die Werte in network byte order (big endian).

Schematischer Aufbau eines TCP-Headers
Erläuterungen zum Schema
Source Port
Das ist der Quellport und er gibt die Portnummer auf der Senderseite an.
Destination Port
Das ist der Zielport und er gibt die Portnummer auf der Empfängerseite an.
Sequence Number
Ist die Sequenznummer des ersten Daten-Oktetts (Byte) dieses TCP-Paketes oder die Initialisierungs-Sequenznummer, falls das SYN-Flag gesetzt ist.
Da die TCP-Segmente nach der Datenübertragung in unterschiedlicher Reihenfolge ankommen können, dient dies zur Sortierung.
Acknowledgment
Das ist die Quittierungsnummer. Sie gibt die Sequenznummer an, die der Sender dieses TCP-Segmentes als nächstes erwartet. Sie ist nur gültig, wenn das ACK-Flag gesetzt ist.
Data Offset
Gibt die Länge des TCP-Headers in 32-Bit-Blöcken, ohne die Nutzdaten (Payload) an. Es wird die Startadresse der Nutzdaten angezeigt.
Reserved
Es muss Null sein, da es nicht verwendet wird.
Control-Flags
Hier sind zwei Zustände möglich, gesetzt und nicht gesetzt. Diese dienen zur Kennzeichnung bestimmter, für die Kommunikation und Weiterverarbeitung der Daten, wichtiger Zustände. Es werden die Flags des TCP-Headers und die von ihrem Zustand abhängigen, auszuführenden Aktionen beschrieben.
URG - Urgent-Flag (urgent – dringend)
Die Daten, auf die das Urgent-Pointer-Feld zeigt, werden sofort von der Anwendung bearbeitet. Die Anwendung unterbricht die Verarbeitung der Daten des aktuellen Segments und liest das Byte aus, auf den der Pointer zeigt. Diese Flag wird genutzt, um eine Anwendung auf dem Empfänger abzubrechen, aber es wird eher selten genutzt.
ACK – Acknowledgment Flag
Es wird in Verbindung mit der Acknowledgment-Nummer genutzt und so entstehen zwei unterschiedliche Aufgaben. Wenn das SYN-Flag gleichzeitig gesetzt ist, dann dient es zur Bestätigung beim Drei-Wege-Handshake. Ist das SYN-Flag nicht gesetzt, dient es zur Bestätigung von TCP-Segmenten beim Datentransfer. Wenn das Flag nicht gesetzt ist, dann ist die Acknowledgment-Nummer nicht gültig.
PSH – Push-Flag
Hier werden die Daten unter Umgehung des Puffers sofort an die Anwendung weiter geleitet.
RST – Reset-Flag
Dieses Flag wird verwendet, wenn die Verbindung abgebrochen werden soll. Z.B. bei technischen Problemen oder zur Abweisung unerwünschter Verbindungen.
SYN – SYN-Flag
Pakete, bei denen das SYN-Flag gesetzt ist, initiieren eine Verbindung, d.h. beginnen einen Drei-Wege-Handshake. Wenn der Server bereit ist die Verbindung anzunehmen, dann antwortet er normalerweise mit SYN+ACK. Falls er das nicht ist mit RST. Bei einem Verbindungsaufbau dient das SYN zur Synchronisierung von Sequenznummern beim Verbindungsaufbau.
FIN – Finish-Flag
Es dient zur Freigabe der Verbindung und zeigt an, dass keine Daten mehr vom Sender kommen. Damit die SYN- und FIN-Flags in richtiger Reihenfolge abgearbeitet werden können, haben diese Sequenznummern.
Window
Das ist die Anzahl der Daten-Oktetts (Bytes). Es beginnt bei dem durch das Acknowledgmentfeld indizierten Daten-Oktett.
Checksum
Zu Deutsch Prüfsumme. Sie dient zur Erkennung von Übertragungsfehlern und wird über den Header und die Daten berechnet.
Urgent Pointer
Der Pointer wird in Zusammenhang mit der Sequenznummer genutzt. Zusammen mit ihr gibt er die genaue Position der Urgent-Daten im Datenstrom an. Er ist nur gültig, wenn das URG-Flag gesetzt ist.
Options
Dieses Feld ist unterschiedlich groß und enthält Zusatzinformationen. Die Optionen müssen ein vielfaches von 32Bit lang sein. Ist die Länge nicht vorhanden, so wird mit Null-Bits aufgefüllt (Padding). Das Feld ermöglicht Verbindungsdaten auszuhandeln, die nicht im TCP-Header enthalten sind (z.B. die Maximalgröße des Nutzdatenfeldes).
Datenübertragung
TCP-/IP-Paketgröße
Die typische Größe eines TCP-Segments ist 1500 Byte. Die Größe darf ein Maximum nicht überschreiten, denn es muss in die darunter liegende Übertragungsschicht passen. Von TCP- und IP-Protokollen wird ein Header mit 20 Byte Größe definiert. Also bleiben für die Nutzdaten von einem TCP/IP-Paket 1460 Byte übrig (Nutzdaten = 1500 Byte - 20 Byte - 20 Byte). Hier gibt es noch das Point-to-Point Protocol (PPP) zwischen IP und Ethernet, weil die meisten Internetanschlüsse DSL verwenden, das weitere 8 Byte für den PPP-Rahmen kostet. So verbleiben dem TCP/IP-Paket nur 1492 Byte MTU (Maximum Transmission Unit). Im Endeffekt reduzieren sich die Netzdaten auf 1452 Bytes MSS. Das ist eine Auslastung von ca. 96,8%.
Aufteilen der Anwendungsdaten auf TCP-/IP-Pakete
Über das Optionsfeld einigen sich Sender und Empfänger, vor dem Datenaustausch, über die Größe der MSS.
Beispiel:
Ein Webserver legt einen 10 Kilobyte großen Datenblock im Puffer ab. Um mit einem Nutzfeld, von 1460 Byte, 10 Kilobyte zu versenden teilt man es in mehrere Pakete auf, fügt einen TCP-Header hinzu und versendet die Segmente. Dies nennt man Segmentierung. Der Datenblock im Puffer wird in fünf Segmente aufgeteilt und jedes enthält durch die TCP-Software einen TCP-Header. Aktuell werden drei TCP-Segmente abgeschickt. Es ist nicht notwendig, dass diese nummeriert sind. Da jedes im Internet einen anderen nehmen Weg kann, kommt es auch zu Verzögerungen. Zur anschließenden Sortierung sind die Segmente nummeriert. Die Sequenznummer wird bei dieser Zuordnung auch heran gezogen. Der Empfänger muss die einwandfreien eingegangenen Segmente bestätigen. Dies geschieht mit der so genannten Prüfsumme.

TCP-/IP-Datenübertragung
Mit einer Nutzlänge von 1460 Byte schickt der Sender sein erstes TCP-Segment SEQ=1 (variable) an den Empfänger. Der Empfänger bestätigt es mit einem TCP-Header ohne Daten mit ACK=1461 und fordert damit das zweite TCP-Segment ab dem Byte Nummer 1461 beim Sender an. Dieser schickt es dann mit einem TCP-Segment und SEQ=1461 an den Empfänger. Dieser bestätigt es wieder mit einem ACK=2921 und so weiter. Es muss nicht jedes TCP-Segment vom Empfänger bestätigt werden, wenn diese zusammenhängend sind. Wenn er fünf Segmente empfängt, so braucht er nur das letzte TCP-Segment zu bestätigen. Fehlt zum Beispiel das TCP-Segment 3, weil es verloren gegangen ist, so kann er nur die 1 und die 2 bestätigen, aber nicht 4 und 5. Der Server bekommt keine Bestätigung für Segment 3, der Timer läuft ab, und er verschickt die 3 noch einmal. Kommt die 3 beim Empfänger an, so bestätigt er alle fünf TCP-Segmente. Für jedes Segment, das auf die Reise geht, startet der Sender einen Timer (RTT).