TCP flow control, congestion avoidance

Transcription

TCP flow control, congestion avoidance
TCP flow control, congestion avoidance
Einleitende Worte:
Zunächst einmal, warum lohnt es sich TCP auf zwei Vorträge aufzuteilen?
Im ersten Vortrag haben wir gehört, wie TCP aufgebaut ist und wie es arbeitet.
Ganz am Ende wurde erwähnt, das TCP (fast) perfekt ist. Die Betonung liegt
hierbei auf fast. In der Vergangenheit wurde einfach nur drauf los gesendet. Bald
hat man erkannt das dies zu Problemen, sprich Datenstau führt.
Warum dies der Fall ist und wie man das verhindern kann, erörtern wir in folgendem Vortrag.
Ergänzung: Sliding Window
Letzte Woche haben wir unteranderem das Sliding Window -Prinzip kennengelernt.
Hierzu ist nur noch folgende, kleine Ergänzung zu machen. Das Sliding Window
besteht nicht nur aus 2 Pointern, sondern aus 3. Dieser dritte Pointer dient als
Grenze zwischen den schon gesendeten und den noch zu sendenden Octets und
befindet sich somit im Window selber. Auf Grund dessen weiß der Sender immer,
was schon gesendet ist und was nicht. Dies dient insofern zur Sicherheit, dass das
Window nicht weiter als die schon gesendeten Pakete rücken kann und somit Daten vergessen werden.
Als Beispiel hierfür:
• Die Octets 1-2 wurden versand und bestätigt
• Octet 3-6 wurden gesendet, aber noch nicht bestätigt
1
• 7-9 wurden noch nicht gesendet, werden es aber ohne Verzögerung
• 10-... können erst gesendet werden, wenn das Fenster verschoben wurde
Da TCP die Octest ohne Verzögerung versendet, rückt diese Trennung schnell nach
rechts.
Ergänzung: Delayed Acknowledgements
ACKs werden nicht immer dirket versendet. Das TCP wartet bis zu 200ms mit
dem Versenden damit ggf. noch weitere Daten (ACKs) in einem ACK versendet
werden können. Die 200ms werden durch einen Timer angegeben, der beim Kernelstart gestartet wird. Somit beträgt die Wartezeit nicht immer genau 200ms.
Dies bewirkt, dass nicht so viel Traffic entsteht und somit potentielle Congestions
vermieden werden.
In einem Beispiel sind Zeiten von 42.0 bis 195.8ms aufgekommen. Dies kommt daher, dass der Timer nicht gestartet wird, wenn ein Paket angekommen ist, sondern
relativ zum KernelBoot läuft. Die Gesammzeit ist größer als 200ms, da sie von
einem fixen Punkt ausgeht.
Ergänzung zum letzten Vortrag:
Der Timer wird beim Kernelstart gestartet, nicht beim Empfang des ersten Paketes. Somit beträgt die Zeitverzögerung zwischen 1-200ms.
Das selbe Phänomen haben wir beim Timeout gesehen. Hier beträgt der Timer
500ms relativ zum KernelBoot.
Nagle Algorithm
(RFC 896 [Nagle 1984])
Der Nagle-Algorithm ist eine andere Lösung um unnötige Acknowledgements/Congestion
zu vermeiden.
Der Nagle-Algorithm verhindert das Verschicken 41byte großer Pakete. Dies ist bei
langsameren Netzwerken sehr nützlich und entlastet den Daten-Traffic.
Das Prinzip ist sehr einfach. Wird ein Paket vom Sender verschickt wartet dieser solange mit dem verschicken des nächsten Paket, bis das ausstehende ASK
empfangen wurde. Somit werden ggf. angefallene 41byte-Pakete gesammelt und
zusammen verschickt.
2
Ab und an macht es aber Sinn den Nagle-Algorithm auszuschalten, z.B. bei XWindow. Hier will man, dass die Mausbewegung in “Echtzeit”übertragen wird, sowie beim Drücken einer Funktionstaste. (Erinnerung: eine Funktionstaste braucht
3bytes) Durch den Nagel-Algorithm wird dieses verzögert.
Slow Start
Slow Start bestimmt die Größe des Sliding Window, also wie viele Pakete aufeinmal gesendet werden. Hierzu benutzt es das Congestion Window (cwnd ), welches
die Anzahl der gleichzeitig zu schickenden Pakete angibt. Das cwnd wird mit 1
initialisiert und bei Ankunft des ACKs für das erste Paket auf 2 erhöht. Kommen
auch die beiden ACKs für die nächsten Pakete an, so wird es auf 4 erhöht. Das
cwnd erfährt also durch Slow Start eine exponentielle Steigerung.
Congestion Avoidance
Da der Anteil am Paketverlust durch Beschädigung weniger als 1% beträgt ist es
wichtig, die größte aller Verlustursachen, den Paketverlust durch Datenstau und
einfaches Wegwerfen des Paketes auf Serverseite zu verhindern. Da Slow Start das
cwnd exponentiell steigert kann es sehr schnell zu hohen Senderaten kommen, mit
denen viele Server im Internet einfach nicht fertig werden, deshalb greift hier Congestion Avoidance ein.
Congestion Avoidance und Slow Start sind zwei verschiedene Algorithmen, jedoch
wird Congestion Avoidance eingesetzt, um Slow Start “im Zaum“ zu halten, deshalb werden beide immer zusammen implementiert.
Congestion Avoidance benötigt zusätzlich zum cwnd auch noch das Slow Start
threshold size (ssthresh). Wenn eine Verstopfung auftritt, so wird im ssthresh die
Hälfte der Paketanzahl gespeichert, die zu einer Verstopfung geführt hat und das
cwnd wird auf 1 gesetzt. Dann übernimmt Slow Start wieder die Steigerung der
Paketanzahl, wie oben beschrieben. Wenn nun das cwnd die gleiche Menge an Paketen angibt die das ssthresh gespeichert hat, übernimmt Congestion Avoidance.
Nun wird die Anzahl der Pakete bei jeder Rount-Trip Time nur um 1/cwnd, aber
mindestens um 1 Paket gesteigert.
Round Trip Time
Die RTT ist eine für TCP fundamentale Funktion denn sie hilft dabei sinnvolle
Entscheidungen zu treffen, ob ein Paket nun wirklich verloren gegangen ist oder ob
nur das ACK noch unterwegs ist und verhindert somit unnötige Retransmissions.
Die RTT wird beim ersten Paket gemessen und dann durch einen Formel in eine
geschätze Zeit umgewandelt, die eventuelle Routenänderungen einkalkuliert. Die
3
RTT wird mit jedem ankommenden ACK neu berechnet, wobei die neu berechnete
Zeit zu 10% mit in die Berechnung für die gesamt Zeit eingeht. Die RTT wird nach
folgender Formel berechnet:
R ← αR + (1 − α) · M
R gibt die geschätzte gesamt RTT an, M ist die gemessene RTT und α ist ein
Glättungsfaktor, der empfohlenerweise immer bei 0,9 liegen sollte.
Silly Window Syndrom
Das SWS ist ein Fehler, der sehr schön demonstriert was alles passieren kann,
wenn man einfach drauf los sendet, so wie es früher geschehen ist als diese ganzen
hilfreichen Algorithmen noch nicht implementiert waren. Das SWS zeichnet sich
dadurch aus, dass der Empfänger immer wieder ein Datenfenster von einem Byte
angibt und so der Sender auch immer wieder 41 Byte Pakte verschickt. Auf der
anderen Seite kann aber auch der Sender von sich aus 41 Byte Pakete versenden,
wenn er einfach jeden Tastendruck sofort an den Empfänger übermittelt. Rechnet
man nun noch die ganzen ACKs hinzu, so kommt man auf eine beträchtliche Anzahl von Paketen, die hin und her geschickt werden und so ganze Netze überlasten
können.
Quellen:
• W. Richard Stevens: TCP/IP Illustrated, Vol.1
• Douglas E. Comer: Internetworking with TCP/IP, Vol.1
4

Documents pareils