Zum Hauptinhalt springen

7. Staukontrolle (Congestion Control)

SCTP verwendet Staukontrollmechanismen ähnlich wie TCP, um Netzwerkstaus zu vermeiden und eine faire Aufteilung der Netzwerkressourcen sicherzustellen.

7.1. SCTP-Unterschiede zur TCP-Staukontrolle (SCTP Differences from TCP Congestion Control)

Obwohl die Staukontrolle von SCTP auf TCP-Mechanismen basiert, gibt es folgende wichtige Unterschiede:

7.1.1. Multi-Homing und Multi-Path

SCTP unterstützt Multi-Homed-Endpunkte, wobei jede Ziel-Transportadresse unabhängige Staukontrollparameter verwaltet:

  • cwnd pro Ziel: Jeder Pfad hat sein eigenes Staufenster
  • ssthresh pro Ziel: Jeder Pfad hat seine eigene Slow-Start-Schwelle
  • RTO pro Ziel: Jeder Pfad hat sein eigenes Neuübertragungstimeout

Dies ermöglicht SCTP, Staukontrolle auf verschiedenen Pfaden unabhängig durchzuführen.

7.1.2. TSN-basierte Bestätigung

SCTP verwendet TSNs anstelle von Byte-Sequenznummern für Bestätigungen. Das bedeutet:

  • Staufenster wird in Bytes verwaltet
  • SACK bestätigt TSN-Bereiche
  • cwnd-Updates basieren auf bestätigten Bytes, nicht auf TSN-Anzahl

7.1.3. Multi-Stream-Übertragung

Die mehreren Streams von SCTP teilen die Staukontrollparameter derselben Assoziation. Es gibt keine separate Staukontrolle zwischen Streams, was Folgendes gewährleistet:

  • Alle Streams teilen die Bandbreite fair
  • Verhindert, dass ein einzelner Stream Ressourcen monopolisiert

7.2. SCTP Slow-Start und Stauungsvermeidung (SCTP Slow-Start and Congestion Avoidance)

Der Staukontrollalgorithmus von SCTP folgt den Slow-Start- und Stauungsvermeidungsprinzipien von TCP.

7.2.1. Initialisierung und Neustart

Wenn eine Assoziation zum ersten Mal etabliert wird oder ein Pfad nach Inaktivität neu startet:

cwnd = min(4*MTU, max(2*MTU, 4380 Bytes))
ssthresh = a_rwnd des Peers

Hinweis: Die Berechnung des initialen cwnd stellt sicher, dass mindestens 2 vollständige Pakete gesendet werden können, aber nicht mehr als 4 MTU-große Pakete.

7.2.2. Slow-Start-Phase

Während des Slow Start (cwnd <= ssthresh):

Wenn ein SACK für neue Daten empfangen wird:

cwnd = cwnd + min(bestätigte Bytes, MTU)

Regeln:

  • cwnd erhöht sich jeweils um höchstens eine MTU
  • Nur erhöhen, wenn alle bestätigten Daten unter dem aktuellen cwnd gesendet wurden
  • Wenn cwnd ssthresh erreicht oder überschreitet, in Stauungsvermeidungsphase eintreten

7.2.3. Stauungsvermeidungsphase

Wenn cwnd > ssthresh:

Verwendung von Appropriate Byte Counting (ABC):

Pro RTT:
partial_bytes_acked = partial_bytes_acked + bestätigte Bytes

Wenn partial_bytes_acked >= cwnd:
cwnd = cwnd + MTU
partial_bytes_acked = partial_bytes_acked - cwnd

Ziel: cwnd um etwa 1 MTU pro RTT erhöhen.

7.2.4. Stauungserkennung und -reaktion

Signale für Stauung:

  1. Neuübertragungstimeout (RTO läuft ab)
  2. Fast Retransmit (4 doppelte SACKs empfangen)

Reaktion auf RTO-Timeout:

ssthresh = max(cwnd/2, 4*MTU)
cwnd = 1*MTU
partial_bytes_acked = 0

Reaktion auf Fast Retransmit:

ssthresh = max(cwnd/2, 4*MTU)
cwnd = ssthresh
partial_bytes_acked = 0

7.2.5. Behandlung nach Ruhezeit

Wenn ein Ziel für eine RTO-Zeitspanne keine Datenübertragung hat (inaktiv):

Option 1 (Empfohlen):

cwnd = max(cwnd/2, 4*MTU)

Option 2 (Konservativ):

cwnd = min(4*MTU, max(2*MTU, 4380 Bytes))

Dies verhindert das plötzliche Senden großer Datenmengen nach einer langen Ruhezeit.

7.3. Pfad-MTU-Erkennung (Path MTU Discovery)

SCTP-Endpunkte SOLLTEN Pfad-MTU-Erkennung verwenden (Packetization Layer PMTUD wie in [RFC4821] definiert), um:

  • Die maximal verfügbare MTU zum Ziel zu bestimmen
  • IP-Fragmentierung zu vermeiden
  • Die Datenübertragungseffizienz zu optimieren

7.3.1. PMTU-Erkennungsprozess

  1. Initiale MTU: Einen konservativen Anfangswert verwenden (typischerweise 576 Bytes für IPv4, 1280 Bytes für IPv6)

  2. Größere MTU testen:

    • Pakete mit gesetztem "Don't Fragment"-Flag senden
    • Bei Erfolg größere MTU versuchen
    • Bei Fehler (ICMP "Packet Too Big" empfangen), kleinere MTU verwenden
  3. Periodisches Neuerkennen: Periodisch größere MTU versuchen, um sich an Pfadänderungen anzupassen

7.3.2. Auswirkungen von MTU-Updates auf Staukontrolle

Wenn PMTU zunimmt:

cwnd = (cwnd / alte_MTU) * neue_MTU
ssthresh = (ssthresh / alte_MTU) * neue_MTU

Wenn PMTU abnimmt:

cwnd = (cwnd / alte_MTU) * neue_MTU
ssthresh = (ssthresh / alte_MTU) * neue_MTU
partial_bytes_acked = min(partial_bytes_acked, cwnd)

Dies stellt sicher, dass Staukontrollparameter eine konsistente Beziehung zur MTU-Größe beibehalten.

7.3.3. Fehlerbehandlung

Wenn PMTU-Erkennung fehlschlägt oder nicht verfügbar ist:

  • Konservativen MTU-Wert verwenden
  • "Don't Fragment"-Flag nicht verwenden
  • IP-Schicht Fragmentierung durchführen lassen

Zusammenfassung

Das Staukontrolldesign von SCTP berücksichtigt folgende Schlüsselfaktoren:

  1. Multi-Path-Unterstützung: Unabhängige Staukontrolle pro Pfad
  2. TCP-Freundlichkeit: Faire Aufteilung der Netzwerkbandbreite mit TCP
  3. Multi-Stream-Effizienz: Head-of-Line-Blocking vermeiden bei gleichzeitiger Aufrechterhaltung der Staukontrolle
  4. Pfadanpassung: Übertragung durch PMTU-Erkennung optimieren

Diese Mechanismen stellen sicher, dass SCTP Netzwerkressourcen effizient nutzen kann, während es fair mit anderem Verkehr koexistiert.