TCP-Zuverlässigkeitstransport
Wir alle kennen das TCP-Protokoll als zuverlässiges Transportprotokoll, aber wie genau gewährleistet es die Zuverlässigkeit des Transports?
Für eine zuverlässige Übertragung müssen zahlreiche Faktoren berücksichtigt werden, darunter Datenbeschädigung, Datenverlust, Duplikation und fehlerhafte Shard-Reihenfolge. Können diese Probleme nicht gelöst werden, ist eine zuverlässige Übertragung nicht möglich.
Um eine zuverlässige Übertragung zu gewährleisten, verwendet TCP daher Mechanismen wie Sequenznummern, Bestätigungsantworten, Wiederholungssteuerung, Verbindungsmanagement und Fenstersteuerung.
In diesem Artikel konzentrieren wir uns auf das Gleitfenster, die Flusssteuerung und die Staukontrolle von TCP. Der Mechanismus der erneuten Übertragung wird im nächsten Abschnitt separat behandelt.
Netzwerkflusssteuerung
Netzwerkflusssteuerung, auch bekannt als Netzwerkverkehrssteuerung, ist Ausdruck des komplexen Zusammenspiels zwischen Produzenten und Konsumenten. Dieses Szenario ist Ihnen im Berufsalltag oder in Vorstellungsgesprächen sicher schon oft begegnet. Übersteigt die Produktionskapazität des Produzenten die Konsumkapazität des Konsumenten deutlich, wächst die Warteschlange unaufhörlich. Im schlimmsten Fall kann ein zu großer Nachrichtenstau bei RabbitMQ die Leistung des gesamten MQ-Servers erheblich beeinträchtigen. Ähnliches gilt für TCP: Wird die Netzwerkflusssteuerung nicht reguliert, gelangen zu viele Nachrichten ins Netzwerk, die Konsumenten überschreiten ihre Kapazität, während die Produzenten weiterhin doppelte Nachrichten senden, was die Netzwerkleistung stark beeinträchtigt.
Um diesem Phänomen zu begegnen, bietet TCP einen Mechanismus, mit dem der Sender die zu sendende Datenmenge anhand der tatsächlichen Empfangskapazität des Empfängers steuern kann. Dies wird als Flusssteuerung bezeichnet. Der Empfänger verwaltet ein Empfangsfenster, während der Sender ein Sendefenster verwaltet. Es ist wichtig zu beachten, dass diese Fenster nur für eine einzelne TCP-Verbindung gelten und nicht alle Verbindungen ein gemeinsames Fenster nutzen.
TCP steuert den Datenfluss mithilfe eines Empfangsfensters. Dieses Empfangsfenster gibt dem Sender Auskunft darüber, wie viel Cache-Speicherplatz noch verfügbar ist. Der Sender steuert die zu sendende Datenmenge entsprechend der tatsächlichen Aufnahmekapazität des Empfängers.
Der Empfänger teilt dem Sender die maximal empfangbare Datenmenge mit, und der Sender sendet bis zu dieser Grenze. Diese Grenze entspricht der Empfangsfenstergröße (siehe TCP-Header). Dort gibt es ein Empfangsfensterfeld, das die Anzahl der Bytes angibt, die der Empfänger empfangen kann oder möchte.
Der sendende Host sendet regelmäßig ein Fenster-Testpaket, um zu prüfen, ob der empfangende Host noch Daten empfangen kann. Wenn der Puffer des Empfängers überzulaufen droht, wird die Fenstergröße verkleinert, um den Sender anzuweisen, die zu sendende Datenmenge zu reduzieren.
Hier ist ein Netzwerkflussdiagramm:
Netzwerküberlastungskontrolle
Bevor wir uns mit der Staukontrolle befassen, müssen wir verstehen, dass es neben dem Empfangs- und Sendefenster auch ein Staufenster gibt. Dieses dient hauptsächlich dazu, die Frage zu beantworten, mit welcher Datenrate der Sender Daten an das Empfangsfenster sendet. Daher wird auch das Staufenster vom TCP-Sender verwaltet. Wir benötigen einen Algorithmus, der die optimale Datenmenge für den Versand bestimmt, da sowohl zu wenig als auch zu viel Daten nicht optimal sind. Daher kommt das Konzept des Staufensters zum Einsatz.
Bei der bisherigen Netzwerkflusssteuerung haben wir verhindert, dass der Sender den Cache des Empfängers mit Daten füllt. Wir wussten jedoch nicht, was im Netzwerk vor sich ging. Computernetzwerke befinden sich typischerweise in einer gemeinsam genutzten Umgebung. Daher kann es aufgrund der Kommunikation zwischen anderen Hosts zu Netzwerküberlastungen kommen.
Bei Netzwerküberlastung und dem fortgesetzten Senden einer großen Anzahl von Datenpaketen kann es zu Problemen wie Verzögerungen und Paketverlusten kommen. TCP sendet die Daten dann erneut, was die Netzwerklast jedoch erhöht und somit zu größeren Verzögerungen und mehr Paketverlusten führt. Dadurch kann ein Teufelskreis entstehen, der sich immer weiter verschärft.
TCP kann daher die Vorgänge im Netzwerk nicht ignorieren. Bei Netzwerküberlastung reduziert TCP die Menge der gesendeten Daten, um die Sicherheit zu gewährleisten.
Daher wird eine Staukontrolle vorgeschlagen, die verhindern soll, dass das gesamte Netzwerk mit Daten des Senders überlastet wird. Um die vom Sender zu sendende Datenmenge zu regulieren, definiert TCP das sogenannte Staufenster. Der Staukontrollalgorithmus passt die Größe des Staufensters entsprechend der Netzwerkauslastung an, um so die vom Sender zu sendende Datenmenge zu begrenzen.
Was ist ein Stauungsfenster? Was hat das mit dem Sendefenster zu tun?
Das Stauungsfenster ist eine vom Sender verwaltete Zustandsvariable, die die Datenmenge bestimmt, die der Sender senden kann. Das Stauungsfenster ändert sich dynamisch entsprechend der Netzwerkauslastung.
Das Sendefenster ist eine zwischen Sender und Empfänger vereinbarte Fenstergröße, die angibt, wie viele Daten der Empfänger empfangen kann. Sendefenster und Staufenster hängen zusammen; das Sendefenster entspricht üblicherweise dem kleineren Wert von Stau- und Empfangsfenster, d. h. swnd = min(cwnd, rwnd).
Das Staufenster cwnd ändert sich wie folgt:
Wenn keine Netzwerküberlastung vorliegt, d. h. kein Timeout für erneute Übertragungen auftritt, erhöht sich das Überlastungsfenster.
Bei einer Überlastung des Netzwerks verringert sich das Überlastungsfenster.
Der Absender ermittelt die Netzwerküberlastung, indem er prüft, ob das ACK-Bestätigungspaket innerhalb der vorgegebenen Zeit empfangen wird. Erhält der Absender das ACK-Bestätigungspaket nicht innerhalb der vorgegebenen Zeit, wird von einer Netzwerküberlastung ausgegangen.
Neben dem Stauungsfenster ist es nun an der Zeit, den TCP-Stauungskontrollalgorithmus zu besprechen. Der TCP-Stauungskontrollalgorithmus besteht aus drei Hauptteilen:
Langsamer Start:Anfangs ist das Stauungsfenster cwnd relativ klein, und der Sender vergrößert das Stauungsfenster exponentiell, um sich schnell an die Kapazität des Netzwerks anzupassen.
Vermeidung von Staus:Sobald das Stauungsfenster einen bestimmten Schwellenwert überschreitet, erhöht der Sender das Stauungsfenster linear, um die Wachstumsrate des Stauungsfensters zu verlangsamen und eine Überlastung des Netzwerks zu vermeiden.
Schnelle Erholung:Im Falle einer Überlastung halbiert der Sender das Überlastungsfenster und wechselt in den Schnellwiederherstellungszustand, um den Ort der Netzwerkwiederherstellung anhand der empfangenen doppelten Bestätigungen zu ermitteln, und erhöht dann das Überlastungsfenster wieder.
Langsamer Start
Beim Aufbau einer TCP-Verbindung wird das Staufenster (cwnd) zunächst auf einen minimalen MSS-Wert (Maximum Segment Size) gesetzt. Dadurch beträgt die anfängliche Senderate etwa MSS/RTT Bytes/Sekunde. Die tatsächlich verfügbare Bandbreite ist üblicherweise deutlich größer als MSS/RTT, daher versucht TCP, die optimale Senderate zu finden, was durch einen langsamen Start erreicht werden kann.
Im Slow-Start-Prozess wird der Wert des Staufensters (cwnd) auf 1 MSS initialisiert. Jedes Mal, wenn ein übertragenes Paketsegment bestätigt wird, erhöht sich der Wert von cwnd um ein MSS, sodass er 2 MSS beträgt. Anschließend verdoppelt sich der Wert von cwnd nach jeder erfolgreichen Übertragung eines Paketsegments usw. Der genaue Ablauf ist in der folgenden Abbildung dargestellt.
Die Senderate kann jedoch nicht unbegrenzt steigen; das Wachstum muss irgendwann enden. Wann also endet der Anstieg der Senderate? Beim Slow-Start wird der Anstieg der Senderate typischerweise auf eine von mehreren Arten beendet:
Der erste Fall betrifft Paketverluste während des Slow-Start-Prozesses. Tritt ein Paketverlust auf, setzt TCP das Congestion Window (cwnd) des Senders auf 1 und startet den Slow-Start-Prozess neu. Dabei kommt der Slow-Start-Schwellenwert ssthresh zum Einsatz, dessen Anfangswert der Hälfte des cwnd-Wertes entspricht, der den Paketverlust verursacht. Das heißt, bei erkannter Überlastung beträgt der Wert von ssthresh die Hälfte des Fensterwerts.
Die zweite Möglichkeit besteht darin, den Wert des Slow-Start-Schwellenwerts `ssthresh` direkt zu korrelieren. Da der Wert von `ssthresh` die Hälfte des Fensterwerts bei Erkennung einer Überlastung beträgt, kann es bei jeder Verdopplung des Fensterwerts zu Paketverlusten kommen, wenn `cwnd` größer als `ssthresh` ist. Daher ist es am besten, `cwnd` auf `ssthresh` zu setzen. Dadurch wechselt TCP in den Staukontrollmodus und beendet den Slow-Start.
Die letzte Möglichkeit, wie der Slow Start enden kann, besteht darin, dass TCP bei Erkennung von drei redundanten ACKs eine schnelle Neuübertragung durchführt und in den Wiederherstellungszustand wechselt. (Falls nicht klar ist, warum es drei ACK-Pakete gibt, wird dies im Abschnitt zum Neuübertragungsmechanismus separat erläutert.)
Stauvermeidung
Wenn TCP in den Staukontrollzustand wechselt, wird cwnd auf die Hälfte des Stauschwellenwerts ssthresh gesetzt. Das bedeutet, dass sich der Wert von cwnd nicht bei jedem Empfang eines Paketsegments verdoppeln kann. Stattdessen wird ein relativ konservativer Ansatz verfolgt, bei dem der Wert von cwnd nach jeder abgeschlossenen Übertragung nur um eine MSS (maximale Paketsegmentlänge) erhöht wird. Selbst wenn beispielsweise 10 Paketsegmente bestätigt werden, erhöht sich der Wert von cwnd nur um eine MSS. Dies ist ein lineares Wachstumsmodell mit einer Obergrenze. Bei Paketverlust wird der Wert von cwnd auf eine MSS geändert und der Wert von ssthresh auf die Hälfte von cwnd gesetzt. Alternativ wird das Wachstum von MSS gestoppt, sobald drei redundante ACK-Antworten empfangen wurden. Werden nach der Halbierung des Wertes von cwnd immer noch drei redundante ACKs empfangen, wird der Wert von ssthresh als die Hälfte des Wertes von cwnd gespeichert und der schnelle Wiederherstellungszustand aktiviert.
Schnelle Erholung
Im Fast-Recovery-Zustand wird der Wert des Stauungsfensters (cwnd) für jede empfangene redundante ACK (d. h. jede ACK, die nicht in der richtigen Reihenfolge eintrifft) um ein MSS erhöht. Dadurch werden die bereits erfolgreich übertragenen Paketsegmente im Netzwerk optimal genutzt, um die Übertragungseffizienz bestmöglich zu steigern.
Wenn eine Bestätigung (ACK) für das verlorene Paketsegment eintrifft, verringert TCP den Wert von cwnd und wechselt in den Stauvermeidungsmodus. Dies dient dazu, die Größe des Staufensters zu kontrollieren und eine weitere Verschlimmerung der Netzwerküberlastung zu verhindern.
Tritt nach dem Staukontrollzustand ein Timeout auf, verschlechtert sich die Netzwerklage, und TCP wechselt vom Stauvermeidungszustand in den Slow-Start-Zustand. In diesem Fall wird der Wert des Staufensters (cwnd) auf 1 MSS (die maximale Paketsegmentlänge) und der Wert des Slow-Start-Schwellenwerts (ssthresh) auf die Hälfte von cwnd gesetzt. Dadurch wird die Größe des Staufensters nach der Wiederherstellung des Netzwerks schrittweise wieder erhöht, um Übertragungsrate und Netzwerküberlastung auszugleichen.
Zusammenfassung
Als zuverlässiges Transportprotokoll gewährleistet TCP die zuverlässige Übertragung durch Sequenznummern, Bestätigungen, Wiederholungsübertragungskontrolle, Verbindungsmanagement und Fenstersteuerung. Die Flusssteuerung regelt die vom Sender gesendete Datenmenge entsprechend der tatsächlichen Empfangskapazität des Empfängers und vermeidet so Netzwerküberlastung und Leistungseinbußen. Die Staukontrolle verhindert Netzwerküberlastung durch Anpassung der vom Sender gesendeten Datenmenge. Die Konzepte des Staufensters und des Sendefensters sind eng miteinander verbunden; die Datenmenge beim Sender wird durch dynamische Anpassung der Größe des Staufensters gesteuert. Langsamer Start, Stauvermeidung und schnelle Wiederherstellung sind die drei Hauptbestandteile des TCP-Staukontrollalgorithmus. Dieser passt die Größe des Staufensters mithilfe verschiedener Strategien an die Kapazität und den Auslastungsgrad des Netzwerks an.
Im nächsten Abschnitt werden wir den Wiederholungsmechanismus von TCP genauer untersuchen. Dieser Mechanismus ist ein wichtiger Bestandteil von TCP, um eine zuverlässige Übertragung zu gewährleisten. Er stellt die zuverlässige Datenübertragung sicher, indem verlorene, beschädigte oder verspätete Daten erneut gesendet werden. Das Implementierungsprinzip und die Strategie des Wiederholungsmechanismus werden im nächsten Abschnitt ausführlich vorgestellt und analysiert. Bleiben Sie dran!
Veröffentlichungsdatum: 24. Februar 2025

