Skip to content

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?

s‍sthresh 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 von cwnd.
  • 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-)ACKsFast 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:

  1. S1–S6 werden gesendet.
  2. S3 geht verloren.
  3. Empfänger erhält S4–S6, aber hat S3 nicht → sendet 3x ACK3.
  4. Sender sieht 3 DupACKs → Fast Retransmit von S3.
  5. 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:

  1. cwnd = 8 → S1–S8 gesendet.
  2. S5, S6, S7 verloren → kein ACK mehr.
  3. Nach 10 RTTs → Timeout
  4. Reaktion:

    • ssthresh = 8 / 2 = 4
    • cwnd = 1
  5. 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 / 2cwnd = 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