Transmission Control Protocol: Unterschied zwischen den Versionen
K →Header |
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) | |||
=== 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 ===
Feld | Funktion | Größe |
---|---|---|
Source Port (Quellport) |
|
2 Byte |
Destinations Port (Zielport) |
|
2 Byte |
Sequence Number |
|
4 Byte |
Acknowledgement Number |
|
4 Byte |
Data Offset |
|
4 Bit |
Reserved |
|
4 Bit |
Control-Flags |
|
8 Bit |
(Receive) Window |
|
2 Byte |
Checksum |
|
2 Byte |
Urgent Pointer |
|
2 Byte |
Options |
|
0–40 Byte |
=== TCP-Flags ===
Feld | Funktion | Größe |
---|---|---|
ECE-Flag (ECN-Echo) |
|
1 Bit |
CRW-Flag (Congestion Window Reduced) |
|
1 Bit |
URG-Flag (Urgent) |
|
1 Bit |
ACK-Flag (Acknowledgment) |
|
1 Bit |
PSH-Flag (Push) |
|
1 Bit |
RST-Flag (Reset) |
|
1 Bit |
SYN-Flag (Synchronize) |
|
1 Bit |
FIN-Flag (Finish) |
|
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 ===
#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 ===
- 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 ==
=== 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 ===
#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 ===
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 ====
- 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.
= Dokumentation = == Man-Pages == == Info-Pages == = Links = == Intern == == Weblinks == = Testfragen =
Testfrage 1
Antwort1
Testfrage 2
Antwort2
Testfrage 3
Antwort3
Testfrage 4
Antwort4
Testfrage 5
Antwort5