5 Transmission Control Protocol (TCP) RFC 793. J. Postel. Transmission Control Protocol. 1981. Transport Protokoll verbindungsorientiert Verbindungsaufbau Datenübertragung Verbindungsabbau zuverlässig Verlust von IP Paketen wird erkannt und durch Übertragungswiederholung korrigiert Martin Mauve Universität Mannheim 1 TCP Flußkontrolle (engl. Flow Control) verhindert, daß der Empfänger von einem Sender schneller Daten erhält, als er engegennehmen kann Netzwerk-Überlastkontrolle (engl. Congestion Control) verhindert, daß es zu einer Überlastsituation im Netz kommt, die zum vollständigen Zusammenbruch des Netzes führen könnte (congestion collapse) bei Erkennen einer Überlastsituation (Paketverlust!) wird vom Sender die Datenrate gedrosselt transparente Übertragung von byte streams Anwendungen, die TCP benutzen, sollen nicht merken, daß die Daten in Form von Paketen übertragen werden Martin Mauve Universität Mannheim 2 Zuverlässigkeit in TCP TCP unterteilt den byte stream in Einheiten, die jeweils in einem IP Paket übertragen werden, diese Einheiten heißen Segmente. Nachdem TCP ein Segment (per IP) losgeschickt hat, wird ein Timer für dieses Paket gestartet. Wenn keine Bestätigung über den erfolgreichen Empfang dieses Paketes innerhalb der TimerLaufzeit eintrifft, wird die Übertragung wiederholt. Wenn TCP ein Paket vom Kommunikationspartner erhält, dann wird eine Bestätigung über den erfolgreichen Empfang an den Sender geschickt. Martin Mauve Universität Mannheim 3 Zuverlässigkeit in TCP TCP berechnet eine Checksumme über die versandten Fragmente. Falls diese einen Fehler signalisiert, wird das Fragment nicht bestätigt. Wenn Segmente außer der Reihe von IP ausgeliefert werden, wird TCP die richtige Reihenfolge wieder herstellen. Wenn IP-Datagramme im Netz verdoppelt werden, dann sortiert TCP die Duplikate aus. Martin Mauve Universität Mannheim 4 Sliding Window TCP verwendet einen sliding window-Mechanismus zur gemeinsamen Fluß- und Überlastkontrolle Sender: sliding window sliding window acknowledgements Martin Mauve Universität Mannheim 5 Sliding Window Eine maximale Größe für das Schiebefenster wird durch die Flußkontrolle vorgegeben. Die Größe des Fensters ändert sich durch die Überlastkontrolle: wenn eine Überlastung vorliegt, wird sie reduziert wenn keine Überlastung vorliegt, wird sie erhöht Martin Mauve Universität Mannheim 6 TCP Header 0 15 7 31 IP Header (20 Byte) source port number destination port number sequence number acknowledgement number hdr size reserved flags window size TCP checksum urgent pointer options data Martin Mauve Universität Mannheim 7 TCP Header Port-Nummern: wie für UDP sequence number: identifiziert das erste Byte im Datenteil des Paketes acknowledgement number: identifiziert das nächste Byte, das der Sender dieses Paketes vom Empfänger dieses Paketes erwartet Da Daten in beide Richtungen zwischen den Kommunikationspartnern fließen können, gibt es eine eigene sequence number für jede Richtung header length: Größe des TCP headers in 32 bit Worten Martin Mauve Universität Mannheim 8 TCP Header Flags: URG: urgent pointer Feld ist gültig ACK: acknowledgement Feld ist gültig PSH: der Empfänger sollte die Daten der Anwendung so schnell wie möglich zur Verfügung stellen RST: Reset der Verbindung SYN: Synchronisation der initialen Sequenznummern bei Verbindungsaufbau FIN: der Sender hat das Senden seiner Daten beendet Martin Mauve window size: Anzahl der Bytes, die der Sender dieses Paketes noch entgegennehmen kann, bis sein Puffer voll ist (flow control) Universität Mannheim 9 TCP Header checksum: wird über das gesamte Fragment berechnet, incl. TCP Header und pseudo Header wie in UDP urgent pointer: der urgent pointer identifiziert das letzte Byte im Datenteil, welches mit besonderer Priorität bearbeitet werden sollte options: werden wir später besprechen der Datenteil eines TCP-Paketes ist optional, ein leeres TCP-Paket kann z.B. als reine Bestätigung empfangener Daten gesendet werden, wenn keine Daten in die Rückrichtung gesendet werden sollen Martin Mauve Universität Mannheim 10 5.1 TCP-Verbindungsaufbau und -abbau SYN seq 4711 length 0 win 4096 mss 1024 Aufbau SYN seq 0815 ack 4712 length 0 win 4096 mss 1024 ack 0816 FIN seq 4712 ack 0816 length 0 win 4096 ack 4713 Abbau FIN seq 0816 ack 4713 length 0 win 4096 ack 0817 Martin Mauve Universität Mannheim 11 TCP-Verbindungsaufbau eine TCP-Verbindung ist definiert durch ein 4-Tupel: {IP-Adresse 1, Port 1, IP-Adresse 2, Port 2} „three way handshake“ SYN Flag zeigt an, daß die Sequence Numbers SYNchronisiert werden sollen SYN „kostet“ ein Byte bezüglich der Sequenznummernvergabe reine acknowledgements „kosten“ keine Bytes Martin Mauve derjenige Teilnehmer, der den Verbindungsaufbau initiiert, führt ein „active open“ (i.d.R. der Client) durch, der Kommunikationspartner ein „passive open“ (i.d.R. der Server) Universität Mannheim 12 Timeout bei Verbindungsaufbau Was passiert, wenn der Kommunikationspartner nicht antwortet? die Übertragung des Paketes wird wiederholt, TCP betrachtet dies als gewöhnlichen Paketverlust nach einer festen Zeit (timeout) wird der Verbindungsversuch abgebrochen und die Anwendung informiert Martin Mauve Universität Mannheim 13 Maximum Segment Size Option mit der Maximum Segment Size (MSS) gibt ein System an, wie groß Segmente sein dürfen, die in einem TCP Paket übertragen werden: Standardwert ist 536 (ergibt 576, wenn minimale IP- und TCP-Header hinzugerechnet werden) ein größerer Wert kann von einem System angegeben werden, dieser darf die MTU des angeschlossenen LANs minus minimale IP- und TCP-Header nicht überschreiten zu IP-Fragmentierung kommt es, wenn ein Netz durchquert wird, welches eine kleinere MTU als die MSS (+header) hat, dann wird path MTU discovery verwendet Martin Mauve Universität Mannheim 14 Live Demo TCP-Verbindungsaufbau # telnet pi4 discard Trying 134.155.48.96 Connected to pi4. Escape character is `^]`. telnet> ^] (=control + ]) telnet> quit Connection closed. Martin Mauve Universität Mannheim 15 TCP-Verbindungsabbau durch zweimal half-close: da die TCP-Verbindung bidirektional ist, können beide Richtungen getrennt voneinander beendet werden wer seine Senderolle beenden möchte, setzt das FIN Flag FIN „kostet“ ein Byte und wird daher durch ein ack(nowledgement) bestätigt der andere Teilnehmer kann weiter senden - jedoch sieht man fast immer das Verhalten, daß der andere Teilnehmer als Reaktion auch seine Senderolle beendet Martin Mauve derjenige Teilnehmer, der zuerst seine Verbindung beendet, führt ein „active close“ (i.d.R. der Client) durch, der Kommunikationspartner ein „passive close“ (i.d.R. der Server) Universität Mannheim 16 2MSL Wait State derjenige Teilnehmer, der einen active close durchführt, muss nach Senden des acks für das FIN des Kommunikationspartners die Verbindung für eine gewisse Zeit offen halten Grund: das ack könnte verloren gehen und müsste dann erneut übertragen werden die „gewisse Zeit“ beträgt 2 maximal segment lifetimes (daher 2MSL wait state) implementiert wird eine MSL als 30 - 120 Sekunden während 2MSL Wait State kann daher die Port-Nummer noch nicht wieder für andere TCP-Verbindungen verwendet werden Martin Mauve Universität Mannheim 17 Live Demo TCP-Verbindungsabbau # telnet pi4 discard Trying 134.155.48.96 Connected to pi4. Escape character is `^]`. telnet> ^] (=control + ]) telnet> quit Connection closed. Martin Mauve Universität Mannheim 18 TCP Reset ein Segment, bei dem das RST (reset) bit im TCP header gesetzt ist, terminiert die Verbindung in Form eines „abortive release“ (im Gegensatz zum „orderly release“ mit FIN): alle Daten, die beim Sender gepuffert waren, werden verworfen und das reset Segment wird sofort gesendet, die Verbindung ist damit aus Sicht des RST Senders sofort terminiert es können beim Reset Daten verloren gehen (das passiert beim Verbindungsabbau mit FIN nicht) der Emfänger eines RST Segmentes meldet dies der Anwendung und terminiert sofort Martin Mauve Universität Mannheim 19 TCP Reset es gibt prinzipiell zwei unterschiedliche Situationen, wann ein RST gesendet wird: wenn ein Port nicht belegt ist (connection refused) wenn eine bestehende Verbindung abgebrochen wird (connection reset by peer) i.d.R. kann man als socket Option angeben, ob ein normales TCP close erwünscht ist (mit FIN) oder ob ein Abbruch erwünscht ist bei Java geschieht dies mit: setSoLinger(int x), dies gibt an, daß der Socket nach x Sekunden mit einem Reset geschlossen werden soll Martin Mauve Universität Mannheim 20 TCP PUSH Flag (PSH) die ursprüngliche Aufgabe des PSH Flags war es, dass der Sender eines Segmentes den Empfänger auffordert, dieses (und alle vorangegangenen) sofort bei der jeweiligen Anwendung auszuliefern, ohne dass es lange gepuffert wird dies sollte z.B. für interaktive Anwendungen verwendet werden wird inzwischen jedoch standardmäßig (fast) immer gesetzt, da keine Rechenzeit beim Auslesen der Puffer gespart werden muss Martin Mauve Universität Mannheim 21 TCP - Application Programming Interface Client/Server mit Sockets: der Server wartet auf einem wohldefinierten Port auf Verbindungswünsche von Clients ein Client verbindet sich mit dem Server nachdem die Verbindung hergestellt ist, kann der Server für diese Verbindung einen Thread/Prozess anlegen, so dass er auf weiterhin eingehende Verbindungswünsche reagieren kann wenn er dies nicht tut, werden die Verbindungswünsche sequentiell bearbeitet (selten) Client und Server kommunizieren über byte streams Martin Mauve Universität Mannheim 22 TCP - API Beispiel: Command Client/Server einfaches Java-Beispiel für einen sequentiell arbeitenden Server Beobachten mittles tcpdump/ethereal! Martin Mauve Universität Mannheim 23 5.2 TCP Interactive Data Flow Buchstabe ack für Buchstabe Darstellung des Buchstabens ack für Darstellung des Buchstaben rlogin client Martin Mauve rlogin server Universität Mannheim 24 Delayed Acknowledgements um zu verhindern, daß überflüssige TCP-Segmente gesendet werden, die nur ein ack beinhalten, wird das Senden von acks i.d.R. verzögert: Buchstabe ack für Buchstabe und Darstellung des Buchstabens delayed ack delayed ack ack für Darstellung des Buchstaben rlogin client Martin Mauve rlogin server Universität Mannheim 25 Delayed Acknowledgements ein ack wird bei delayed acknowledgements i.d.R. um maximal 200 ms verzögert während dieser Zeit können Daten, die gesendet werden, das ack „Huckepack“ (engl. piggyback) mitnehmen, dies spart die Übertragung eines reinen ack Segmentes werden innerhalb dieser Zeit keine Daten gesendet, so wird ein reines ack Segment übertragen der 200ms Timer wird nicht für jedes Paket aufgezogen, sondern läuft global, d.h. alle 200ms werden alle acks verschickt, die noch offen sind Martin Mauve Universität Mannheim 26 TCP Delayed Acks - Demon Martin Mauve wir verwenden rlogin und tcpdump, um zu sehen, wie TCP delayed acks verwendet Universität Mannheim 27 Nagle Algorithm wenn Segmente übertragen werden, die sehr klein sind, dann fällt viel Overhead in Form von Headern an z.B. bei rlogin 40 Byte Header für 1 Daten Byte! insbesondere in WANs (wide area networks) kann dies problematisch sein zur Vermeidung dieses Problems wird der Nagle Algorithmus verwendet Martin Mauve Universität Mannheim 28 Nagle Algorithm RFC 896 ein Sender darf nur ein ausstehendes Segment haben, welches kleiner als die MSS ist Idee: solange acks schnell zurückkommen behindert dies den Sender nicht, wenn acks langsam zurückkommen, dann ist es wichtig, dass möglichst wenige „tinygrams“ gesendet werden Problem: manchmal möchte man dieses Verhalten nicht (z.B. bei X Window sollen Maus-Bewegungen ohne Verzögerung übertragen werden) Lösung: man kann den Nagle Algorithmus abschalten, z.B. in Java: setTcpNoDelay(boolean) Martin Mauve Universität Mannheim 29 5.3 TCP Bulk Data Flow was passiert, wenn man große Datenmengen per TCP überträgt? wir schauen uns eine Dateiübertragung mittels ftp an (ethereal) Frage: wann wird ein ack gesendet? bisher: delayed ack nach 200ms das würde zu viele unbestätigten Paketen verursachen, wenn die Datenrate hoch ist (bulk data flow) daher wird i.d.R. jedes 2te Segment sofort bestätigt, auch wenn der 200ms delayed ack timer noch nicht abgelaufen ist Martin Mauve Universität Mannheim 30 Schneller Sender und langsamer Empfänger sequ 1, length 1024, ack 1, win 4096 sequ 1025, length 1024, ack 1, win 4096 ack 2049, win 2048 sequ 2049, length 1024, ack 1, win 4096 sequ 3073, length 1024, ack 1, win 4096 ack 4097, win 0 ack 4097, win 4096 ftp server Martin Mauve ftp client Universität Mannheim 31 Schneller Sender und langsamer Empfänger der Sender überträgt die Daten schneller, als sie der Empfänger aus dem Puffer lesen kann der Puffer des Empfängers läuft voll, er signalisiert dies mit der Fenstergröße (dies ist eine Erweiterung zum sliding window-Mechanismus, welche es erlaubt, Pakete zu bestätigen, ohne dem Sender das Recht zu geben, weitere Pakete zu senden) erst wenn der Puffer vom Empfänger wieder freien Platz enthält, wird dieser freie Platz in einem weitern ack dem Sender mitgeteilt das so genutzte Fenster ist das Empfänger Fenster (eines pro Kommunikationspartner) Martin Mauve Universität Mannheim 32 Congestion Problem: wenn alle Sender im Netz immer so viele Pakete losschicken, wie bei den Empfängern in den Puffer passen, dann kann es zur Überlast (congestion) im Netz kommen, da nicht auf die momentane Situation im Netz Rücksicht genommen wird Sender A Sender B Martin Mauve Empfänger C wenn alle Verbindungen die gleiche Bandbreite haben und sowohl A als auch B mit der Bandbreite der Verbindung senden, dann kommt es hier zur Netzwerküberlastung (congestion)! Universität Mannheim Empfänger D 33 Congestion Window um auf Congestion zu reagieren, wird beim Sender ein zusätzliches Congestion Window (cwnd) mitgeführt cwnd wird wie das vom Empfänger mitgeteilte Empfänger Fenster in Byte geführt ein Sender darf nur das MINIMUM aus (cwnd, Empfänger Fenster) an Daten senden Martin Mauve Universität Mannheim 34 Slow Start das cwnd wird zu Beginn einer Verbindung mit einer MSS (wie vom Kommunikationspartner angekündigt) initialisiert solange kein Verlust auftritt, wird das cwnd jeweils um eine MSS erhöht, wenn ein Segment bestätigt wurde: d.h. wenn das erste Segment bestätigt wurde, dürfen zwei volle Segmente gesendet werden, sofern dies weniger als die von Empfänger angegebene (flow control) Fenstergröße ist: das cwnd wird auf 2 erhöht und es stehen keine unbestätigten Segmente mehr aus Martin Mauve Universität Mannheim 35 Slow Start mittels slow start soll schnell der Wert bestimmt werden, den man senden kann, ohne Paketverlust hervorzurufen dieser Wert ist erreicht, wenn das cwnd so groß ist, dass die Verbindung zum Empfänger mit Paketen gefüllt bleibt: Sender Empfänger optimales cwnd = bandbreite * round-trip Verzögerung Martin Mauve Universität Mannheim 36 Slow Start slow start terminiert, wenn die ersten Paketverluste auftreten, dann kommt es zu congestion avoidance (wird erklärt, wenn wir Verlusterkennung und Übertragungswiederholung besprechen) ideal wäre es, wenn man einfach den durch slow start bestimmten Wert für die ganze Lebenszeit der Verbindung verwenden könnte dies ist leider nicht möglich, da sich die verfügbare Bandbreite während einer Verbindung ändern kann (dies kann sehr häufig in kurzen Abständen passieren) Martin Mauve Universität Mannheim 37 5.4 Zuverlässigkeit in TCP generell wird Zuverlässigkeit in TCP durch acknowledgements gewährleistet wenn der Sender kein acknowledgement für ein Segment erhält, wird dieses nach Ablauf eines Timers erneut übertragen wenn nötig, wird dies wiederholt, bis eine Bestätigung vorliegt damit dies funktioniert, benötigt man Wissen über die Netzwerkverzögerung zwischen Sender und Empfänger (round trip delay) Martin Mauve Universität Mannheim 38 Round Trip Delay-Messung beim Sender wird beim Eintreffen eines acks das round trip delay für das erste Segmente bestimmt, welches durch das ack bestätigt wurde d.h. wenn 2 Segmente durch ein ack bestätigt werden, wird nur das round trip delay für das erste Segment bestimmt da sich das round trip delay mit der Zeit ändern kann, muss diese Änderung erfaßt werden erste Idee (exponentielle Glättung): Martin Mauve RTT a*RTT + (1-a)*M RTT= round trip time estimator, a=0.9, M=aktuelle Messung nach RTO=2*RTT wird die Übertragung eines Paketes wiederholt 2*RTT um bei spontane Variationen des round trip delays nicht sofort überflüssige Übertragungen zu erzeugen Universität Mannheim 39 Round Trip Delay-Messung die erste Idee hat nur bedingt funktioniert, da sie nicht resistent genug gegen plötzliche Schwankungen des round trip delays war Idee: die Varianz muss in die Berechnung einbezogen werden: Martin Mauve Err = M -A A A+g*Err D D + h*(|Err| -D) RTO = A+4*D mit A=geglättetes durchschnittliches round trip delay, D=geglättete Standardabweichung, Err=Abweichung des aktuellen Testwertes M, g=Anpassungsfaktor für A (0.125), h=Anpassungsfaktor für D (0.25) Universität Mannheim 40 Karn‘s Algorithmus Problem: wenn eine Segmentübertragung wiederholt wurde (z.B. wegen eines Timeouts) und dann bestätigt wird, weis man nicht, ob: die Bestätigung für die erste Übertragung gemeint war und im Netz zu lange verzögert wurde, oder die Bestätigung tatsächlich für die wiederholte Übertragung des Segmentes gilt Martin Mauve nach Karn dürfen daher acks von Segmenten, die wiederholt übertragen wurden, nicht bei der Berechnung des round trip delays berücksichtigt werden Universität Mannheim 41 Fast Retransmit Problem: was tun, wenn ein einzelnes Segment verloren gegangen ist, und die nachfolgenden Segmente vom Empfänger korrekt empfangen werden? der Empfänger schickt duplicate acks, d.h. er bestätigt das letzte Paket vor der „Lücke“ erneut, wenn er Segmente erhält, die nicht in der richtigen Reihenfolge ankommen Martin Mauve Universität Mannheim 42 Fast Retransmit erhält der Sender ein duplicate ack, so kann: entweder die Reihenfolge der Pakete im Netz verändert worden sein, oder ein Paketverlust vorliegen wenn wenige duplicate acks in Folge ankommen, ist der erste Fall wahrscheinlich und der Sender ignoriert dies; treten mehr als 2 duplicate acks auf, wird vom Sender ein Paketverlust angenommen und das betroffene Segment erneut übertragen wenn ein kontinuierlicher Datenstrom vom Sender gesendet wird, dann werden einzelne Paketverlust so deutlich schneller erkannt und repariert, daher der Name: fast retransmit Martin Mauve Universität Mannheim 43 Fast Retransmit-Beispiel sequ 1, geht verloren ack 1 sequ 1025 ack 1 sequ 2049 ack 1 sequ 3073 ack 1 triple duplicate ack: retransmit sequ 1 ack 4097 sequ 4097 ftp server Martin Mauve ftp client Universität Mannheim 44 Slowstart & Congestion Avoidance cwnd wird mit der MSS des Empfängers initialisiert slow start threshold (ssthresh) wird mit 65353 initialisiert solange ssthresh>cwnd und keine Verluste auftreten: slow start: erhöhe cwnd um MSS für jedes empfangene ACK (dies ist exponentiell!) wenn keine Verluste und ssthresh<=cwnd: congestion avoidance: erhöhe cwnd um 1/cwnd (hier cwnd gemessen in Vielfachen von MSS), wenn eine ACK empfangen wird (dies ist linear) Martin Mauve Universität Mannheim 45 Slowstart & Congestion Avoidance wenn triple duplicate ack: setzte ssthresh und cwnd auf die Hälfte von min(cwnd, Empfänger Fenster), runde auf ganze Vielfache von MSS ab danach congestion avoidance wenn timeout: setzt ssthresh auf die Hälfte von min(cwnd, Empfänger Fenster), runde auf ganze Vielfache von MSS ab setzte cwnd auf MSS (slow start) für Übertragung immer: min(cwnd, Empfänger Fenster), dabei wird cwnd auf ganze Vielfache von MSS abgerundet dieses Vorgehen bezeichnet man als additive increase multiplicative decrease (AIMD): die Senderate wird additiv während congestion avoidance erhöht und multiplikativ bei Paketverlust verringert (halbiert!) Martin Mauve Universität Mannheim 46 Slowstart & Congestion Avoidance ohne Verluste Martin Mauve Universität Mannheim 47 Slowstart & Congestion Avoidance mit Verlusten Martin Mauve Universität Mannheim 48 TCP-Zusammenfassung TCP bietet eine gesicherte, verbindungsorientierte Übertragung von Byte-Stömen Verbindungsaufbau / -abbau Zuverlässigkeit durch acks / timeout / fast retransmit flow control durch Empfänger-Fenster congestion control durch cwnd (AIMD) Martin Mauve Universität Mannheim 49