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:
- Neuübertragungstimeout (RTO läuft ab)
- 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
-
Initiale MTU: Einen konservativen Anfangswert verwenden (typischerweise 576 Bytes für IPv4, 1280 Bytes für IPv6)
-
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
-
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:
- Multi-Path-Unterstützung: Unabhängige Staukontrolle pro Pfad
- TCP-Freundlichkeit: Faire Aufteilung der Netzwerkbandbreite mit TCP
- Multi-Stream-Effizienz: Head-of-Line-Blocking vermeiden bei gleichzeitiger Aufrechterhaltung der Staukontrolle
- Pfadanpassung: Übertragung durch PMTU-Erkennung optimieren
Diese Mechanismen stellen sicher, dass SCTP Netzwerkressourcen effizient nutzen kann, während es fair mit anderem Verkehr koexistiert.