# Ende-zu-Ende Protokolle: UDP und TCP ## TCP > Zuverlässiger Byte-Strom mit integrierter Flusskontrolle ### Ausgangslage für eine (virtuelle) TCP-Verbindung ![image_866.png](image_866.png) - MSS (Maximum Segment Size) - maximale Größe eines TCP-Segments (NUR Daten, ohne Header) - wird bei Verbindungsaufbau ausgehandelt - abhängig von der MTU (Maximum Transmission Unit) des darunterliegenden Netzwerks - Retransmission Timer (Timeout = RTO) - Nach Ablauf des Timers werden unbestätigte Datenpakete erneut gesendet ## TCP Sequenznummern - Sequenznummer eines TCP-Segments - Bytestromnummer des ersten Bytes im Segment - wird bei Verbindungsaufbau ausgehandelt ## TCP Bestätigungsnummern - Bestätigungsnummer eines TCP-Segments - Bytestromnummer des nächsten erwarteten Bytes - Als Quittungsnummer wird gesetzt: - ACK-Nummer (von Host B) = fehlerfrei empfangene Squenznummer + Größe der Nutzdaten in Byte - i.d.R poitiv - stellen Summenquittungen dar - d.h. alle Bytes bis zur ACK-Nummer wurden fehlerfrei empfangen - werden zusammen mit den restlichen Daten die von B nach A gesendet werden, in einem TCP-Segment übertragen - "Huckepack" ### TCP Telnet Fallstudie ![image_867.png](image_867.png) #### Neuübertragung aufgrund einer verlorenen ACK ![image_868.png](image_868.png) #### keine Neuübertragung, weil Bestätigung vor Timeout ankommt ![image_869.png](image_869.png) #### Keine Neuübertragung, weil kumulative Bestätigung ankommt (Summenquittung) ![image_870.png](image_870.png) ## TCP Verbindungsaufbau > TCP-Verbindung ist Full-Duplex > > Beide Verbindungen (Hin und Rück) müssen separat aufgebaut werden > > SYN-Flag = 1 dient zum Aufbau (Synchronisation) > > ACK-Flag = 1 dient zur Bestätigung (Quittung) > > Sequenz- und Quittungsnummern beziehen sich auf Bytes - TCP-Verbindung wird mit einem 3-Wege-Handshake aufgebaut - **Verbindungsanfrage (SYN) von A an B** - SYN = 1 - SEQ = x (Startsequenznummer) - **Verbindungsbestätigung (SYN, ACK) von B an A** - SYN = 1 - ACK = x + 1 (Bestätigungsnummer) - SEQ = y (Startsequenznummer von B) - **Bestätigung (ACK) von A an B** - SYN = 0 - ACK = y + 1 (Bestätigungsnummer) - SEQ = x + 1 (Fortsetzung der Sequenznummer von A) - ![image_871.png](image_871.png) ### Verbindungsaufbau Übung ![image_872.png](image_872.png) ## TCP Verbindungsabbau > TCP-Verbindung ist Full-Duplex → Jede Richtung muss separat abgebaut werden > > Falls nur eine Verbindung abgebaut wird (und die andere noch aktiv ist), dann wird die Verbindung in den Zustand "Half-Close" versetzt. > bspw. Wenn der Client nur noch empfangen möchte, aber nicht mehr senden. - Schematisch - Schließung TCP-Verbindung mit anschließender Wartezeit von 30 Sekunden - ![image_873.png](image_873.png) ### Verbindungsabbau Übung ![image_874.png](image_874.png) ## TCP Verbindungsmanagement ![image_875.png](image_875.png) - TCP-Verbindungen werden in einem Verbindungsmanagement verwaltet - Zustände: - CLOSED: Verbindung ist geschlossen - LISTEN: Verbindung wartet auf Verbindungsanfrage - SYN-SENT: Verbindungsanfrage wurde gesendet, aber noch keine Antwort erhalten - SYN-RECEIVED: Verbindungsanfrage wurde empfangen, aber noch keine Bestätigung gesendet - **ESTABLISHED**: Verbindung ist aufgebaut und kann Daten übertragen - FIN-WAIT-1: Die Anwendung möchte Übertragung beenden - FIN-WAIT-2: Andere Seite ist einverstanden die Verbindung zu beenden - TIME-WAIT: Verbindung ist geschlossen, aber wartet auf mögliche ausstehende Pakete - CLOSING: Beide Seiten haben gleichzeitig versucht, die Verbindung zu schließen - CLOSE-WAIT: Gegenseite hat Verbindungsfreigabe eingeleitet - LAST-ACK: Warten, bis keine TCP-Segmente mehr kommen ### TCP Client Lifecycle ![image_876.png](image_876.png) ### TCP Server Lifecycle ![image_877.png](image_877.png) ## TCP Zuverlässigkeit sicherstellen - Quittungen - positive ACKs - kumulative Summenquittungen - Zeitüberwachung - Retransmission Timer - Timeout (RTO) - Sequenznummern ## TCP Flusskontrolle ### Senden - TCP-Sender sendet Daten, solange der Sendepuffer nicht voll ist - enthält die gesendeten, aber noch nicht bestätigten Daten - ![image_878.png](image_878.png) - Sendefenster wird dazu benutzt, um die Anzahl von Bytes anzugeben, die der Empfänger bereit ist anzunehmen - bildet absolute obere Grenze, die vom Sender nicht überschritten werden darf ### Empfangen - TCP-Empfänger sendet ACKs, solange der Empfangspuffer nicht voll ist - ![image_879.png](image_879.png) - Empfangsfenster ist dynamisch - wird vom Empfänger in jedem ACK aktualisiert - gibt an, wie viele Bytes der Empfänger noch aufnehmen kann ### Flusskontrolle Beispiel ![image_880.png](image_880.png) ### Datenfluss: Fehlerfreie Übertragung ![image_883.png](image_883.png) ### Datenfluss: Fehlerhafte Übertragung ![image_884.png](image_884.png) ## TCP Pipelining, Sliding Window ### Pipelining - TCP-Sender kann mehrere Segmente senden, ohne auf die Bestätigung des Empfängers zu warten - Erlaubt eine höhere Auslastung der Verbindung - Sender sendet mehrere Segmente in einem Rutsch - z.B. 3 Segmente mit jeweils 1000 Bytes - **Konsequenzen**: - Sender und Empfänger benötigen einen Puffer für mehrere Segmente - Minimum: Sender muss alle gesendeten, aber noch nicht bestätigten Segmente puffern - Bereich der Sequenz- und Bestätigungsnummern wird größer ### Sliding Window ![image_881.png](image_881.png) - Sliding Window ist eine Erweiterung des Pipelining - Gewährleistet: - Zuverlässige Übertragung in einem Bytestrom - Übertragung der Daten in richtiger Reihenfolge - Flusskontrolle zwischen Sender und Empfänger - Integrierte Flusskontrolle - keine feste Sliding Window Größe - wird Sender vom Empfänger mitgeteilt ("Advertised Window") - auf Grundlage des Speicherplatzes, der der Verbindung zugewiesen ist #### Sliding Window Beispiel ![image_882.png](image_882.png) - **Senderseite** (a) - LastByteAcked ≤ LastByteSent - LastByteSent ≤ LastByteWritten - Bytes zwischen LastByteAcked und LastByteSent puffern - **Empfängerseite** (b) - LastByteRead ≤ LastByteExpected - LastByteExpected ≤ LastByteReceived + 1 - Bytes zwischen LastByteRead und LastByteReceived puffern ## TCP Fehlerbehandlung - Erfolgt durch Go-Back-N - Sender sendet Datenpakete, bis er eine Bestätigung erhält - Bei Verlust eines Pakets wird es erneut gesendet - Arbeitet mit positiven ACKs - Empfänger sendet ACKs für empfangene Pakete (ggf. kumulative ACKs) - Ab dem ersten, nicht quittierten Paket, werden alle folgenden Pakete erneut gesendet ## TCP Überlastungskontrolle - Funktion der Netzwerkschicht zur Regelung des Datenflusses - Begrenzung der Übertragungsrate - Lösungsansatz: - **TCP-Slow-Start** - Startet mit einer niedrigen Übertragungsrate - Erhöht die Rate exponentiell, bis ein Paket verloren geht - **TCP-Kongestionskontrolle** - Reduziert die Übertragungsrate, wenn Pakete verloren gehen