# 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 ## 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 (Flusskontrolle) - Quittungen - positive ACKs - kumulative Summenquittungen - Zeitüberwachung - Retransmission Timer - Timeout (RTO) - Sequenznummern