3. TCP Congestion Control
🔹 1. Grundlagen: TCP Congestion Control¶
Wichtige Definitionen:¶
Begriff | Erklärung |
---|---|
ACK-Ankunft (An) | Bestätigt den Empfang aller Segmente bis einschließlich n . |
FlightSize 1 | Anzahl noch nicht bestätigter Pakete nach Empfang der ACKs. |
FlightSize 2 | Anzahl unbestätigter Pakete nach dem Senden neuer Segmente. |
DupACKs | Anzahl identischer ACKs, die darauf hinweisen, dass ein Paket fehlt. |
ssthresh | Schwelle zwischen Slow Start und Congestion Avoidance. |
cwnd | Größe des Congestion Window (in Segmenten). |
Gesendete Segmente (Sn) | Welche neuen Datenpakete verschickt wurden. |
CA-Segment | Segment, das in der Congestion Avoidance Phase verwendet wird, um den Fortschritt zu markieren. |
TCP (Transmission Control Protocol) ist ein verbindungsorientiertes Protokoll, das Mechanismen zur Flusskontrolle und Überlastkontrolle (Congestion Control) verwendet. Die wichtigsten Phasen der TCP Congestion Control sind: | |
## 🔸 1. Slow Start (langsamer Start, aber schnelles Wachstum) |
❓Was ist das?¶
Die Slow Start-Phase ist die erste Phase im TCP Congestion Control-Mechanismus. Obwohl der Name "slow" klingt, wächst das Fenster hier exponentiell schnell.
⚙️ Wie funktioniert das?¶
- TCP startet mit einem kleinen Congestion Window (cwnd), z. B. 1 oder 3 Segmenten. In deiner Aufgabe:
cwnd = 3
. - Jedes Mal, wenn ein vollständiges Segment durch ein ACK bestätigt wird, wird
cwnd
um 1 erhöht pro ACK → weil jedes ACK einen Hinweis gibt, dass die Verbindung stabil ist. - Da mehrere ACKs in einem RTT eintreffen, verdoppelt sich cwnd pro RTT (exponentielles Wachstum):
📈 Beispiel:¶
RTT | Gesendete Segmente | empfangene ACKs | neuer cwnd |
---|---|---|---|
1 | S1, S2, S3 | ACK 4 | 6 |
2 | S4–S9 | ACK 10 | 12 |
3 | S10–S21 | ACK 21 | ... |
FlightSize = die Anzahl der gesendeten, aber noch nicht bestätigten Segmente.
🔸 2. ssthresh (Slow Start Threshold – Schwellenwert)¶
❓Was ist das?¶
ssthresh
ist der Schwellenwert, der zwischen Slow Start und Congestion Avoidance entscheidet.
- Initial:
ssthresh = ∞
(also kein Übergang → Start in Slow Start). - Wenn ein Verlust erkannt wird, wird
ssthresh
gesetzt auf die Hälfte voncwnd
. - Danach: Wenn
cwnd >= ssthresh
, dann wechselt TCP zur Congestion Avoidance.
🔁 Beispiel:¶
cwnd = 3
,ssthresh = ∞
→ TCP bleibt in Slow Start.- Nach Verlust (z. B. Timeout),
ssthresh = cwnd / 2 = 3 / 2 ≈ 1.5 → 1
- Dann beginnt TCP bei
cwnd = 1
, wächst wieder.
🔸 3. Congestion Avoidance (Stauvermeidung)¶
❓Was ist das?¶
In dieser Phase ist TCP vorsichtiger – kein exponentielles Wachstum mehr, sondern lineares Wachstum.
⚙️ Wie funktioniert das?¶
- Pro vollständigem RTT erhöht sich
cwnd
nur um 1 Segment. - Motivation: Verbindung stabilisieren, ohne das Netz zu überlasten.
📈 Beispiel:¶
RTT | cwnd vor ACK | ACKs erhalten | cwnd danach |
---|---|---|---|
5 | 10 | ACKs für alle | 11 |
6 | 11 | ACKs | 12 |
Man spricht hier von „Additive Increase“.
🔸 4. Verlust-Erkennung in TCP¶
TCP erkennt Verluste nicht direkt, sondern indirekt über das Verhalten der ACKs. - Kein ACK (auch keine DupACKs) → Timeout → cwnd wird zurückgesetzt → Rückkehr in Slow Start - Erkennt Timeout nach 10 RTT
- 3x DupACK → Paketverlust vermutet → Fast Retransmit + Fast Recovery → Übergang in Congestion Avoidance (kein Neustart)
- Erkennt Package Loss wegen DUP ACK
🛑 (a) Triple Duplicate ACKs – schnelles Eingreifen¶
❓Was ist das?¶
Wenn ein Segment fehlt, aber darauffolgende Segmente ankommen, sendet der Empfänger wiederholt denselben ACK (weil das letzte korrekt empfangene Segment noch nicht komplett bestätigt wurde).
⚙️ Was passiert?¶
- Nach 3 gleichen (Duplikat-)ACKs → Fast Retransmit: Das vermisste Segment wird sofort neu gesendet.
- TCP vermutet: Netz ist leicht überlastet → reagiert moderat:
📌 Regel:¶
ssthresh = cwnd / 2
cwnd = ssthresh + 3
→ „Fast Recovery“- Dann geht es in Congestion Avoidance über (nicht zurück zu Slow Start).
📦 Beispiel:¶
- S1–S6 werden gesendet.
- S3 geht verloren.
- Empfänger erhält S4–S6, aber hat S3 nicht → sendet 3x
ACK3
. - Sender sieht 3 DupACKs → Fast Retransmit von S3.
- Setzt:
ssthresh = cwnd / 2
,cwnd = ssthresh + 3
⏱️ (b) Timeout (Retransmission Timeout – harter Verlust)¶
❓Was ist das?¶
Wenn ein ACK gar nicht ankommt (auch kein Duplicate ACK), nimmt TCP an: Segment ging verloren UND kein Folgepaket kam durch.
Das ist schlimmer als 3 DupACKs.
⚙️ Was passiert?¶
- Nach 10 RTTs ohne ACK → Timeout.
- TCP geht davon aus: starke Überlast.
- Reaktion: aggressiv reduzieren
📌 Regel:¶
ssthresh = cwnd / 2
cwnd = 1
→ zurück zu Slow Start
📦 Beispiel:¶
- cwnd = 8 → S1–S8 gesendet.
- S5, S6, S7 verloren → kein ACK mehr.
- Nach 10 RTTs → Timeout
-
Reaktion:
ssthresh = 8 / 2 = 4
cwnd = 1
-
TCP beginnt erneut mit Slow Start (exponentielles Wachstum ab 1).
🟢 Aber: Die Verbindung bleibt offen – TCP versucht weiter, die bestehende Verbindung aufrechtzuerhalten.
🛑 2. Wann wird die Verbindung endgültig beendet?¶
TCP hat keine harte Regel wie „1 Timeout → Verbindung tot“.
ABER: Wenn mehrere aufeinanderfolgende Timeouts passieren und auch dann keine Reaktion vom Empfänger kommt, wird die Verbindung irgendwann abgebrochen.
⚙️ Dafür gibt es sogenannte:¶
- Max Retransmission Count oder
- Maximum Segment Lifetime (MSL) oder
- Keepalive-Zeiten (optional)
Wenn diese Schwellen überschritten sind → TCP schließt die Verbindung mit einem Reset (RST) oder Timeout-Abbruch.
⚙️ Was passiert bei 3 DupACKs – Schritt für Schritt¶
Schritt | Erklärung |
---|---|
1 | TCP empfängt 3 DupACKs für z. B. ACK 3 |
2 | Fast Retransmit: TCP sendet verlorenes Segment neu (z. B. S3) |
3 | Fast Recovery beginnt:→ ssthresh = cwnd / 2 → cwnd = ssthresh + 3 |
4 | Für weitere DupACKs (z. B. ACK3, ACK3, …): cwnd += 1 pro DupACK (nur wenn sie kommen!) |
5 | Wenn ein echtes ACK die Lücke schließt (z. B. ACK6):→ cwnd = ssthresh → TCP geht in Congestion Avoidance |
📌 Wichtig:
Fast Retransmit + Fast Recovery gehören immer zusammen
→ "Fast Retransmit" ist die Aktion (sende Paket neu),
"Fast Recovery" ist die Reaktion (Fenster neu berechnen)
Ereignis | Verhalten |
---|---|
3 DupACKs | Fast Retransmit + Fast Recovery → bleib in Congestion Avoidance |
Timeout | ssthresh = cwnd / 2 , cwnd = 1 → zurück zu Slow Start |