# TCP CUBIC

TCP CUBIC ist ein Algorithmus zur Steuerung der Überlastkontrolle im Transmission Control Protocol (TCP). Er wurde entwickelt, um die Performance in sogenannten Long Fat Networks (LFN), also Netzwerken mit einem großen Produkt aus Bandbreite und Verzögerung, zu optimieren.
2006 wurde die erste CUBIC-Version in den Linux-Kernel aufgenommen. Seit Kernel Version 2.6.19 ist CUBIC der Standard TCP Überlastalgorithmus in Linux.
In MacOS ist CUBIC seit der OS X Yosemite Version integriert. Microsoft hat CUBIC seit dem Jahr 2017 in Windows 10 integriert.

## Überblick

In den klassischen TCP Varianten wie etwa TCP New Reno oder TCP Tahoe wird das Überlastfenster nach einem Überlastevent halbiert und dann schrittweise um 1 erhöht. Die Erhöhung um 1 erfolgt, wenn alle Pakete eines Überlastfensters erfolgreich versandt wurden. Gerade in LFN kann es aufgrund der hohen Verzögerung lange dauern, bis ein Fluss die zur Verfügung stehende Bandbreite wieder optimal ausnutzt. TCP BIC erhöht die Übertragungsrate durch binäre Suche deutlich stärker und kann sich so auch in LFN schnell dem Optimum annähern. TCP CUBIC baut darauf auf, indem die binäre Suche durch eine kubische Funktion approximiert wird. Dadurch steigert CUBIC die Effizienz bei der Berechnung. Außerdem wird das Wachstum des Überlastfensters weniger aggressiv gestaltet, um eine Fairness gegenüber Standard TCP zu erreichen.

## Algorithmus

Die im Folgenden beschriebene Funktionsweise von CUBIC folgt den Spezifikationen des RFC 8312. Manche Implementierungen weichen – insbesondere bei der Wahl der Konstanten – von diesem RFC ab.
Der CUBIC Algorithmus nutzt die folgenden Variablen und Konstanten zur Bestimmung des Sendefensters:
* w$_{max}$: die Fenstergröße beim letzten Überlastevent
* T: Vergangene Zeit seit dem letzten Überlastevent
* β: Multiplikativer Verkleinerungsfaktor
* C: Skalierungskonstante
Das Sendefenster (cwnd) wird durch folgende, namensgebende Funktion bestimmt:
$cwnd\ =\ C(T-K)^{3}+w_{max}$
wobei für K gilt:
$K={\sqrt[{3}]{\frac {w_{max}(1-\beta )}{C}}}$
In der Abbildung ist der typische Verlauf des CUBIC Überlastfensters zu erkennen. w$_{max}$ ist die Fenstergröße, bei der das letzte Überlastevent stattfand. Durch die Kubische Funktion nähert sich CUBIC in der Phase l schnell diesem Punkt an. In der Phase ll versucht CUBIC anschließend möglichst lange in der Nähe dieses Optimalen Punktes zu bleiben, um die Bandbreite möglichst optimal auszunutzen. Tritt kein Überlastevent auf, wechselt CUBIC in Phase III in eine exponentielle Wachstumsphase um die neue optimale Bandbreite im Netzwerk zu finden.

## Fairness gegenüber Standard TCP

Beim Design von CUBIC wurde darauf geachtet, fair gegenüber nebenläufigen TCP Flüssen mit Standard-Überlastalgorithmen zu sein. Optimiert wurde vor allem die Fairness gegenüber TCP New Reno, welches um 2000 im Internet dominant war.
Fairness wird vor allem durch die folgenden zwei Mechanismen erreicht.
In jeder Übertragungsrunde berechnet CUBIC, wie groß das durchschnittliche Sendefenster eines Standard TCP Algorithmus zum aktuellen Zeitpunkt ist. Dies kann analytisch schnell und effizient bestimmt werden. Ist die Fenstergröße von Standard TCP größer als die Fenstergröße von CUBIC, so wählt CUBIC die Fenstergröße des Standard TCP, um sich nicht selbst zu benachteiligen.
Außerdem hat CUBIC bei der Bestimmung des Sendefensters einen sogenannten Fast Convergence Modus. Dieser sorgt bei erkannter Überlast dafür, dass das Sendefenster stärker verringert wird um das neue faire Optimum schneller zu erreichen.