Transmission Control Protocol: Unterschied zwischen den Versionen

Aus Foxwiki
KKeine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
'''TCP''' ('''Transmission Control Protocol''') ist ein Netzwerkprotokoll, das definiert, auf welche Art und Weise Daten zwischen Netzwerkkomponenten ausgetauscht werden sollen.
'''TCP''' ('''Transmission Control Protocol''') ist ein Netzwerkprotokoll, das definiert, auf welche Art und Weise Daten zwischen Netzwerkkomponenten ausgetauscht werden sollen.
 
{| class="wikitable float-right"
{| class="wikitable float-right"
|-
|-
!colspan="2" style="background:#C0C0FF; font-size:larger;"| TCP (Transmission Control Protocol)
!colspan="2" style="background:#C0C0FF; font-size:larger;"| TCP (Transmission Control Protocol)
|-
|-
! Familie:
! Familie:
| Internetprotokollfamilie
| Internetprotokollfamilie
|-
|-
! Einsatzgebiet:
! Einsatzgebiet:
| Zuverlässiger bidirektionaler<br />Datentransport
| Zuverlässiger bidirektionaler<br />Datentransport
|-
|-
 
! Netzwerk-IP-Transportprotokoll:
! Netzwerk-IP-Transportprotokoll:
| TCP| Hypertext Transfer Protocol ('''HTTP'''), Simple Mail Transfer Protocol ('''SMTP''')
| TCP| Hypertext Transfer Protocol ('''HTTP'''), Simple Mail Transfer Protocol ('''SMTP''')
|-
|-
! Standards:
! Standards:
| RFC 793 (1981)<br />RFC 7323 (2014)
| RFC 793 (1981)<br />RFC 7323 (2014)
|}
|}
 
= Beschreibung =
= Beschreibung =
== Geschichte ==
== Geschichte ==
*Entwickelt von Robert E. Kahn und Vinton G. Cerf als Forschungsarbeit.
* Entwickelt von Robert E. Kahn und Vinton G. Cerf als Forschungsarbeit.
*Beginn 1973, erste Standardisierung 1981 als [https://tools.ietf.org/html/rfc793 ''RFC 793''].
* Beginn 1973, erste Standardisierung 1981 als [https://tools.ietf.org/html/rfc793 ''RFC 793''].
*Danach gab es viele Erweiterungen, diese werden bis heute in RFCs spezifiziert.
* Danach gab es viele Erweiterungen, diese werden bis heute in RFCs spezifiziert.
 
== Was ist TCP ==
== Was ist TCP ==
*Ist ein zuverlässiges, verbindungsorientiertes, paketvermitteltes (nicht ''paketvermittelnd'') Transportprotokoll.
* Ist ein zuverlässiges, verbindungsorientiertes, paketvermitteltes (nicht ''paketvermittelnd'') Transportprotokoll.
*TCP ermöglicht die Übertragung eines Datenstroms.
* TCP ermöglicht die Übertragung eines Datenstroms.
*Im Unterschied zum verbindungslosen [[Netzwerke:UDP | User Datagram Protokoll (UDP)]] stellt TCP eine Verbindung zwischen zwei Endpunkten (Sockets) einer Netzverbindung her.
* Im Unterschied zum verbindungslosen [[Netzwerke:UDP | User Datagram Protokoll (UDP)]] stellt TCP eine Verbindung zwischen zwei Endpunkten (Sockets) einer Netzverbindung her.
**Auf dieser Verbindung können in beide Richtungen Daten übertragen werden.
** Auf dieser Verbindung können in beide Richtungen Daten übertragen werden.
 
== Vorteile ==
== Vorteile ==
*Netzwerküberlastungskontrolle.
* Netzwerküberlastungskontrolle.
*Zuverlässige Datenübertragung:
* Zuverlässige Datenübertragung:
**erkennt verlorene Segmente, doppelte Segmente und fehlerhafte Segmente.
** erkennt verlorene Segmente, doppelte Segmente und fehlerhafte Segmente.
 
== Allgemeines ==
== Allgemeines ==
TCP ist im Prinzip eine Ende-zu-Ende-Verbindung in Vollduplex.
TCP ist im Prinzip eine Ende-zu-Ende-Verbindung in Vollduplex.
*Kann auch als zwei Halbduplexverbindungen betrachtet werden (Informationsfluss in beide Richtungen (allerdings nicht gleichzeitig)).  
* Kann auch als zwei Halbduplexverbindungen betrachtet werden (Informationsfluss in beide Richtungen (allerdings nicht gleichzeitig)).  
*Die Daten in Gegenrichtung können zusätzliche Steuerungsinformationen enthalten.  
* Die Daten in Gegenrichtung können zusätzliche Steuerungsinformationen enthalten.  
*Anwendungen, die TCP häufig nutzen, sind zum Beispiel Webbrowser und Webserver.
* Anwendungen, die TCP häufig nutzen, sind zum Beispiel Webbrowser und Webserver.
 
=== TCP-Software ===
=== TCP-Software ===
*Übernimmt Verbindungsverwaltung sowie die Datenübertragung.  
* Übernimmt Verbindungsverwaltung sowie die Datenübertragung.  
*Netz-Protokollstack des Betriebssystems.  
* Netz-Protokollstack des Betriebssystems.  
*Anwendungsprogramme nutzen Sockets.   
* Anwendungsprogramme nutzen Sockets.   
 
=== Software-Schnitstelle ===
=== Software-Schnitstelle ===
*bei Windows in extra einzubindenden Programmbibliotheken („Winsock.dll“ bzw. „wsock32.dll“).
* bei Windows in extra einzubindenden Programmbibliotheken („Winsock.dll“ bzw. „wsock32.dll“).
*Linux und andere unixoide Betriebssysteme enthalten einen Socketlayer im Betriebssystemkern (Zugriff über Systemaufrufe).
* Linux und andere unixoide Betriebssysteme enthalten einen Socketlayer im Betriebssystemkern (Zugriff über Systemaufrufe).
 
== TCP-Verbindung ==  
== TCP-Verbindung ==  
*Jede TCP-Verbindung wird eindeutig durch zwei Endpunkte identifiziert.  
* Jede TCP-Verbindung wird eindeutig durch zwei Endpunkte identifiziert.  
**Ein Endpunkt stellt ein geordnetes Paar dar (IP-Adresse und Port).  
** Ein Endpunkt stellt ein geordnetes Paar dar (IP-Adresse und Port).  
**Ein solches Paar bildet eine bidirektionale Software-Schnittstelle (Socket).
** Ein solches Paar bildet eine bidirektionale Software-Schnittstelle (Socket).
TCP-Verbindungen werden durch vier Werte (einem Quadrupel) eindeutig identifiziert:
TCP-Verbindungen werden durch vier Werte (einem Quadrupel) eindeutig identifiziert:
 
(Quell-IP-Adresse, Quell-Port, Ziel-IP-Adresse, Ziel-Port)
  (Quell-IP-Adresse, Quell-Port, Ziel-IP-Adresse, Ziel-Port)
 
=== Beispiel ===
=== Beispiel ===
#Ein Serverprozess erzeugt einen Socket auf Port 80 (''bind'').
#Ein Serverprozess erzeugt einen Socket auf Port 80 (''bind'').
#*Markiert diesen für eingehende Verbindungen (''listen'').
#*Markiert diesen für eingehende Verbindungen (''listen'').
#*Fordert vom Betriebssystem die nächste anstehende Verbindung an (''accept'').  
#*Fordert vom Betriebssystem die nächste anstehende Verbindung an (''accept'').  
#*Diese Anforderung blockiert den Serverprozess zunächst, da noch keine Verbindung existiert.  
#*Diese Anforderung blockiert den Serverprozess zunächst, da noch keine Verbindung existiert.  
#Die erste Verbindungsanfrage kommt und wird vom Betriebssystem angenommen, die Verbindung kommt zustande.
#Die erste Verbindungsanfrage kommt und wird vom Betriebssystem angenommen, die Verbindung kommt zustande.
#Jetzt wird diese Verbindung durch das Quadrupel identifiziert.
#Jetzt wird diese Verbindung durch das Quadrupel identifiziert.
##Der Serverprozess wird aufgeweckt und ihm ein Handle für diese Verbindung überreicht.  
##Der Serverprozess wird aufgeweckt und ihm ein Handle für diese Verbindung überreicht.  
##Üblich startet der Serverprozess einen Kindprozess, dem er die Behandlung der Verbindung delegiert.  
##Üblich startet der Serverprozess einen Kindprozess, dem er die Behandlung der Verbindung delegiert.  
##Der Serverprozess fährt mit einer weiterer ''Accept''-Anforderung an das Betriebssystem fort.
##Der Serverprozess fährt mit einer weiterer ''Accept''-Anforderung an das Betriebssystem fort.
*Dadurch ist es möglich, dass ein Webserver mehrere Verbindungen von verschiedenen Rechnern annehmen kann.
* Dadurch ist es möglich, dass ein Webserver mehrere Verbindungen von verschiedenen Rechnern annehmen kann.
 
=== Ports ===
=== Ports ===
*Portnummern sind Dualsystem 16-Bit-Zahlen und reichen von 0 bis 65535.
* Portnummern sind Dualsystem 16-Bit-Zahlen und reichen von 0 bis 65535.
*Ports von 0 bis 1023 sind reserviert
* Ports von 0 bis 1023 sind reserviert
**Vergeben von '''I'''nternet '''A'''ssigned '''N'''umbers '''A'''uthority (IANA)
** Vergeben von '''I'''nternet '''A'''ssigned '''N'''umbers '''A'''uthority (IANA)
**z.B. ist Port 80 für '''H'''yper'''t'''ext '''T'''ransfer '''P'''rotocol (HTTP) reserviert.
** z.B. ist Port 80 für '''H'''yper'''t'''ext '''T'''ransfer '''P'''rotocol (HTTP) reserviert.
*Das Benutzen der vordefinierten Ports ist nicht bindend.  
* Das Benutzen der vordefinierten Ports ist nicht bindend.  
**Jeder Administrator kann bspw. einen FTP-Server (normalerweise Port 21) auch auf einem beliebigen Port laufen lassen.
** Jeder Administrator kann bspw. einen FTP-Server (normalerweise Port 21) auch auf einem beliebigen Port laufen lassen.
*Mehrfaches ''listen'' auf demselben Port ist nicht möglich.
* Mehrfaches ''listen'' auf demselben Port ist nicht möglich.
 
 
= Header =
= Header =
=== Allgemeines ===
=== Allgemeines ===
*Das TCP-Segment besteht immer aus zwei Teilen: dem  Header  und der Nutzlast.
* Das TCP-Segment besteht immer aus zwei Teilen: dem  Header  und der Nutzlast.
*Die Nutzlast enthält die zu übertragenden Daten.
* Die Nutzlast enthält die zu übertragenden Daten.
**Die wiederum Protokollinformationen der Anwendungsschicht, wie HTTP oder FTP, entsprechen können.  
** Die wiederum Protokollinformationen der Anwendungsschicht, wie HTTP oder FTP, entsprechen können.  
*Der Header enthält für die Steuerung der Kommunikation erforderliche Daten.  
* Der Header enthält für die Steuerung der Kommunikation erforderliche Daten.  
*Da das Options-Feld in der Regel nicht genutzt wird, hat ein typischer Header eine Größe von 20 Byte.
* Da das Options-Feld in der Regel nicht genutzt wird, hat ein typischer Header eine Größe von 20 Byte.
 
=== Felder des TCP-Header ===
=== Felder des TCP-Header ===
[[Datei:TCP Header.svg|mini|550px| Aufbau des TCP-Headers]]
[[Datei:TCP Header.svg|mini|550px| Aufbau des TCP-Headers]]
 
{| class="wikitable"
{| class="wikitable"
! Feld !! Funktion !! Größe  
! Feld !! Funktion !! Größe  
|-----
|-----
| Source Port (Quellport)
| Source Port (Quellport)
|
|
*Gibt die Portnummer auf der Senderseite an
* Gibt die Portnummer auf der Senderseite an
| 2 Byte
| 2 Byte
|-----
|-----
| Destinations Port (Zielport)
| Destinations Port (Zielport)
|
|
*Gibt die Portnummer auf der Empfängerseite an.
* Gibt die Portnummer auf der Empfängerseite an.
| 2 Byte
| 2 Byte
|-----
|-----
| Sequence Number
| Sequence Number
|
|
*Sequenznummer des ersten Daten-Oktett dieses TCP-Segments, dient zur Sortierung  Oder die Initialisierungs-Sequenznummer falls das SYN-Flag gesetzt ist
* Sequenznummer des ersten Daten-Oktett dieses TCP-Segments, dient zur Sortierung  Oder die Initialisierungs-Sequenznummer falls das SYN-Flag gesetzt ist
| 4 Byte  
| 4 Byte  
|-----  
|-----  
| Acknowledgement Number
| Acknowledgement Number
|
|
*Gibt die '' Sequenznummer '' an, die der Absender dieses TCP-Segments als Nächstes erwartet  Sie ist nur gültig, falls das ACK-Flag  gesetzt ist.
* Gibt die '' Sequenznummer '' an, die der Absender dieses TCP-Segments als Nächstes erwartet  Sie ist nur gültig, falls das ACK-Flag  gesetzt ist.
| 4 Byte
| 4 Byte
|-----
|-----
| Data Offset
| Data Offset
|
|
*Gibt die ''Länge des TCP-Headers'' in 32-Bit-Blöcken an (ohne Nutzdaten).   
* Gibt die ''Länge des TCP-Headers'' in 32-Bit-Blöcken an (ohne Nutzdaten).   
*Hiermit wird die Startadresse der Nutzdaten angezeigt.
* Hiermit wird die Startadresse der Nutzdaten angezeigt.
| 4 Bit
| 4 Bit
|-----
|-----
| Reserved
| Reserved
|
|
*Ist für zukünftige Verwendungen reserviert.
* Ist für zukünftige Verwendungen reserviert.
*Alle Bits müssen null sein.
* Alle Bits müssen null sein.
| 4 Bit
| 4 Bit
|-----
|-----
| Control-Flags
| Control-Flags
|
|
*Zweiwertige Variablen mit den Zuständen ''gesetzt'' und ''nicht gesetzt''.
* Zweiwertige Variablen mit den Zuständen ''gesetzt'' und ''nicht gesetzt''.
*Kennzeichnung für die wichtigen Zustände der Kommunikation und Weiterverarbeitung der Daten.
* Kennzeichnung für die wichtigen Zustände der Kommunikation und Weiterverarbeitung der Daten.
| 8 Bit
| 8 Bit
|-----
|-----
| (Receive) Window
| (Receive) Window
|
|
*Ist die Anzahl der Bytes die der Sender dieses TCP-Segments bereit ist zu empfangen.
* Ist die Anzahl der Bytes die der Sender dieses TCP-Segments bereit ist zu empfangen.
*Beginnend bei dem durch das ''Acknowledgementfeld'' indizierten Daten-Oktett.
* Beginnend bei dem durch das ''Acknowledgementfeld'' indizierten Daten-Oktett.
| 2 Byte
| 2 Byte
|-----
|-----
| Checksum
| Checksum
|
|
*Dient zur Erkennung von Übertragungsfehlern.
* Dient zur Erkennung von Übertragungsfehlern.
*Wird über den TCP-Header, die Daten und einen Pseudo-Header berechnet.
* Wird über den TCP-Header, die Daten und einen Pseudo-Header berechnet.
*Der Header besteht aus Ziel-IP, Quell-IP, TCP-Protokollkennung (0x0006) und der Länge des TCP-Headers inkl. Nutzdaten (in Bytes).
* Der Header besteht aus Ziel-IP, Quell-IP, TCP-Protokollkennung (0x0006) und der Länge des TCP-Headers inkl. Nutzdaten (in Bytes).
| 2 Byte
| 2 Byte
|-----
|-----
| Urgent Pointer
| Urgent Pointer
|
|
*Nur gültig, wenn das URG-Flag gesetzt ist.
* Nur gültig, wenn das URG-Flag gesetzt ist.
*Die Urgent-Daten beginnen sofort nach dem Header
* Die Urgent-Daten beginnen sofort nach dem Header
*Zusammen mit der Sequenz-Nummer gibt dieser Wert die Position des ersten Bytes ''nach'' den Urgent-Daten an.
* Zusammen mit der Sequenz-Nummer gibt dieser Wert die Position des ersten Bytes ''nach'' den Urgent-Daten an.
| 2 Byte
| 2 Byte
|-----
|-----
| Options
| Options
|
|
*Unterschiedlich groß und enthält Zusatzinformationen.
* Unterschiedlich groß und enthält Zusatzinformationen.
*Müssen ein Vielfaches von 32 Bit lang sein, ansonsten muss mit Nullbits aufefüllt werden (''Padding'').
* Müssen ein Vielfaches von 32 Bit lang sein, ansonsten muss mit Nullbits aufefüllt werden (''Padding'').
*Ermöglicht Verbindungsdaten auszuhandeln, die nicht im TCP-Header enthalten sind, wie z.B. die Maximalgröße des Nutzdatenfeldes.
* Ermöglicht Verbindungsdaten auszuhandeln, die nicht im TCP-Header enthalten sind, wie z.B. die Maximalgröße des Nutzdatenfeldes.
| 0–40 Byte
| 0–40 Byte
|}
|}
 
=== TCP-Flags ===
=== TCP-Flags ===
{| class="wikitable"
{| class="wikitable"
! Feld !! Funktion !! Größe  
! Feld !! Funktion !! Größe  
|-----
|-----
| ECE-Flag (ECN-Echo)
| ECE-Flag (ECN-Echo)
|
|
* Teilt dem Sender mit, dass das Netzwerk überlastet ist und die Senderate reduziert werden muss.
* Teilt dem Sender mit, dass das Netzwerk überlastet ist und die Senderate reduziert werden muss.
* Wird für Explicit Congestion Notification (ECN) benötigt
* Wird für Explicit Congestion Notification (ECN) benötigt
| 1 Bit
| 1 Bit
|-----
|-----
| CRW-Flag (''Congestion Window Reduced'')
| CRW-Flag (''Congestion Window Reduced'')
|
|
* Teilt dem Empfänger mit das die Senderate reduziert wurde.
* Teilt dem Empfänger mit das die Senderate reduziert wurde.
* Wird für Explicit Congestion Notification (ECN) benötigt
* Wird für Explicit Congestion Notification (ECN) benötigt
| 1 Bit
| 1 Bit
|-----
|-----
| URG-Flag (''Urgent'')
| URG-Flag (''Urgent'')
|  
|  
*Die Daten nach dem Header werden sofort von der Anwendung bearbeitet.
* Die Daten nach dem Header werden sofort von der Anwendung bearbeitet.
*Anwendung unterbricht die Datenverarbeitung des aktuellen TCP-Segments und liest alle Bytes nach dem Header bis zu dem Byte, auf das das ''Urgent-Pointer ''-Feld zeigt, aus.
* Anwendung unterbricht die Datenverarbeitung des aktuellen TCP-Segments und liest alle Bytes nach dem Header bis zu dem Byte, auf das das ''Urgent-Pointer ''-Feld zeigt, aus.
*Kann verwendet werden, um eine Anwendung auf dem Empfänger abzubrechen.
* Kann verwendet werden, um eine Anwendung auf dem Empfänger abzubrechen.
*In der Regel wird dieses Flag nicht ausgewertet.
* In der Regel wird dieses Flag nicht ausgewertet.
| 1 Bit
| 1 Bit
|-----
|-----
| ACK-Flag (''Acknowledgment'')
| ACK-Flag (''Acknowledgment'')
|
|
* Hat in Verbindung mit der ''Acknowledgment''-Nummer die Aufgabe, den Empfang von TCP-Segmenten bestätigen.
* Hat in Verbindung mit der ''Acknowledgment''-Nummer die Aufgabe, den Empfang von TCP-Segmenten bestätigen.
* Die ''Acknowledgment''-Nummer ist nur gültig, wenn das Flag gesetzt ist.
* Die ''Acknowledgment''-Nummer ist nur gültig, wenn das Flag gesetzt ist.
| 1 Bit
| 1 Bit
|-----
|-----
| PSH-Flag (''Push'')
| PSH-Flag (''Push'')
|
|
* Sowohl der ausgehende, als auch der eingehende Puffer wird übergangen.
* Sowohl der ausgehende, als auch der eingehende Puffer wird übergangen.
* Hilft den Datenstrom von TCP effizienter zu verarbeiten, indem die empfangende Applikation gezielter aufgeweckt werden kann.
* Hilft den Datenstrom von TCP effizienter zu verarbeiten, indem die empfangende Applikation gezielter aufgeweckt werden kann.
* RFC 1122 & RFC 793
* RFC 1122 & RFC 793
| 1 Bit  
| 1 Bit  
|-----
|-----
| RST-Flag (''Reset'')
| RST-Flag (''Reset'')
|
|
* Wird verwendet, wenn eine Verbindung abgebrochen werden soll.
* Wird verwendet, wenn eine Verbindung abgebrochen werden soll.
* z.B. bei technischen Problemen oder zur Abweisung unerwünschter Verbindungen
* z.B. bei technischen Problemen oder zur Abweisung unerwünschter Verbindungen
* Oder bei nicht geöffneten Ports, es wird kein ICMP-Paket mit „Port Unreachable“ verschickt.
* Oder bei nicht geöffneten Ports, es wird kein ICMP-Paket mit „Port Unreachable“ verschickt.
| 1 Bit
| 1 Bit
|-----
|-----
| SYN-Flag (''Synchronize'')
| SYN-Flag (''Synchronize'')
|
|
* Pakete mit diesem Flag initiieren eine Verbindung.
* Pakete mit diesem Flag initiieren eine Verbindung.
* Dient der Synchronisation von ''Sequenznummern'' beim Verbindungsaufbau.
* Dient der Synchronisation von ''Sequenznummern'' beim Verbindungsaufbau.
* Server antwortet normalerweise mit SYN+ACK oder RST.
* Server antwortet normalerweise mit SYN+ACK oder RST.
| 1 Bit
| 1 Bit
|-----
|-----
| FIN-Flag (''Finish'')
| FIN-Flag (''Finish'')
|
|
* Schlussflag, dient zur Freigabe der Verbindung, zeigt an, dass keine Daten vom Sender kommen.
* Schlussflag, dient zur Freigabe der Verbindung, zeigt an, dass keine Daten vom Sender kommen.
* FIN- und SYN-Flags haben Sequenznummern, damit diese in der richtigen Reihenfolge abgearbeitet werden.
* FIN- und SYN-Flags haben Sequenznummern, damit diese in der richtigen Reihenfolge abgearbeitet werden.
| 1 Bit
| 1 Bit
|-----
|-----
|}
|}
 
= Installation =
= Installation =
 
= Syntax =
= Syntax =
== Parameter ==
== Parameter ==
== Optionen ==
== Optionen ==
= Konfiguration =
= Konfiguration =
== Dateien ==
== Dateien ==
 
= Anwendungen =
= Anwendungen =
== Verbindungsaufbau und -abbau ==
== Verbindungsaufbau und -abbau ==
=== Allgemein ===
=== Allgemein ===
Ein Server, der seinen Dienst anbietet, erzeugt einen Endpunkt (Socket) mit der Portnummer und seiner IP-Adresse.  
Ein Server, der seinen Dienst anbietet, erzeugt einen Endpunkt (Socket) mit der Portnummer und seiner IP-Adresse.  
*Bezeichnet als "''passive open''" oder "''listen''".
* Bezeichnet als "''passive open''" oder "''listen''".
 
Ein Client, der eine Verbindung aufbauen will, erzeugt einen Endpunkt (Socket) mit seiner IP-Adresse und einer eigenen, noch freien Portnummer.  
Ein Client, der eine Verbindung aufbauen will, erzeugt einen Endpunkt (Socket) mit seiner IP-Adresse und einer eigenen, noch freien Portnummer.  
*Mit der Adresse des Servers und dem Port kann dann eine Verbindung aufgebaut werden.  
* Mit der Adresse des Servers und dem Port kann dann eine Verbindung aufgebaut werden.  
 
Während der Datenübertragungsphase sind die Rollen von Client und Server (aus TCP-Sicht) vollkommen symmetrisch.
Während der Datenübertragungsphase sind die Rollen von Client und Server (aus TCP-Sicht) vollkommen symmetrisch.
*Bezeichnet als "''active open''"  
* Bezeichnet als "''active open''"  
Jeder der beiden beteiligten Rechner einen Verbindungsabbau einleiten.
Jeder der beiden beteiligten Rechner einen Verbindungsabbau einleiten.
 
=== Verbindungsaufbau ===
=== Verbindungsaufbau ===
[[Datei:Tcp-handshake.svg|mini|500px| TCP-Handshake]]
[[Datei:Tcp-handshake.svg|mini|500px| TCP-Handshake]]
 
#Der Client sendet dem Server ein ''SYN''-Paket mit einer Sequenznummer ''x''.  
#Der Client sendet dem Server ein ''SYN''-Paket mit einer Sequenznummer ''x''.  
#*Die Sequenznummern sind für die Sicherstellung einer vollständigen Übertragung in der richtigen Reihenfolge und ohne Duplikate wichtig.  
#*Die Sequenznummern sind für die Sicherstellung einer vollständigen Übertragung in der richtigen Reihenfolge und ohne Duplikate wichtig.  
#*Ein Paket, dessen ''SYN-Bit'' im Header gesetzt ist.  
#*Ein Paket, dessen ''SYN-Bit'' im Header gesetzt ist.  
#*Die Start-Sequenznummer ist eine beliebige zufällige Zahl, abhängig von der TCP-Implementierung.   
#*Die Start-Sequenznummer ist eine beliebige zufällige Zahl, abhängig von der TCP-Implementierung.   
#Der Server empfängt das Paket und antwortet.
#Der Server empfängt das Paket und antwortet.
#*Port geschlossen, antwortet er mit einem TCP-RST, ein Signal, dass keine Verbindung aufgebaut werden kann.  
#*Port geschlossen, antwortet er mit einem TCP-RST, ein Signal, dass keine Verbindung aufgebaut werden kann.  
#*Port geöffnet, bestätigt er den Erhalt des ersten SYN-Pakets und stimmt dem Verbindungsaufbau zu, indem er ein SYN/ACK-Paket zurückschickt.  
#*Port geöffnet, bestätigt er den Erhalt des ersten SYN-Pakets und stimmt dem Verbindungsaufbau zu, indem er ein SYN/ACK-Paket zurückschickt.  
#**Ein Paket, mit ACK-Flag im TCP-Header, welche die Sequenznummer ''x+1'' des SYN-Pakets im Header enthält.
#**Ein Paket, mit ACK-Flag im TCP-Header, welche die Sequenznummer ''x+1'' des SYN-Pakets im Header enthält.
#**Der Server sendet im Gegenzug seine Start-Sequenznummer ''y'', diese ist unabhängig von der Start-Sequenznummer des Clients.   
#**Der Server sendet im Gegenzug seine Start-Sequenznummer ''y'', diese ist unabhängig von der Start-Sequenznummer des Clients.   
#Der Client bestätigt den Erhalt des SYN/ACK-Pakets durch ein eigenes ACK-Pakets mit der Sequenznummer ''x+1''.  
#Der Client bestätigt den Erhalt des SYN/ACK-Pakets durch ein eigenes ACK-Pakets mit der Sequenznummer ''x+1''.  
#*Wird auch als „Forward Acknowledgement“ bezeichnet.
#*Wird auch als „Forward Acknowledgement“ bezeichnet.
#*Aus Sicherheitsgründen sendet der Client die Sequenznummer des Servers + 1 im ACK-Segment zurück.   
#*Aus Sicherheitsgründen sendet der Client die Sequenznummer des Servers + 1 im ACK-Segment zurück.   
#Die Verbindung ist damit aufgebaut.
#Die Verbindung ist damit aufgebaut.
 
==== Verbindungsaufbau Beispiel ====
==== Verbindungsaufbau Beispiel ====
 
{| style="text-align:center"
{| style="text-align:center"
|-
|-
|width="60px"| 1. || SYN-SENT ||width="60px"| → || <SEQ=100><CTL=SYN> ||width="60px"| → || SYN-RECEIVED
|width="60px"| 1. || SYN-SENT ||width="60px"| → || <SEQ=100><CTL=SYN> ||width="60px"| → || SYN-RECEIVED
|-
|-
| 2. || SYN/ACK-RECEIVED || ← || <SEQ=300><ACK=101><CTL=SYN,ACK> || ← || SYN/ACK-SENT
| 2. || SYN/ACK-RECEIVED || ← || <SEQ=300><ACK=101><CTL=SYN,ACK> || ← || SYN/ACK-SENT
|-
|-
| 3. || ACK-SENT || → || <SEQ=101><ACK=301><CTL=ACK> || → || ESTABLISHED
| 3. || ACK-SENT || → || <SEQ=101><ACK=301><CTL=ACK> || → || ESTABLISHED
|}
|}
 
*Nach Aufbau ist die Verbindung für beide Kommunikationspartner gleichberechtigt
* Nach Aufbau ist die Verbindung für beide Kommunikationspartner gleichberechtigt
*Man kann einer bestehenden Verbindung auf TCP-Ebene nicht ansehen, wer der Server und wer der Client ist.
* Man kann einer bestehenden Verbindung auf TCP-Ebene nicht ansehen, wer der Server und wer der Client ist.
*Eine Unterscheidung dieser beiden Rollen in der weiteren Betrachtung keine Bedeutung mehr.
* Eine Unterscheidung dieser beiden Rollen in der weiteren Betrachtung keine Bedeutung mehr.
 
=== Verbindungsabbau ===
=== Verbindungsabbau ===
[[Datei:TCP-Teardown.svg|mini|500px| TCP-Teardown]]
[[Datei:TCP-Teardown.svg|mini|500px| TCP-Teardown]]
 
*Der Verbindungsabbau kann ''beidseitig'' oder ''schrittweise einseitig'' erfolgen.
* Der Verbindungsabbau kann ''beidseitig'' oder ''schrittweise einseitig'' erfolgen.
*Der geregelte Verbindungsabbau erfolgt dem Verbindungsaufbau ähnlich.
* Der geregelte Verbindungsabbau erfolgt dem Verbindungsaufbau ähnlich.
*#Statt dem SYN-Bits kommt das FIN-Bit zum Einsatz, welches anzeigt, dass keine Daten mehr vom Sender kommen werden.  
* #Statt dem SYN-Bits kommt das FIN-Bit zum Einsatz, welches anzeigt, dass keine Daten mehr vom Sender kommen werden.  
*#Der Erhalt des Pakets wird mit ACK bestätigt und der Empfänger des FIN-Pakets sendet zuletzt seinerseits ein FIN-Paket.
* #Der Erhalt des Pakets wird mit ACK bestätigt und der Empfänger des FIN-Pakets sendet zuletzt seinerseits ein FIN-Paket.
*#Dieses FIN-Paket wird ihm zuletzt bestätigt.
* #Dieses FIN-Paket wird ihm zuletzt bestätigt.
 
*Ein verkürztes ist Verfahren möglich, bei dem FIN und ACK genau wie beim Verbindungsaufbau im selben Paket untergebracht werden.
* Ein verkürztes ist Verfahren möglich, bei dem FIN und ACK genau wie beim Verbindungsaufbau im selben Paket untergebracht werden.
 
=== Halb geschlossene Verbindungen ===
=== Halb geschlossene Verbindungen ===
*Der Verbindungsabbau erfolgt schrittweise einseitig.
* Der Verbindungsabbau erfolgt schrittweise einseitig.
*Erlaubt der Gegenseite nach der einseitigen Trennung noch Daten zu übertragen.
* Erlaubt der Gegenseite nach der einseitigen Trennung noch Daten zu übertragen.
 
=== Halb offene Verbindungen ===
=== Halb offene Verbindungen ===
*wenn eine Seite abstürzt, ohne dass die verbleibende Seite dies erfährt.
* wenn eine Seite abstürzt, ohne dass die verbleibende Seite dies erfährt.
*Effekt: Betriebssystemressourcen werden nicht freigegeben.  
* Effekt: Betriebssystemressourcen werden nicht freigegeben.  
*Ursprung: TCP-Verbindungen von der Protokollseite bestehen, bis sie abgebaut werden.
* Ursprung: TCP-Verbindungen von der Protokollseite bestehen, bis sie abgebaut werden.
 
==== Maximum segment lifetime (MSL)====
==== Maximum segment lifetime (MSL)====
*Die maximale Zeit, die ein Segment im Netzwerk verbringen kann, bevor es verworfen wird.
* 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 (''wait state''), in dem alle verspäteten Segmente verworfen werden.  
* Nach dem Senden des letzten ACKs wechselt der Client in einen zwei MSL andauernden Wartezustand (''wait state''), in dem alle verspäteten Segmente verworfen werden.  
**Dadurch wird sichergestellt, dass keine verspäteten Segmente als Teil einer neuen Verbindung fehlinterpretiert werden können.  
** Dadurch wird sichergestellt, dass keine verspäteten Segmente als Teil einer neuen Verbindung fehlinterpretiert werden können.  
**Außerdem wird eine korrekte Verbindungsterminierung sichergestellt.  
** Außerdem wird eine korrekte Verbindungsterminierung sichergestellt.  
*Geht ACK ''y+1'' verloren, läuft beim Server der Timer ab, und das LAST_ACK-Segment wird erneut übertragen.
* Geht ACK ''y+1'' verloren, läuft beim Server der Timer ab, und das LAST_ACK-Segment wird erneut übertragen.
 
=== Puffer ===
=== Puffer ===
*Beim Datenversand über TCP werden zwei Puffer verwendet.  
* Beim Datenversand über TCP werden zwei Puffer verwendet.  
#Senderseitig übermittelt die Applikation die Sendedaten an TCP und dieses puffert die Daten.
#Senderseitig übermittelt die Applikation die Sendedaten an TCP und dieses puffert die Daten.
#Effizient werden mehrere kleine Übertragungen in Form einer einzigen großen gesendet.
#Effizient werden mehrere kleine Übertragungen in Form einer einzigen großen gesendet.
#Empfängerseitig landen die empfangenen Daten im Puffer, dieser verfolgt ähnliche Ziele.  
#Empfängerseitig landen die empfangenen Daten im Puffer, dieser verfolgt ähnliche Ziele.  
*Wenn von TCP mehrere einzelne Pakete empfangen wurden, ist es besser, diese zusammengefügt an die Applikation weiterzugeben.
* Wenn von TCP mehrere einzelne Pakete empfangen wurden, ist es besser, diese zusammengefügt an die Applikation weiterzugeben.
 
=== Drei-Wege-Handschlag ===
=== Drei-Wege-Handschlag ===
*Typisch werden Antworten auf das erste SYN- bzw. FIN-Paket zu einem einzelnen Paket zusammengefasst (SYN/ACK bzw. FIN/ACK).
* Typisch werden Antworten auf das erste SYN- bzw. FIN-Paket zu einem einzelnen Paket zusammengefasst (SYN/ACK bzw. FIN/ACK).
**Theoretisch wäre auch das Versenden zweier separater Pakete denkbar.
** Theoretisch wäre auch das Versenden zweier separater Pakete denkbar.
*In diesem Fall müssen nur noch drei Pakete versendet werden, man spricht vom Drei-Wege-Handschlag.
* In diesem Fall müssen nur noch drei Pakete versendet werden, man spricht vom Drei-Wege-Handschlag.
*Das Zusammenfassen des FIN-Pakets und ACK-Pakets ist problematisch.
* Das Zusammenfassen des FIN-Pakets und ACK-Pakets ist problematisch.
**Das Fin-Paket signalisiert „keine weiteren Daten“.  
** Das Fin-Paket signalisiert „keine weiteren Daten“.  
*Allerdings kann der Sender des FIN-Pakets weiterhin Daten empfangen wollen (halb geschlossenen Verbindung).
* Allerdings kann der Sender des FIN-Pakets weiterhin Daten empfangen wollen (halb geschlossenen Verbindung).
 
; Überlegung
; Überlegung
#Den Beginn einer HTTP-Anfrage im SYN-Paket mitschicken, weitere Daten nach Verbindungsaufbau.
#Den Beginn einer HTTP-Anfrage im SYN-Paket mitschicken, weitere Daten nach Verbindungsaufbau.
#Im letzten HTTP-Request-Paket die Verbindung mittels FIN schließen.  
#Im letzten HTTP-Request-Paket die Verbindung mittels FIN schließen.  
*In der Praxis nicht angewendet da:
* In der Praxis nicht angewendet da:
**Wenn der Browser die Verbindung auf diese Art schließt, würde möglicherweise der Server die Verbindung schließen, anstatt die Anfrage vollständig zu beantworten.
** Wenn der Browser die Verbindung auf diese Art schließt, würde möglicherweise der Server die Verbindung schließen, anstatt die Anfrage vollständig zu beantworten.
 
 
 
== Datenübertragung ==
== Datenübertragung ==
[[Datei:Tcp daten.svg|mini| 450px | Segmentierung der Nutzdaten]]
[[Datei:Tcp daten.svg|mini| 450px | Segmentierung der Nutzdaten]]
 
=== TCP-/IP-Segment-Größe ===
=== TCP-/IP-Segment-Größe ===
*Typischerweise eine Größe von maximal 1500Bytes .  
* Typischerweise eine Größe von maximal 1500Bytes .  
*Muss in die darunter liegende Übertragungsschicht passen, das  Internetprotokoll  (IP).
* Muss in die darunter liegende Übertragungsschicht passen, das  Internetprotokoll  (IP).
*IP-Pakete sind zwar bis 65.535Bytes (64KiB) spezifiziert, werden aber meist über Ethernet übertragen.
* IP-Pakete sind zwar bis 65.535Bytes (64KiB) spezifiziert, werden aber meist über Ethernet übertragen.
**Bei Ethernet ist die Größe der (Layer-3-)Nutzdaten auf 64 bis 1500Bytes festgelegt (bei Jumbo Frames höher).
** Bei Ethernet ist die Größe der (Layer-3-)Nutzdaten auf 64 bis 1500Bytes festgelegt (bei Jumbo Frames höher).
*TCP- und IP-Protokoll definieren jeweils einen Header von 20Bytes Größe.  
* TCP- und IP-Protokoll definieren jeweils einen Header von 20Bytes Größe.  
*Für die (Applikations-)Nutzdaten bleiben in einem TCP/IP-Paket also 1460Bytes übrig.  
* Für die (Applikations-)Nutzdaten bleiben in einem TCP/IP-Paket also 1460Bytes übrig.  
*Da die meisten Internet-Anschlüsse DSL verwenden, kommt zusätzlich das Point-to-Point Protocol (PPP) zwischen IP und Ethernet zur Anwendung (8Bytes).  
* Da die meisten Internet-Anschlüsse DSL verwenden, kommt zusätzlich das Point-to-Point Protocol (PPP) zwischen IP und Ethernet zur Anwendung (8Bytes).  
 
Die Nutzdaten reduzieren sich also auf insgesamt 1500− 20− 20− 8 =1452Bytes  Maximum Segment Size (MSS).  
Die Nutzdaten reduzieren sich also auf insgesamt 1500− 20− 20− 8 =1452Bytes  Maximum Segment Size (MSS).  
*Dies entspricht einer maximalen Nutzdatenrate von 96,8 %.
* Dies entspricht einer maximalen Nutzdatenrate von 96,8 %.
 
=== Aufteilen der Anwendungsdaten auf TCP-/IP-Segmente ===
=== Aufteilen der Anwendungsdaten auf TCP-/IP-Segmente ===
# Empfänger und Sender einigen sich vor dem Datenaustausch über das Options-Feld auf die Größe der Maximum Segment Size (MSS).
# Empfänger und Sender einigen sich vor dem Datenaustausch über das Options-Feld auf die Größe der Maximum Segment Size (MSS).
# Als Beispiel legt ein Webserver einen 7Kilobyte großen Datenblock im Puffer ab.
# Als Beispiel legt ein Webserver einen 7Kilobyte großen Datenblock im Puffer ab.
#* Um mit einem 1460Byte großen Nutzdatenfeld 7Kilobyte Daten zu versenden:
#* Um mit einem 1460Byte großen Nutzdatenfeld 7Kilobyte Daten zu versenden:
#*# Teilt die TCP-Software die Daten auf mehrere Pakete auf
#*# Teilt die TCP-Software die Daten auf mehrere Pakete auf
#*# Fügt einen TCP-Header hinzu und versendet die TCP-Segmente.
#*# Fügt einen TCP-Header hinzu und versendet die TCP-Segmente.
#* Dieser Vorgang wird Segmentierung genannt.  
#* Dieser Vorgang wird Segmentierung genannt.  
# Der Datenblock im Puffer wird in fünf Segmente aufgeteilt, diese werden nacheinander abgeschickt.
# Der Datenblock im Puffer wird in fünf Segmente aufgeteilt, diese werden nacheinander abgeschickt.
## Jedes Segment erhält durch die TCP-Software einen TCP-Header.
## Jedes Segment erhält durch die TCP-Software einen TCP-Header.
# Segmente kommen nicht zwingend in richtiger Reihenfolge an.
# Segmente kommen nicht zwingend in richtiger Reihenfolge an.
# Um die Segmente wieder zu sortieren, ist jedes Segment nummeriert.  
# Um die Segmente wieder zu sortieren, ist jedes Segment nummeriert.  
#* Bei der Zuordnung der Segmente im Empfänger wird die Sequenznummer herangezogen.
#* Bei der Zuordnung der Segmente im Empfänger wird die Sequenznummer herangezogen.
#Die TCP-Software des Empfängers bestätigt die einwandfrei angekommenen TCP-Segmente.  
#Die TCP-Software des Empfängers bestätigt die einwandfrei angekommenen TCP-Segmente.  
#*Andernfalls werden die Pakete neu angefordert.
#*Andernfalls werden die Pakete neu angefordert.
 
=== Beispiel einer TCP-/IP-Datenübertragung ===
=== Beispiel einer TCP-/IP-Datenübertragung ===
[[Datei:Tcp transfer.png|mini|450px| Beispiel eines Datentransfers]]
[[Datei:Tcp transfer.png|mini|450px| Beispiel eines Datentransfers]]
#Der Sender schickt sein erstes TCP-Segment mit einer Sequenznummer SEQ=1 und einer Nutzdatenlänge von 1460Bytes an den Empfänger.
#Der Sender schickt sein erstes TCP-Segment mit einer Sequenznummer SEQ=1 und einer Nutzdatenlänge von 1460Bytes an den Empfänger.
#Der Empfänger bestätigt es mit einem TCP-Header, ohne Daten, mit ACK=1461 und fordert das zweite TCP-Segment ab dem Byte Nummer 1461 an.  
#Der Empfänger bestätigt es mit einem TCP-Header, ohne Daten, mit ACK=1461 und fordert das zweite TCP-Segment ab dem Byte Nummer 1461 an.  
#Sender schickt es dann mit einem TCP-Segment und SEQ=1461 an den Empfänger.  
#Sender schickt es dann mit einem TCP-Segment und SEQ=1461 an den Empfänger.  
#Empfäner bestätigt es wieder mit einem ACK=2921.
#Empfäner bestätigt es wieder mit einem ACK=2921.
 
*Der Empfänger braucht nicht jedes TCP-Segment zu bestätigen, wenn diese zusammenhängend sind.  
* Der Empfänger braucht nicht jedes TCP-Segment zu bestätigen, wenn diese zusammenhängend sind.  
*Empfängt er die TCP-Segmente 1–5, so braucht er nur das letzte TCP-Segment zu bestätigen.  
* Empfängt er die TCP-Segmente 1–5, so braucht er nur das letzte TCP-Segment zu bestätigen.  
*Fehlt zum Beispiel das 3. Segment, kann er nur die 1 und die 2 bestätigen, 4 und 5 jedoch noch nicht.  
* Fehlt zum Beispiel das 3. Segment, kann er nur die 1 und die 2 bestätigen, 4 und 5 jedoch noch nicht.  
**Da der Sender keine Bestätigung für die 3 bekommt, läuft sein Timer ab, und er verschickt die 3 noch einmal.  
** Da der Sender keine Bestätigung für die 3 bekommt, läuft sein Timer ab, und er verschickt die 3 noch einmal.  
**Kommt die 3 beim Empfänger an, so bestätigt er alle fünf TCP-Segmente, wenn beide die TCP-Option Selective ACK (SACK) unterstützen.  
** Kommt die 3 beim Empfänger an, so bestätigt er alle fünf TCP-Segmente, wenn beide die TCP-Option Selective ACK (SACK) unterstützen.  
*Der Sender startet für jedes TCP-Segment, welches er auf die Reise schickt, einen Retransmission Timer.
* Der Sender startet für jedes TCP-Segment, welches er auf die Reise schickt, einen Retransmission Timer.
 
=== Retransmission Timer ===
=== Retransmission Timer ===
*Zur Feststellung, wann ein Paket im Netzwerk verloren gegangen ist, wird vom Sender ein Timeout verwendet, bis zu dem das ACK der Gegenseite eingetroffen sein muss.  
* Zur Feststellung, wann ein Paket im Netzwerk verloren gegangen ist, wird vom Sender ein Timeout verwendet, bis zu dem das ACK der Gegenseite eingetroffen sein muss.  
**Timeout zu niedrig, Pakete werden doppelt geschickt.
** Timeout zu niedrig, Pakete werden doppelt geschickt.
**Timeout zu hoch, velorene Pakete werden zu spät neu geschickt.
** Timeout zu hoch, velorene Pakete werden zu spät neu geschickt.
 
*Aufgrund unterschiedlicher Laufzeiten der IP-Pakete ist nur ein dynamischer Timer sinnvoll.
* Aufgrund unterschiedlicher Laufzeiten der IP-Pakete ist nur ein dynamischer Timer sinnvoll.
 
=== Zusammenhang von Flusssteuerung und Staukontrolle ===
=== Zusammenhang von Flusssteuerung und Staukontrolle ===
In den folgenden zwei Abschnitten werden die TCP-Konzepte zur Flusssteuerung und Staukontrolle (oder Überlaststeuerung) erläutert.  
In den folgenden zwei Abschnitten werden die TCP-Konzepte zur Flusssteuerung und Staukontrolle (oder Überlaststeuerung) erläutert.  
*Dabei werden das '' Sliding Window '' und das '' Congestion Window '' eingeführt.
* Dabei werden das '' Sliding Window '' und das '' Congestion Window '' eingeführt.
*Der Sender wählt als tatsächliche Sendefenstergröße das Minimum aus beiden Fenstern.  
* Der Sender wählt als tatsächliche Sendefenstergröße das Minimum aus beiden Fenstern.  
*Es werden ARQ-Protokolle (Automatic Repeat reQuest) für eine zuverlässige Datenübertragung eingesetzt.
* Es werden ARQ-Protokolle (Automatic Repeat reQuest) für eine zuverlässige Datenübertragung eingesetzt.
 
=== Flusssteuerung ===
=== Flusssteuerung ===
[[Datei:Sliding window.svg|mini| Sliding Window]]
[[Datei:Sliding window.svg|mini| Sliding Window]]
 
Da Daten aus dem Puffer gelesen werden, ändert sich der Füllstand des Puffers ständig.
Da Daten aus dem Puffer gelesen werden, ändert sich der Füllstand des Puffers ständig.
* Deshalb ist es notwendig, den Datenfluss dem Füllstand entsprechend zu steuern.  
* Deshalb ist es notwendig, den Datenfluss dem Füllstand entsprechend zu steuern.  
** Dies geschieht mit dem '' Sliding Window '' und dessen Größe.
** Dies geschieht mit dem '' Sliding Window '' und dessen Größe.
* Der Puffer des Senders wird auf auf 10 Segmente erweitert.  
* Der Puffer des Senders wird auf auf 10 Segmente erweitert.  
 
 
;Im Sliding Window (a) werden gerade die Segmente 1–5 übertragen.  
;Im Sliding Window (a) werden gerade die Segmente 1–5 übertragen.  
# Obwohl der Puffer voll ist, werden die nächsten Daten (ab Byte 7301) mit ACK=7301 angefordert.
# Obwohl der Puffer voll ist, werden die nächsten Daten (ab Byte 7301) mit ACK=7301 angefordert.
#* Das nächste Segment kann nicht mehr verarbeitet werden.
#* Das nächste Segment kann nicht mehr verarbeitet werden.
#* Mit dem Window-Feld (=0) teilt er dem Sender mit, dass keine Daten mehr verschickt werden sollen.
#* Mit dem Window-Feld (=0) teilt er dem Sender mit, dass keine Daten mehr verschickt werden sollen.
# Die Anwendung liest die Segmente 1–5 aus dem Puffer, es werden 7300Byte frei.  
# Die Anwendung liest die Segmente 1–5 aus dem Puffer, es werden 7300Byte frei.  
# Er kann die restlichen Segmente 6–10 mit einem TCP-Header (SEQ=1, ACK=7301, Window=7300), beim Sender anfordern.  
# Er kann die restlichen Segmente 6–10 mit einem TCP-Header (SEQ=1, ACK=7301, Window=7300), beim Sender anfordern.  
# Der Sender weiß nun, dass er maximal fünf Segmente schicken kann, und verschiebt das Window um fünf Segmente nach rechts (Sliding Window (b)).  
# Der Sender weiß nun, dass er maximal fünf Segmente schicken kann, und verschiebt das Window um fünf Segmente nach rechts (Sliding Window (b)).  
# Die Segmente 6–10 werden nun alle zusammen als ''Burst'' verschickt.  
# Die Segmente 6–10 werden nun alle zusammen als ''Burst'' verschickt.  
# Beim Ankommen aller TCP-Segmente beim Empfänger, quittiert er sie (SEQ=1 und ACK=14601) und fordert die nächsten Daten an.
# Beim Ankommen aller TCP-Segmente beim Empfänger, quittiert er sie (SEQ=1 und ACK=14601) und fordert die nächsten Daten an.
 
=== Überlaststeuerung/Staukontrolle (Congestion Control) ===
=== Überlaststeuerung/Staukontrolle (Congestion Control) ===
 
*Wird eine Verbindung stark belastet, werden immer mehr Pakete verworfen.
* Wird eine Verbindung stark belastet, werden immer mehr Pakete verworfen.
*Durch die Wiederholung steigt wiederum die Belastung, dies sorgt (ohne Maßnahmen) für einen Datenstau.
* Durch die Wiederholung steigt wiederum die Belastung, dies sorgt (ohne Maßnahmen) für einen Datenstau.
*Die Verlustrate wird von einem IP-Netzwerk ständig beobachtet.
* Die Verlustrate wird von einem IP-Netzwerk ständig beobachtet.
*Normalerweise wird eine TCP/IP-Verbindung langsam gestartet (Slow-Start) und die Senderate schrittweise erhöht, bis zum Datenverlust.  
* Normalerweise wird eine TCP/IP-Verbindung langsam gestartet (Slow-Start) und die Senderate schrittweise erhöht, bis zum Datenverlust.  
*Ein Datenverlust verringert die Senderate, ohne Verlust wird sie wiederum erhöht.  
* Ein Datenverlust verringert die Senderate, ohne Verlust wird sie wiederum erhöht.  
 
==== Algorithmus zur Überlaststeuerung ====
==== Algorithmus zur Überlaststeuerung ====
Gehen bei einer bestimmten Fenstergröße Pakete verloren, kann das festgestellt werden, wenn der Sender innerhalb einer bestimmten Zeit (Timeout) kein ACK erhält.  
Gehen bei einer bestimmten Fenstergröße Pakete verloren, kann das festgestellt werden, wenn der Sender innerhalb einer bestimmten Zeit (Timeout) kein ACK erhält.  
*Man muss davon ausgehen, dass das Paket aufgrund zu hoher Netzlast von einem Router im Netz verworfen wurde (Stau im Netz).
* Man muss davon ausgehen, dass das Paket aufgrund zu hoher Netzlast von einem Router im Netz verworfen wurde (Stau im Netz).
*Um den Stau aufzulösen, müssen alle beteiligten Sender ihre Netzlast reduzieren.  
* Um den Stau aufzulösen, müssen alle beteiligten Sender ihre Netzlast reduzieren.  
 
Dazu werden im RFC 2581 vier Algorithmen definiert:  
Dazu werden im RFC 2581 vier Algorithmen definiert:  
#''slow start''
#''slow start''
#''congestion avoidance''
#''congestion avoidance''
#''fast retransmit''
#''fast retransmit''
#''fast recovery'',
#''fast recovery'',
*''slow start'' und ''congestion avoidance'' werden zusammen verwendet.  
* ''slow start'' und ''congestion avoidance'' werden zusammen verwendet.  
*''fast retransmit'' und ''fast recovery'' werden zusammen verwendet, sind eine Erweiterung von ''slow start'' und ''congestion avoidance''.
* ''fast retransmit'' und ''fast recovery'' werden zusammen verwendet, sind eine Erweiterung von ''slow start'' und ''congestion avoidance''.
 
==== Slow Start Slow Start und Congestion Avoidance ====
==== Slow Start Slow Start und Congestion Avoidance ====
[[Datei:TCPSlowStartundCongestionAvoidance.svg|mini|450px|Grafische Darstellung des Slow-Start-Algorithmus]]
[[Datei:TCPSlowStartundCongestionAvoidance.svg|mini|450px|Grafische Darstellung des Slow-Start-Algorithmus]]
 
*Der Slow-Start-Algorithmus dient zur Bestimmung des ''congestion window''.  
* Der Slow-Start-Algorithmus dient zur Bestimmung des ''congestion window''.  
*Da die momentane Auslastung des Netzes nicht bekannt ist, wird mit kleinen Datenmengen begonnen.  
* Da die momentane Auslastung des Netzes nicht bekannt ist, wird mit kleinen Datenmengen begonnen.  
 
#Der Algorithmus startet mit einem kleinen Fenster, von einer Maximum Segment Size (MSS), in dem Datenpakete vom Sender zum Empfänger übertragen werden.
#Der Algorithmus startet mit einem kleinen Fenster, von einer Maximum Segment Size (MSS), in dem Datenpakete vom Sender zum Empfänger übertragen werden.
#Der Empfänger sendet ACK an den Sender zurück.  
#Der Empfänger sendet ACK an den Sender zurück.  
#Für jedes empfangene ACK wird die Größe des ''congestion window'' um eine MSS erhöht.  
#Für jedes empfangene ACK wird die Größe des ''congestion window'' um eine MSS erhöht.  
#*Dies führt innerhalb einer Roundtrip-Zeit zu einer Verdopplung des Congestion Windows.  
#*Dies führt innerhalb einer Roundtrip-Zeit zu einer Verdopplung des Congestion Windows.  
#Dieses exponentielle Wachstum wird so lange fortgesetzt, bis der ''Slow-Start Threshold'' erreicht wird.
#Dieses exponentielle Wachstum wird so lange fortgesetzt, bis der ''Slow-Start Threshold'' erreicht wird.
#*Die Phase des exponentiellen Wachstums wird auch ''Slow Start Phase'' genannt.  
#*Die Phase des exponentiellen Wachstums wird auch ''Slow Start Phase'' genannt.  
#Danach wird das Congestion Window nur noch um eine MSS erhöht, wenn alle Pakete aus dem Fenster erfolgreich übertragen wurden.  
#Danach wird das Congestion Window nur noch um eine MSS erhöht, wenn alle Pakete aus dem Fenster erfolgreich übertragen wurden.  
#*Es wächst pro Roundtrip-Zeit nur noch um eine MSS, also nur noch linear.  
#*Es wächst pro Roundtrip-Zeit nur noch um eine MSS, also nur noch linear.  
#**Diese Phase wird als ''Congestion Avoidance Phase'' bezeichnet.  
#**Diese Phase wird als ''Congestion Avoidance Phase'' bezeichnet.  
#*Das Wachstum wird beendet, wenn das vom Empfänger festgelegte Empfangsfenster erreicht worden ist.
#*Das Wachstum wird beendet, wenn das vom Empfänger festgelegte Empfangsfenster erreicht worden ist.
 
 
Kommt es zu einem Timeout, wird das ''congestion window'' auf 1 zurückgesetzt, der ''slow-start threshold'' wird auf die Hälfte der gesendeten, unquittierten Pakete herabgesetzt (Flight Size).  
Kommt es zu einem Timeout, wird das ''congestion window'' auf 1 zurückgesetzt, der ''slow-start threshold'' wird auf die Hälfte der gesendeten, unquittierten Pakete herabgesetzt (Flight Size).  
*Die Phase des exponentiellen Wachstums wird also verkürzt.
* Die Phase des exponentiellen Wachstums wird also verkürzt.
*Das Fenster wächst bei häufigen Paketverlusten nur langsam.
* Das Fenster wächst bei häufigen Paketverlusten nur langsam.
 
==== Fast-Retransmit und Fast-Recovery ====
==== Fast-Retransmit und Fast-Recovery ====
*Werden eingesetzt, um nach Paketverlust schneller auf die Stau-Situation zu reagieren.  
* Werden eingesetzt, um nach Paketverlust schneller auf die Stau-Situation zu reagieren.  
*Empfänger informiert den Sender, wenn Pakete außer der Reihe ankommen und somit dazwischen ein Paketverlust vorliegt.  
* Empfänger informiert den Sender, wenn Pakete außer der Reihe ankommen und somit dazwischen ein Paketverlust vorliegt.  
*Der Empfänger bestätigt das letzte korrekte Paket erneut für jedes weitere ankommende Paket außer der Reihe.  
* Der Empfänger bestätigt das letzte korrekte Paket erneut für jedes weitere ankommende Paket außer der Reihe.  
*Man spricht dabei von ''Dup-Acks'' (''duplicate acknowledgments''),  
* Man spricht dabei von ''Dup-Acks'' (''duplicate acknowledgments''),  
**Mehrere aufeinanderfolgende Nachrichten, welche dasselbe Datensegment ACKen.
** Mehrere aufeinanderfolgende Nachrichten, welche dasselbe Datensegment ACKen.
*Der Sender bemerkt die duplizierten ACKS, und nach dem dritten Duplikat sendet er sofort, vor Ablauf des Timers, das verlorene Paket erneut.  
* Der Sender bemerkt die duplizierten ACKS, und nach dem dritten Duplikat sendet er sofort, vor Ablauf des Timers, das verlorene Paket erneut.  
**Da nicht auf den Timerablauf gewartet werden muss, heißt das Prinzip ''Fast Retransmit''.  
** Da nicht auf den Timerablauf gewartet werden muss, heißt das Prinzip ''Fast Retransmit''.  
*Dup-Acks: auch Hinweise darauf, dass ein Paketverlust stattfand, dennoch die folgenden Pakete angekommen sind.  
* Dup-Acks: auch Hinweise darauf, dass ein Paketverlust stattfand, dennoch die folgenden Pakete angekommen sind.  
*Das Sendefenster wird nach dem Fehler nur halbiert (kein Slow-Start).   
* Das Sendefenster wird nach dem Fehler nur halbiert (kein Slow-Start).   
 
 
Zusätzlich kann das Sendefenster noch um die Anzahl der Dup-Acks erhöht werden,
Zusätzlich kann das Sendefenster noch um die Anzahl der Dup-Acks erhöht werden,
*Jedes Dup-Ack steht für ein weiteres Paket, welches den Empfänger erreicht hat.
* Jedes Dup-Ack steht für ein weiteres Paket, welches den Empfänger erreicht hat.
*Dadurch kann nach dem Fehler schneller wieder die volle Sendeleistung erreicht werden.
* Dadurch kann nach dem Fehler schneller wieder die volle Sendeleistung erreicht werden.
*Das Prinzip nennt man ''Fast-Recovery''.
* Das Prinzip nennt man ''Fast-Recovery''.
 
[[Datei:Tcp verbindung.png|none|750px|Verwaltung der TCP-Verbindungen als endlicher Automat]]
[[Datei:Tcp verbindung.png|none|750px|Verwaltung der TCP-Verbindungen als endlicher Automat]]
 
= Dokumentation =
= Dokumentation =
== Man-Pages ==
== Man-Pages ==
== Info-Pages ==
== Info-Pages ==
= Links =
= Links =
== Intern ==
== Intern ==
== Weblinks ==
== Weblinks ==
 
= Testfragen =
= Testfragen =
<div class="toccolours mw-collapsible mw-collapsed">
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 1''
''Testfrage 1''
<div class="mw-collapsible-content">'''Antwort1'''</div>
<div class="mw-collapsible-content">'''Antwort1'''</div>
</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 2''
''Testfrage 2''
<div class="mw-collapsible-content">'''Antwort2'''</div>
<div class="mw-collapsible-content">'''Antwort2'''</div>
</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 3''
''Testfrage 3''
<div class="mw-collapsible-content">'''Antwort3'''</div>
<div class="mw-collapsible-content">'''Antwort3'''</div>
</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 4''
''Testfrage 4''
<div class="mw-collapsible-content">'''Antwort4'''</div>
<div class="mw-collapsible-content">'''Antwort4'''</div>
</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 5''
''Testfrage 5''
<div class="mw-collapsible-content">'''Antwort5'''</div>
<div class="mw-collapsible-content">'''Antwort5'''</div>
</div>
</div>
 
[[Kategorie:Netzwerke]]
[[Kategorie:Netzwerke]]

Version vom 28. März 2022, 12:49 Uhr

TCP (Transmission Control Protocol) ist ein Netzwerkprotokoll, das definiert, auf welche Art und Weise Daten zwischen Netzwerkkomponenten ausgetauscht werden sollen.

TCP (Transmission Control Protocol)
Familie: Internetprotokollfamilie
Einsatzgebiet: Zuverlässiger bidirektionaler
Datentransport
Netzwerk-IP-Transportprotokoll: Hypertext Transfer Protocol (HTTP), Simple Mail Transfer Protocol (SMTP)
Standards: RFC 793 (1981)
RFC 7323 (2014)
= Beschreibung =
== Geschichte ==
  • Entwickelt von Robert E. Kahn und Vinton G. Cerf als Forschungsarbeit.
  • Beginn 1973, erste Standardisierung 1981 als RFC 793.
  • Danach gab es viele Erweiterungen, diese werden bis heute in RFCs spezifiziert.
== Was ist TCP ==
  • Ist ein zuverlässiges, verbindungsorientiertes, paketvermitteltes (nicht paketvermittelnd) Transportprotokoll.
  • TCP ermöglicht die Übertragung eines Datenstroms.
  • Im Unterschied zum verbindungslosen User Datagram Protokoll (UDP) stellt TCP eine Verbindung zwischen zwei Endpunkten (Sockets) einer Netzverbindung her.
    • Auf dieser Verbindung können in beide Richtungen Daten übertragen werden.
== Vorteile ==
  • Netzwerküberlastungskontrolle.
  • Zuverlässige Datenübertragung:
    • erkennt verlorene Segmente, doppelte Segmente und fehlerhafte Segmente.
== Allgemeines ==
TCP ist im Prinzip eine Ende-zu-Ende-Verbindung in Vollduplex.
  • Kann auch als zwei Halbduplexverbindungen betrachtet werden (Informationsfluss in beide Richtungen (allerdings nicht gleichzeitig)).
  • Die Daten in Gegenrichtung können zusätzliche Steuerungsinformationen enthalten.
  • Anwendungen, die TCP häufig nutzen, sind zum Beispiel Webbrowser und Webserver.
=== TCP-Software ===
  • Übernimmt Verbindungsverwaltung sowie die Datenübertragung.
  • Netz-Protokollstack des Betriebssystems.
  • Anwendungsprogramme nutzen Sockets.
=== Software-Schnitstelle ===
  • bei Windows in extra einzubindenden Programmbibliotheken („Winsock.dll“ bzw. „wsock32.dll“).
  • Linux und andere unixoide Betriebssysteme enthalten einen Socketlayer im Betriebssystemkern (Zugriff über Systemaufrufe).
== TCP-Verbindung == 
  • Jede TCP-Verbindung wird eindeutig durch zwei Endpunkte identifiziert.
    • Ein Endpunkt stellt ein geordnetes Paar dar (IP-Adresse und Port).
    • Ein solches Paar bildet eine bidirektionale Software-Schnittstelle (Socket).
TCP-Verbindungen werden durch vier Werte (einem Quadrupel) eindeutig identifiziert:

 (Quell-IP-Adresse, Quell-Port, Ziel-IP-Adresse, Ziel-Port)

=== Beispiel ===
#Ein Serverprozess erzeugt einen Socket auf Port 80 (bind).
#*Markiert diesen für eingehende Verbindungen (listen).
#*Fordert vom Betriebssystem die nächste anstehende Verbindung an (accept). 
#*Diese Anforderung blockiert den Serverprozess zunächst, da noch keine Verbindung existiert. 
#Die erste Verbindungsanfrage kommt und wird vom Betriebssystem angenommen, die Verbindung kommt zustande.
#Jetzt wird diese Verbindung durch das Quadrupel identifiziert.
##Der Serverprozess wird aufgeweckt und ihm ein Handle für diese Verbindung überreicht. 
##Üblich startet der Serverprozess einen Kindprozess, dem er die Behandlung der Verbindung delegiert. 
##Der Serverprozess fährt mit einer weiterer Accept-Anforderung an das Betriebssystem fort.
  • Dadurch ist es möglich, dass ein Webserver mehrere Verbindungen von verschiedenen Rechnern annehmen kann.
=== Ports ===
  • Portnummern sind Dualsystem 16-Bit-Zahlen und reichen von 0 bis 65535.
  • Ports von 0 bis 1023 sind reserviert
    • Vergeben von Internet Assigned Numbers Authority (IANA)
    • z.B. ist Port 80 für Hypertext Transfer Protocol (HTTP) reserviert.
  • Das Benutzen der vordefinierten Ports ist nicht bindend.
    • Jeder Administrator kann bspw. einen FTP-Server (normalerweise Port 21) auch auf einem beliebigen Port laufen lassen.
  • Mehrfaches listen auf demselben Port ist nicht möglich.


= Header =
=== Allgemeines ===
  • Das TCP-Segment besteht immer aus zwei Teilen: dem Header und der Nutzlast.
  • Die Nutzlast enthält die zu übertragenden Daten.
    • Die wiederum Protokollinformationen der Anwendungsschicht, wie HTTP oder FTP, entsprechen können.
  • Der Header enthält für die Steuerung der Kommunikation erforderliche Daten.
  • Da das Options-Feld in der Regel nicht genutzt wird, hat ein typischer Header eine Größe von 20 Byte.
=== Felder des TCP-Header ===
Aufbau des TCP-Headers
Feld Funktion Größe
Source Port (Quellport)
  • Gibt die Portnummer auf der Senderseite an
2 Byte
Destinations Port (Zielport)
  • Gibt die Portnummer auf der Empfängerseite an.
2 Byte
Sequence Number
  • Sequenznummer des ersten Daten-Oktett dieses TCP-Segments, dient zur Sortierung Oder die Initialisierungs-Sequenznummer falls das SYN-Flag gesetzt ist
4 Byte
Acknowledgement Number
  • Gibt die Sequenznummer an, die der Absender dieses TCP-Segments als Nächstes erwartet Sie ist nur gültig, falls das ACK-Flag gesetzt ist.
4 Byte
Data Offset
  • Gibt die Länge des TCP-Headers in 32-Bit-Blöcken an (ohne Nutzdaten).
  • Hiermit wird die Startadresse der Nutzdaten angezeigt.
4 Bit
Reserved
  • Ist für zukünftige Verwendungen reserviert.
  • Alle Bits müssen null sein.
4 Bit
Control-Flags
  • Zweiwertige Variablen mit den Zuständen gesetzt und nicht gesetzt.
  • Kennzeichnung für die wichtigen Zustände der Kommunikation und Weiterverarbeitung der Daten.
8 Bit
(Receive) Window
  • Ist die Anzahl der Bytes die der Sender dieses TCP-Segments bereit ist zu empfangen.
  • Beginnend bei dem durch das Acknowledgementfeld indizierten Daten-Oktett.
2 Byte
Checksum
  • Dient zur Erkennung von Übertragungsfehlern.
  • Wird über den TCP-Header, die Daten und einen Pseudo-Header berechnet.
  • Der Header besteht aus Ziel-IP, Quell-IP, TCP-Protokollkennung (0x0006) und der Länge des TCP-Headers inkl. Nutzdaten (in Bytes).
2 Byte
Urgent Pointer
  • Nur gültig, wenn das URG-Flag gesetzt ist.
  • Die Urgent-Daten beginnen sofort nach dem Header
  • Zusammen mit der Sequenz-Nummer gibt dieser Wert die Position des ersten Bytes nach den Urgent-Daten an.
2 Byte
Options
  • Unterschiedlich groß und enthält Zusatzinformationen.
  • Müssen ein Vielfaches von 32 Bit lang sein, ansonsten muss mit Nullbits aufefüllt werden (Padding).
  • Ermöglicht Verbindungsdaten auszuhandeln, die nicht im TCP-Header enthalten sind, wie z.B. die Maximalgröße des Nutzdatenfeldes.
0–40 Byte
=== TCP-Flags ===
Feld Funktion Größe
ECE-Flag (ECN-Echo)
  • Teilt dem Sender mit, dass das Netzwerk überlastet ist und die Senderate reduziert werden muss.
  • Wird für Explicit Congestion Notification (ECN) benötigt
1 Bit
CRW-Flag (Congestion Window Reduced)
  • Teilt dem Empfänger mit das die Senderate reduziert wurde.
  • Wird für Explicit Congestion Notification (ECN) benötigt
1 Bit
URG-Flag (Urgent)
  • Die Daten nach dem Header werden sofort von der Anwendung bearbeitet.
  • Anwendung unterbricht die Datenverarbeitung des aktuellen TCP-Segments und liest alle Bytes nach dem Header bis zu dem Byte, auf das das Urgent-Pointer -Feld zeigt, aus.
  • Kann verwendet werden, um eine Anwendung auf dem Empfänger abzubrechen.
  • In der Regel wird dieses Flag nicht ausgewertet.
1 Bit
ACK-Flag (Acknowledgment)
  • Hat in Verbindung mit der Acknowledgment-Nummer die Aufgabe, den Empfang von TCP-Segmenten bestätigen.
  • Die Acknowledgment-Nummer ist nur gültig, wenn das Flag gesetzt ist.
1 Bit
PSH-Flag (Push)
  • Sowohl der ausgehende, als auch der eingehende Puffer wird übergangen.
  • Hilft den Datenstrom von TCP effizienter zu verarbeiten, indem die empfangende Applikation gezielter aufgeweckt werden kann.
  • RFC 1122 & RFC 793
1 Bit
RST-Flag (Reset)
  • Wird verwendet, wenn eine Verbindung abgebrochen werden soll.
  • z.B. bei technischen Problemen oder zur Abweisung unerwünschter Verbindungen
  • Oder bei nicht geöffneten Ports, es wird kein ICMP-Paket mit „Port Unreachable“ verschickt.
1 Bit
SYN-Flag (Synchronize)
  • Pakete mit diesem Flag initiieren eine Verbindung.
  • Dient der Synchronisation von Sequenznummern beim Verbindungsaufbau.
  • Server antwortet normalerweise mit SYN+ACK oder RST.
1 Bit
FIN-Flag (Finish)
  • Schlussflag, dient zur Freigabe der Verbindung, zeigt an, dass keine Daten vom Sender kommen.
  • FIN- und SYN-Flags haben Sequenznummern, damit diese in der richtigen Reihenfolge abgearbeitet werden.
1 Bit
= Installation =

= Syntax =
== Parameter ==
== Optionen ==
= Konfiguration =
== Dateien ==

= Anwendungen =
== Verbindungsaufbau und -abbau ==
=== Allgemein ===
Ein Server, der seinen Dienst anbietet, erzeugt einen Endpunkt (Socket) mit der Portnummer und seiner IP-Adresse. 
  • Bezeichnet als "passive open" oder "listen".
Ein Client, der eine Verbindung aufbauen will, erzeugt einen Endpunkt (Socket) mit seiner IP-Adresse und einer eigenen, noch freien Portnummer. 
  • Mit der Adresse des Servers und dem Port kann dann eine Verbindung aufgebaut werden.
Während der Datenübertragungsphase sind die Rollen von Client und Server (aus TCP-Sicht) vollkommen symmetrisch.
  • Bezeichnet als "active open"
Jeder der beiden beteiligten Rechner einen Verbindungsabbau einleiten.

=== Verbindungsaufbau ===
TCP-Handshake
#Der Client sendet dem Server ein SYN-Paket mit einer Sequenznummer x. 
#*Die Sequenznummern sind für die Sicherstellung einer vollständigen Übertragung in der richtigen Reihenfolge und ohne Duplikate wichtig. 
#*Ein Paket, dessen SYN-Bit im Header gesetzt ist. 
#*Die Start-Sequenznummer ist eine beliebige zufällige Zahl, abhängig von der TCP-Implementierung.   
#Der Server empfängt das Paket und antwortet.
#*Port geschlossen, antwortet er mit einem TCP-RST, ein Signal, dass keine Verbindung aufgebaut werden kann. 
#*Port geöffnet, bestätigt er den Erhalt des ersten SYN-Pakets und stimmt dem Verbindungsaufbau zu, indem er ein SYN/ACK-Paket zurückschickt. 
#**Ein Paket, mit ACK-Flag im TCP-Header, welche die Sequenznummer x+1 des SYN-Pakets im Header enthält.
#**Der Server sendet im Gegenzug seine Start-Sequenznummer y, diese ist unabhängig von der Start-Sequenznummer des Clients.  
#Der Client bestätigt den Erhalt des SYN/ACK-Pakets durch ein eigenes ACK-Pakets mit der Sequenznummer x+1. 
#*Wird auch als „Forward Acknowledgement“ bezeichnet.
#*Aus Sicherheitsgründen sendet der Client die Sequenznummer des Servers + 1 im ACK-Segment zurück.  
#Die Verbindung ist damit aufgebaut.

==== Verbindungsaufbau Beispiel ====

1. SYN-SENT <SEQ=100><CTL=SYN> SYN-RECEIVED
2. SYN/ACK-RECEIVED <SEQ=300><ACK=101><CTL=SYN,ACK> SYN/ACK-SENT
3. ACK-SENT <SEQ=101><ACK=301><CTL=ACK> ESTABLISHED
  • Nach Aufbau ist die Verbindung für beide Kommunikationspartner gleichberechtigt
  • Man kann einer bestehenden Verbindung auf TCP-Ebene nicht ansehen, wer der Server und wer der Client ist.
  • Eine Unterscheidung dieser beiden Rollen in der weiteren Betrachtung keine Bedeutung mehr.
=== Verbindungsabbau ===
TCP-Teardown
  • Der Verbindungsabbau kann beidseitig oder schrittweise einseitig erfolgen.
  • Der geregelte Verbindungsabbau erfolgt dem Verbindungsaufbau ähnlich.
  • #Statt dem SYN-Bits kommt das FIN-Bit zum Einsatz, welches anzeigt, dass keine Daten mehr vom Sender kommen werden.
  • #Der Erhalt des Pakets wird mit ACK bestätigt und der Empfänger des FIN-Pakets sendet zuletzt seinerseits ein FIN-Paket.
  • #Dieses FIN-Paket wird ihm zuletzt bestätigt.
  • Ein verkürztes ist Verfahren möglich, bei dem FIN und ACK genau wie beim Verbindungsaufbau im selben Paket untergebracht werden.
=== Halb geschlossene Verbindungen ===
  • Der Verbindungsabbau erfolgt schrittweise einseitig.
  • Erlaubt der Gegenseite nach der einseitigen Trennung noch Daten zu übertragen.
=== Halb offene Verbindungen ===
  • wenn eine Seite abstürzt, ohne dass die verbleibende Seite dies erfährt.
  • Effekt: Betriebssystemressourcen werden nicht freigegeben.
  • Ursprung: TCP-Verbindungen von der Protokollseite bestehen, bis sie abgebaut werden.
==== Maximum segment lifetime (MSL)====
  • 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 (wait state), in dem alle verspäteten Segmente verworfen werden.
    • Dadurch wird sichergestellt, dass keine verspäteten Segmente als Teil einer neuen Verbindung fehlinterpretiert werden können.
    • Außerdem wird eine korrekte Verbindungsterminierung sichergestellt.
  • Geht ACK y+1 verloren, läuft beim Server der Timer ab, und das LAST_ACK-Segment wird erneut übertragen.
=== Puffer ===
  • Beim Datenversand über TCP werden zwei Puffer verwendet.
#Senderseitig übermittelt die Applikation die Sendedaten an TCP und dieses puffert die Daten.
#Effizient werden mehrere kleine Übertragungen in Form einer einzigen großen gesendet.
#Empfängerseitig landen die empfangenen Daten im Puffer, dieser verfolgt ähnliche Ziele. 
  • Wenn von TCP mehrere einzelne Pakete empfangen wurden, ist es besser, diese zusammengefügt an die Applikation weiterzugeben.
=== Drei-Wege-Handschlag ===
  • Typisch werden Antworten auf das erste SYN- bzw. FIN-Paket zu einem einzelnen Paket zusammengefasst (SYN/ACK bzw. FIN/ACK).
    • Theoretisch wäre auch das Versenden zweier separater Pakete denkbar.
  • In diesem Fall müssen nur noch drei Pakete versendet werden, man spricht vom Drei-Wege-Handschlag.
  • Das Zusammenfassen des FIN-Pakets und ACK-Pakets ist problematisch.
    • Das Fin-Paket signalisiert „keine weiteren Daten“.
  • Allerdings kann der Sender des FIN-Pakets weiterhin Daten empfangen wollen (halb geschlossenen Verbindung).
; Überlegung
#Den Beginn einer HTTP-Anfrage im SYN-Paket mitschicken, weitere Daten nach Verbindungsaufbau.
#Im letzten HTTP-Request-Paket die Verbindung mittels FIN schließen. 
  • In der Praxis nicht angewendet da:
    • Wenn der Browser die Verbindung auf diese Art schließt, würde möglicherweise der Server die Verbindung schließen, anstatt die Anfrage vollständig zu beantworten.


== Datenübertragung ==
Segmentierung der Nutzdaten
=== TCP-/IP-Segment-Größe ===
  • Typischerweise eine Größe von maximal 1500Bytes .
  • Muss in die darunter liegende Übertragungsschicht passen, das Internetprotokoll (IP).
  • IP-Pakete sind zwar bis 65.535Bytes (64KiB) spezifiziert, werden aber meist über Ethernet übertragen.
    • Bei Ethernet ist die Größe der (Layer-3-)Nutzdaten auf 64 bis 1500Bytes festgelegt (bei Jumbo Frames höher).
  • TCP- und IP-Protokoll definieren jeweils einen Header von 20Bytes Größe.
  • Für die (Applikations-)Nutzdaten bleiben in einem TCP/IP-Paket also 1460Bytes übrig.
  • Da die meisten Internet-Anschlüsse DSL verwenden, kommt zusätzlich das Point-to-Point Protocol (PPP) zwischen IP und Ethernet zur Anwendung (8Bytes).
Die Nutzdaten reduzieren sich also auf insgesamt 1500− 20− 20− 8 =1452Bytes  Maximum Segment Size (MSS). 
  • Dies entspricht einer maximalen Nutzdatenrate von 96,8 %.
=== Aufteilen der Anwendungsdaten auf TCP-/IP-Segmente ===
# Empfänger und Sender einigen sich vor dem Datenaustausch über das Options-Feld auf die Größe der Maximum Segment Size (MSS).
# Als Beispiel legt ein Webserver einen 7Kilobyte großen Datenblock im Puffer ab.
#* Um mit einem 1460Byte großen Nutzdatenfeld 7Kilobyte Daten zu versenden:
#*# Teilt die TCP-Software die Daten auf mehrere Pakete auf
#*# Fügt einen TCP-Header hinzu und versendet die TCP-Segmente.
#* Dieser Vorgang wird Segmentierung genannt. 
# Der Datenblock im Puffer wird in fünf Segmente aufgeteilt, diese werden nacheinander abgeschickt.
## Jedes Segment erhält durch die TCP-Software einen TCP-Header.
# Segmente kommen nicht zwingend in richtiger Reihenfolge an.
# Um die Segmente wieder zu sortieren, ist jedes Segment nummeriert. 
#* Bei der Zuordnung der Segmente im Empfänger wird die Sequenznummer herangezogen.
#Die TCP-Software des Empfängers bestätigt die einwandfrei angekommenen TCP-Segmente. 
#*Andernfalls werden die Pakete neu angefordert.

=== Beispiel einer TCP-/IP-Datenübertragung ===
Beispiel eines Datentransfers
#Der Sender schickt sein erstes TCP-Segment mit einer Sequenznummer SEQ=1 und einer Nutzdatenlänge von 1460Bytes an den Empfänger.
#Der Empfänger bestätigt es mit einem TCP-Header, ohne Daten, mit ACK=1461 und fordert das zweite TCP-Segment ab dem Byte Nummer 1461 an. 
#Sender schickt es dann mit einem TCP-Segment und SEQ=1461 an den Empfänger. 
#Empfäner bestätigt es wieder mit einem ACK=2921.

  • Der Empfänger braucht nicht jedes TCP-Segment zu bestätigen, wenn diese zusammenhängend sind.
  • Empfängt er die TCP-Segmente 1–5, so braucht er nur das letzte TCP-Segment zu bestätigen.
  • Fehlt zum Beispiel das 3. Segment, kann er nur die 1 und die 2 bestätigen, 4 und 5 jedoch noch nicht.
    • Da der Sender keine Bestätigung für die 3 bekommt, läuft sein Timer ab, und er verschickt die 3 noch einmal.
    • Kommt die 3 beim Empfänger an, so bestätigt er alle fünf TCP-Segmente, wenn beide die TCP-Option Selective ACK (SACK) unterstützen.
  • Der Sender startet für jedes TCP-Segment, welches er auf die Reise schickt, einen Retransmission Timer.
=== Retransmission Timer ===
  • Zur Feststellung, wann ein Paket im Netzwerk verloren gegangen ist, wird vom Sender ein Timeout verwendet, bis zu dem das ACK der Gegenseite eingetroffen sein muss.
    • Timeout zu niedrig, Pakete werden doppelt geschickt.
    • Timeout zu hoch, velorene Pakete werden zu spät neu geschickt.
  • Aufgrund unterschiedlicher Laufzeiten der IP-Pakete ist nur ein dynamischer Timer sinnvoll.
=== Zusammenhang von Flusssteuerung und Staukontrolle ===
In den folgenden zwei Abschnitten werden die TCP-Konzepte zur Flusssteuerung und Staukontrolle (oder Überlaststeuerung) erläutert. 
  • Dabei werden das Sliding Window und das Congestion Window eingeführt.
  • Der Sender wählt als tatsächliche Sendefenstergröße das Minimum aus beiden Fenstern.
  • Es werden ARQ-Protokolle (Automatic Repeat reQuest) für eine zuverlässige Datenübertragung eingesetzt.
=== Flusssteuerung ===
Sliding Window
Da Daten aus dem Puffer gelesen werden, ändert sich der Füllstand des Puffers ständig.
  • Deshalb ist es notwendig, den Datenfluss dem Füllstand entsprechend zu steuern.
    • Dies geschieht mit dem Sliding Window und dessen Größe.
  • Der Puffer des Senders wird auf auf 10 Segmente erweitert.


;Im Sliding Window (a) werden gerade die Segmente 1–5 übertragen. 
# Obwohl der Puffer voll ist, werden die nächsten Daten (ab Byte 7301) mit ACK=7301 angefordert.
#* Das nächste Segment kann nicht mehr verarbeitet werden.
#* Mit dem Window-Feld (=0) teilt er dem Sender mit, dass keine Daten mehr verschickt werden sollen.
# Die Anwendung liest die Segmente 1–5 aus dem Puffer, es werden 7300Byte frei. 
# Er kann die restlichen Segmente 6–10 mit einem TCP-Header (SEQ=1, ACK=7301, Window=7300), beim Sender anfordern. 
# Der Sender weiß nun, dass er maximal fünf Segmente schicken kann, und verschiebt das Window um fünf Segmente nach rechts (Sliding Window (b)). 
# Die Segmente 6–10 werden nun alle zusammen als Burst verschickt. 
# Beim Ankommen aller TCP-Segmente beim Empfänger, quittiert er sie (SEQ=1 und ACK=14601) und fordert die nächsten Daten an.

=== Überlaststeuerung/Staukontrolle (Congestion Control) ===

  • Wird eine Verbindung stark belastet, werden immer mehr Pakete verworfen.
  • Durch die Wiederholung steigt wiederum die Belastung, dies sorgt (ohne Maßnahmen) für einen Datenstau.
  • Die Verlustrate wird von einem IP-Netzwerk ständig beobachtet.
  • Normalerweise wird eine TCP/IP-Verbindung langsam gestartet (Slow-Start) und die Senderate schrittweise erhöht, bis zum Datenverlust.
  • Ein Datenverlust verringert die Senderate, ohne Verlust wird sie wiederum erhöht.
==== Algorithmus zur Überlaststeuerung ====
Gehen bei einer bestimmten Fenstergröße Pakete verloren, kann das festgestellt werden, wenn der Sender innerhalb einer bestimmten Zeit (Timeout) kein ACK erhält. 
  • Man muss davon ausgehen, dass das Paket aufgrund zu hoher Netzlast von einem Router im Netz verworfen wurde (Stau im Netz).
  • Um den Stau aufzulösen, müssen alle beteiligten Sender ihre Netzlast reduzieren.
Dazu werden im RFC 2581 vier Algorithmen definiert: 
#slow start
#congestion avoidance
#fast retransmit
#fast recovery,
  • slow start und congestion avoidance werden zusammen verwendet.
  • fast retransmit und fast recovery werden zusammen verwendet, sind eine Erweiterung von slow start und congestion avoidance.
==== Slow Start Slow Start und Congestion Avoidance ====
Grafische Darstellung des Slow-Start-Algorithmus
  • Der Slow-Start-Algorithmus dient zur Bestimmung des congestion window.
  • Da die momentane Auslastung des Netzes nicht bekannt ist, wird mit kleinen Datenmengen begonnen.
#Der Algorithmus startet mit einem kleinen Fenster, von einer Maximum Segment Size (MSS), in dem Datenpakete vom Sender zum Empfänger übertragen werden.
#Der Empfänger sendet ACK an den Sender zurück. 
#Für jedes empfangene ACK wird die Größe des congestion window um eine MSS erhöht. 
#*Dies führt innerhalb einer Roundtrip-Zeit zu einer Verdopplung des Congestion Windows. 
#Dieses exponentielle Wachstum wird so lange fortgesetzt, bis der Slow-Start Threshold erreicht wird.
#*Die Phase des exponentiellen Wachstums wird auch Slow Start Phase genannt. 
#Danach wird das Congestion Window nur noch um eine MSS erhöht, wenn alle Pakete aus dem Fenster erfolgreich übertragen wurden. 
#*Es wächst pro Roundtrip-Zeit nur noch um eine MSS, also nur noch linear. 
#**Diese Phase wird als Congestion Avoidance Phase bezeichnet. 
#*Das Wachstum wird beendet, wenn das vom Empfänger festgelegte Empfangsfenster erreicht worden ist.


Kommt es zu einem Timeout, wird das congestion window auf 1 zurückgesetzt, der slow-start threshold wird auf die Hälfte der gesendeten, unquittierten Pakete herabgesetzt (Flight Size). 
  • Die Phase des exponentiellen Wachstums wird also verkürzt.
  • Das Fenster wächst bei häufigen Paketverlusten nur langsam.
==== Fast-Retransmit und Fast-Recovery ====
  • Werden eingesetzt, um nach Paketverlust schneller auf die Stau-Situation zu reagieren.
  • Empfänger informiert den Sender, wenn Pakete außer der Reihe ankommen und somit dazwischen ein Paketverlust vorliegt.
  • Der Empfänger bestätigt das letzte korrekte Paket erneut für jedes weitere ankommende Paket außer der Reihe.
  • Man spricht dabei von Dup-Acks (duplicate acknowledgments),
    • Mehrere aufeinanderfolgende Nachrichten, welche dasselbe Datensegment ACKen.
  • Der Sender bemerkt die duplizierten ACKS, und nach dem dritten Duplikat sendet er sofort, vor Ablauf des Timers, das verlorene Paket erneut.
    • Da nicht auf den Timerablauf gewartet werden muss, heißt das Prinzip Fast Retransmit.
  • Dup-Acks: auch Hinweise darauf, dass ein Paketverlust stattfand, dennoch die folgenden Pakete angekommen sind.
  • Das Sendefenster wird nach dem Fehler nur halbiert (kein Slow-Start).


Zusätzlich kann das Sendefenster noch um die Anzahl der Dup-Acks erhöht werden,
  • Jedes Dup-Ack steht für ein weiteres Paket, welches den Empfänger erreicht hat.
  • Dadurch kann nach dem Fehler schneller wieder die volle Sendeleistung erreicht werden.
  • Das Prinzip nennt man Fast-Recovery.
Verwaltung der TCP-Verbindungen als endlicher Automat
Verwaltung der TCP-Verbindungen als endlicher Automat
= Dokumentation =
== Man-Pages ==
== Info-Pages ==
= Links =
== Intern ==
== Weblinks ==

= Testfragen =
Testfrage 1
Antwort1
Testfrage 2
Antwort2
Testfrage 3
Antwort3
Testfrage 4
Antwort4
Testfrage 5
Antwort5