3.1. Slow Start und Congestion Avoidance
Die Slow-Start- und Congestion-Avoidance-Algorithmen MÜSSEN (MUST) von einem TCP-Sender verwendet werden, um die Menge an ausstehenden Daten zu kontrollieren, die ins Netzwerk eingefügt werden.
Zustandsvariablen
Um diese Algorithmen zu implementieren, werden zwei Variablen zum TCP-Pro-Verbindung-Zustand hinzugefügt:
- Staufenster (Congestion Window, cwnd): Eine senderseitige Begrenzung der Datenmenge, die der Sender ins Netzwerk übertragen kann, bevor er eine Bestätigung (ACK) erhält
- Angekündigtes Empfängerfenster (Receiver's Advertised Window, rwnd): Eine empfängerseitige Begrenzung der Menge ausstehender Daten
Das Minimum von cwnd und rwnd steuert die Datenübertragung.
Eine weitere Zustandsvariable, die Slow-Start-Schwelle (Slow Start Threshold, ssthresh), wird verwendet, um zu bestimmen, ob der Slow-Start- oder Congestion-Avoidance-Algorithmus zur Steuerung der Datenübertragung verwendet wird, wie unten diskutiert.
Zweck von Slow Start
Der Beginn der Übertragung in ein Netzwerk mit unbekannten Bedingungen erfordert, dass TCP das Netzwerk langsam sondiert, um die verfügbare Kapazität zu bestimmen, um zu vermeiden, das Netzwerk mit einem unangemessen großen Datenburst zu verstopfen. Der Slow-Start-Algorithmus wird zu diesem Zweck verwendet:
- Zu Beginn einer Übertragung
- Nach der Reparatur eines durch den Neuübertragungstimer erkannten Verlusts
Slow Start dient zusätzlich dazu, die "ACK-Uhr" zu starten, die der TCP-Sender verwendet, um Daten in den Slow-Start-, Congestion-Avoidance- und Verlusterholungsalgorithmen ins Netzwerk freizugeben.
Anfangsfenster (IW)
IW, der Anfangswert von cwnd, MUSS (MUST) unter Verwendung der folgenden Richtlinien als Obergrenze gesetzt werden:
Wenn SMSS > 2190 Bytes:
IW = 2 * SMSS Bytes und DARF NICHT mehr als 2 Segmente sein
Wenn (SMSS > 1095 Bytes) und (SMSS <= 2190 Bytes):
IW = 3 * SMSS Bytes und DARF NICHT mehr als 3 Segmente sein
Wenn SMSS <= 1095 Bytes:
IW = 4 * SMSS Bytes und DARF NICHT mehr als 4 Segmente sein
Wie in [RFC3390] spezifiziert, DÜRFEN (MUST NOT) der SYN/ACK und die Bestätigung des SYN/ACK die Größe des Staufensters nicht erhöhen. Ferner MUSS (MUST), wenn der SYN oder SYN/ACK verloren geht, das Anfangsfenster, das von einem Sender nach einem korrekt übertragenen SYN verwendet wird, ein Segment sein, das aus höchstens SMSS Bytes besteht.
Eine detaillierte Begründung und Diskussion der IW-Einstellung ist in [RFC3390] vorgesehen.
Anfangswert von ssthresh
Der Anfangswert von ssthresh SOLLTE (SHOULD) willkürlich hoch gesetzt werden (z.B. auf die Größe des größtmöglichen angekündigten Fensters), aber ssthresh MUSS (MUST) als Reaktion auf Stau reduziert werden.
Das Setzen von ssthresh so hoch wie möglich erlaubt den Netzwerkbedingungen, anstatt einer willkürlichen Host-Begrenzung, die Senderate zu diktieren.
Algorithmusauswahl
- Der Slow-Start-Algorithmus wird verwendet, wenn
cwnd < ssthresh - Der Congestion-Avoidance-Algorithmus wird verwendet, wenn
cwnd > ssthresh - Wenn
cwndundssthreshgleich sind, kann der Sender entweder Slow Start oder Congestion Avoidance verwenden
Slow-Start-Algorithmus
Während Slow Start erhöht ein TCP cwnd um höchstens SMSS Bytes für jedes empfangene ACK, das kumulativ neue Daten bestätigt. Slow Start endet, wenn:
- cwnd ssthresh überschreitet (oder optional, wenn es erreicht wird, wie oben erwähnt), oder
- Wenn Stau beobachtet wird
Empfohlene cwnd-Erhöhung
Während traditionell TCP-Implementierungen cwnd um genau SMSS Bytes beim Empfang eines ACK, das neue Daten abdeckt, erhöht haben, EMPFEHLEN (RECOMMEND) wir, dass TCP-Implementierungen cwnd erhöhen, gemäß:
cwnd += min (N, SMSS) (Gleichung 2)
wobei N die Anzahl der zuvor unbestätigten Bytes ist, die im eingehenden ACK bestätigt werden.
Diese Anpassung ist Teil von Appropriate Byte Counting [RFC3465] und bietet Robustheit gegen sich schlecht verhaltende Empfänger, die versuchen könnten, einen Sender dazu zu verleiten, cwnd künstlich aufzublähen, indem sie einen Mechanismus verwenden, der als "ACK-Teilung" [SCWA99] bekannt ist.
Congestion-Avoidance-Algorithmus
Während Congestion Avoidance wird cwnd um etwa 1 vollständiges Segment pro Round-Trip-Zeit (RTT) erhöht. Congestion Avoidance setzt sich fort, bis Stau erkannt wird.
Richtlinien für die Erhöhung von cwnd
Die grundlegenden Richtlinien für die Erhöhung von cwnd während Congestion Avoidance sind:
- KANN (MAY) cwnd um SMSS Bytes erhöhen
- SOLLTE (SHOULD) cwnd gemäß Gleichung (2) einmal pro RTT erhöhen
- DARF NICHT (MUST NOT) cwnd um mehr als SMSS Bytes erhöhen
Empfohlene Implementierung
Der EMPFOHLENE (RECOMMENDED) Weg, cwnd während Congestion Avoidance zu erhöhen, ist, die Anzahl der Bytes zu zählen, die durch ACKs für neue Daten bestätigt wurden. Wenn die Anzahl der bestätigten Bytes cwnd erreicht, kann cwnd um bis zu SMSS Bytes erhöht werden.
Beachten Sie, dass während Congestion Avoidance cwnd NICHT (MUST NOT) um mehr als SMSS Bytes pro RTT erhöht werden darf.
Alternative Formel
Eine andere häufige Formel, die ein TCP KANN (MAY) verwenden, um cwnd während Congestion Avoidance zu aktualisieren, ist in Gleichung (3) angegeben:
cwnd += SMSS*SMSS/cwnd (Gleichung 3)
Reaktion auf Verlust
Wenn ein TCP-Sender Segmentverlust mit dem Neuübertragungstimer erkennt und das gegebene Segment noch nicht durch den Neuübertragungstimer neu gesendet wurde, MUSS (MUST) der Wert von ssthresh auf nicht mehr als den in Gleichung (4) angegebenen Wert gesetzt werden:
ssthresh = max (FlightSize / 2, 2*SMSS) (Gleichung 4)
wobei, wie oben diskutiert, FlightSize die Menge an ausstehenden Daten im Netzwerk ist.
Ferner MUSS (MUST) bei einem Timeout (wie in [RFC2988] spezifiziert) cwnd auf nicht mehr als das Verlustfenster LW gesetzt werden, das gleich 1 vollständigem Segment ist (unabhängig vom Wert von IW).
Daher verwendet der TCP-Sender nach der Neuübertragung des verworfenen Segments den Slow-Start-Algorithmus, um das Fenster von 1 vollständigem Segment auf den neuen Wert von ssthresh zu erhöhen, an welchem Punkt Congestion Avoidance wieder übernimmt.