TCP-Zuverlässigkeitstransport
Wir alle kennen das TCP-Protokoll als zuverlässiges Transportprotokoll, aber wie gewährleistet es die Zuverlässigkeit des Transports?
Um eine zuverlässige Übertragung zu gewährleisten, müssen viele Faktoren berücksichtigt werden, wie z. B. Datenbeschädigung, -verlust, -duplizierung und fehlerhafte Shards. Wenn diese Probleme nicht gelöst werden können, ist keine zuverlässige Übertragung möglich.
Daher verwendet TCP Mechanismen wie Sequenznummer, Bestätigungsantwort, erneute Sendesteuerung, Verbindungsverwaltung und Fenstersteuerung, um eine zuverlässige Übertragung zu erreichen.
In diesem Artikel konzentrieren wir uns auf das gleitende Fenster, die Flusskontrolle und die Überlastungskontrolle von TCP. Der Mechanismus der erneuten Übertragung wird im nächsten Abschnitt separat behandelt.
Netzwerkflusskontrolle
Netzwerkflusskontrolle oder Netzwerkverkehrskontrolle ist eigentlich Ausdruck der subtilen Beziehung zwischen Produzenten und Konsumenten. Sie sind diesem Szenario wahrscheinlich schon oft bei der Arbeit oder in Vorstellungsgesprächen begegnet. Übersteigt die Produktionskapazität des Produzenten die Konsumkapazität des Konsumenten bei weitem, wächst die Warteschlange unendlich. In schwerwiegenderen Fällen kann es, wie Sie vielleicht wissen, zu Leistungseinbußen des gesamten MQ-Servers kommen, wenn sich zu viele RabbitMQ-Nachrichten häufen. Dasselbe gilt für TCP; wird dies nicht kontrolliert, werden zu viele Nachrichten ins Netzwerk eingespeist, und die Konsumenten überschreiten ihre Kapazität, während die Produzenten weiterhin doppelte Nachrichten senden, was die Netzwerkleistung stark beeinträchtigt.
Um dieses Phänomen zu beheben, bietet TCP dem Sender einen Mechanismus zur Steuerung der gesendeten Datenmenge basierend auf der tatsächlichen Empfangskapazität des Empfängers, die sogenannte Flusskontrolle. Der Empfänger verwaltet ein Empfangsfenster, der Sender ein Sendefenster. Beachten Sie, dass diese Fenster nur für eine einzelne TCP-Verbindung gelten und nicht alle Verbindungen ein gemeinsames Fenster haben.
TCP ermöglicht die Flusssteuerung durch die Verwendung einer Variable für ein Empfangsfenster. Das Empfangsfenster gibt dem Sender einen Hinweis darauf, wie viel Cache-Speicherplatz noch verfügbar ist. Der Sender steuert die gesendete Datenmenge entsprechend der tatsächlichen Aufnahmekapazität des Empfängers.
Der empfangende Host teilt dem Absender die Größe der Daten mit, die er empfangen kann, und der Absender sendet bis zu diesem Limit. Dieses Limit ist die Fenstergröße. Erinnern Sie sich an den TCP-Header? Es gibt ein Empfangsfensterfeld, das die Anzahl der Bytes angibt, die der Empfänger empfangen kann oder möchte.
Der Absenderhost sendet regelmäßig ein Fensterprüfpaket, um festzustellen, ob der Empfängerhost noch Daten empfangen kann. Wenn der Puffer des Empfängers überzulaufen droht, wird die Fenstergröße auf einen kleineren Wert gesetzt, um den Absender anzuweisen, die gesendete Datenmenge zu kontrollieren.
Hier ist ein Netzwerkflusssteuerungsdiagramm:
Netzwerküberlastungskontrolle
Bevor wir die Überlastungskontrolle vorstellen, müssen wir verstehen, dass es neben dem Empfangs- und dem Sendefenster auch ein Überlastungsfenster gibt. Dieses dient hauptsächlich dazu, die Geschwindigkeit zu bestimmen, mit der der Sender Daten an das Empfangsfenster sendet. Daher wird das Überlastungsfenster auch vom TCP-Sender verwaltet. Wir benötigen einen Algorithmus, um zu entscheiden, wie viele Daten gesendet werden sollten, da das Senden von zu wenigen oder zu vielen Daten nicht ideal ist – daher das Konzept des Überlastungsfensters.
Mit der bisherigen Netzwerkflusskontrolle wurde verhindert, dass der Sender den Cache des Empfängers mit Daten füllte, ohne dass wir wussten, was im Netzwerk passierte. Computernetzwerke befinden sich typischerweise in einer gemeinsam genutzten Umgebung. Daher kann es aufgrund der Kommunikation zwischen anderen Hosts zu Netzwerküberlastungen kommen.
Bei einer Netzwerküberlastung kann es durch die kontinuierliche Übertragung einer großen Anzahl von Paketen zu Problemen wie Verzögerungen und Paketverlusten kommen. TCP überträgt die Daten dann erneut, was jedoch die Netzwerkbelastung erhöht und zu größeren Verzögerungen und mehr Paketverlusten führt. Dies kann zu einem Teufelskreis führen und sich immer weiter verstärken.
Daher kann TCP nicht ignorieren, was im Netzwerk passiert. Wenn das Netzwerk überlastet ist, opfert sich TCP selbst, indem es die Menge der gesendeten Daten reduziert.
Daher wird eine Überlastungskontrolle vorgeschlagen, die verhindern soll, dass das gesamte Netzwerk mit Daten des Absenders gefüllt wird. Um die vom Absender zu sendende Datenmenge zu regulieren, definiert TCP ein sogenanntes Überlastungsfenster. Der Überlastungskontrollalgorithmus passt die Größe des Überlastungsfensters an den Überlastungsgrad des Netzwerks an, um die vom Absender gesendete Datenmenge zu kontrollieren.
Was ist ein Überlastungsfenster? Was hat es mit dem Sendefenster zu tun?
Das Überlastungsfenster ist eine vom Sender verwaltete Zustandsvariable, die die Datenmenge bestimmt, die der Sender senden kann. Das Überlastungsfenster ändert sich dynamisch entsprechend der Überlastungsstufe des Netzwerks.
Das Sendefenster ist eine zwischen Sender und Empfänger vereinbarte Fenstergröße, die die Datenmenge angibt, die der Empfänger empfangen kann. Das Überlastungsfenster und das Sendefenster hängen zusammen; das Sendefenster entspricht in der Regel dem Minimum des Überlastungs- und Empfangsfensters, d. h. swnd = min(cwnd, rwnd).
Das Überlastungsfenster cwnd ändert sich wie folgt:
Wenn im Netzwerk keine Überlastung vorliegt, d. h. kein erneutes Übertragungs-Timeout auftritt, wird das Überlastungsfenster vergrößert.
Wenn es zu einer Überlastung im Netzwerk kommt, verringert sich das Überlastungsfenster.
Der Absender ermittelt, ob das Netzwerk überlastet ist, indem er beobachtet, ob das ACK-Bestätigungspaket innerhalb der angegebenen Zeit empfangen wird. Erhält der Absender das ACK-Bestätigungspaket nicht innerhalb der angegebenen Zeit, gilt das Netzwerk als überlastet.
Neben dem Überlastungsfenster ist es an der Zeit, den TCP-Überlastungskontrollalgorithmus zu besprechen. Der TCP-Überlastungskontrollalgorithmus besteht aus drei Hauptteilen:
Langsamer Start:Anfangs ist das Überlastungsfenster von cwnd relativ klein, und der Absender vergrößert das Überlastungsfenster exponentiell, um sich schnell an die Kapazität des Netzwerks anzupassen.
Stauvermeidung:Nachdem das Überlastungsfenster einen bestimmten Schwellenwert überschritten hat, erhöht der Absender das Überlastungsfenster linear, um die Wachstumsrate des Überlastungsfensters zu verlangsamen und eine Überlastung des Netzwerks zu vermeiden.
Schnelle Wiederherstellung:Wenn eine Überlastung auftritt, halbiert der Absender das Überlastungsfenster und wechselt in den schnellen Wiederherstellungszustand, um den Standort der Netzwerkwiederherstellung durch die empfangenen doppelten Bestätigungen zu bestimmen, und vergrößert dann das Überlastungsfenster weiter.
Langsamer Start
Beim Aufbau einer TCP-Verbindung wird das Überlastungsfenster cwnd zunächst auf einen minimalen MSS-Wert (maximale Segmentgröße) gesetzt. Dadurch beträgt die anfängliche Senderate etwa MSS/RTT Bytes/Sekunde. Die tatsächlich verfügbare Bandbreite ist in der Regel deutlich größer als MSS/RTT, daher versucht TCP, die optimale Senderate zu finden, was durch einen langsamen Start erreicht werden kann.
Beim Slow-Start-Prozess wird der Wert des Staufensters cwnd auf 1 MSS initialisiert. Jedes Mal, wenn das übertragene Paketsegment bestätigt wird, erhöht sich der Wert von cwnd um eine MSS, d. h. der Wert von cwnd beträgt dann 2 MSS. Anschließend verdoppelt sich der Wert von cwnd für jede erfolgreiche Übertragung eines Paketsegments usw. Der spezifische Wachstumsprozess ist in der folgenden Abbildung dargestellt.
Die Senderate kann jedoch nicht immer steigen; irgendwann muss das Wachstum enden. Wann endet also der Anstieg der Senderate? Ein langsamer Start beendet den Anstieg der Senderate typischerweise auf eine der folgenden Arten:
Die erste Möglichkeit betrifft den Fall eines Paketverlusts während des Sendevorgangs mit langsamem Start. Bei einem Paketverlust setzt TCP das Überlastungsfenster cwnd des Senders auf 1 und startet den Slow-Start-Prozess neu. An dieser Stelle wird das Konzept des Slow-Start-Schwellenwerts ssthresh eingeführt, dessen Anfangswert die Hälfte des Wertes von cwnd beträgt, der einen Paketverlust verursacht. Das heißt, wenn eine Überlastung erkannt wird, entspricht der Wert von ssthresh der Hälfte des Fensterwerts.
Die zweite Möglichkeit besteht in der direkten Korrelation mit dem Wert des Slow-Start-Schwellenwerts ssthresh. Da der Wert von ssthresh bei erkannter Überlastung die Hälfte des Fensterwerts beträgt, kann es bei jeder Verdoppelung zu Paketverlusten kommen, wenn cwnd größer als ssthresh ist. Daher empfiehlt es sich, cwnd auf ssthresh zu setzen. Dadurch wechselt TCP in den Überlastungskontrollmodus und beendet den Slow-Start.
Der langsame Start kann schließlich beendet werden, wenn drei redundante Bestätigungen erkannt werden. TCP führt dann eine schnelle Neuübertragung durch und wechselt in den Wiederherstellungszustand. (Sollte der Grund für die drei ACK-Pakete unklar sein, wird dies im Neuübertragungsmechanismus separat erläutert.)
Stauvermeidung
Wenn TCP in den Überlastungskontrollzustand wechselt, wird cwnd auf die Hälfte des Überlastungsschwellenwerts ssthresh gesetzt. Das bedeutet, dass der Wert von cwnd nicht bei jedem Empfang eines Paketsegments verdoppelt werden kann. Stattdessen wird ein relativ konservativer Ansatz gewählt, bei dem der Wert von cwnd nach jeder Übertragung nur um eine MSS (maximale Paketsegmentlänge) erhöht wird. Beispielsweise erhöht sich der Wert von cwnd selbst bei der Bestätigung von zehn Paketsegmenten nur um eine MSS. Dies ist ein lineares Wachstumsmodell mit einer Obergrenze für das Wachstum. 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 MSS-Wachstum gestoppt, sobald drei redundante ACK-Antworten empfangen werden. Werden nach der Halbierung des cwnd-Werts immer noch drei redundante ACKs empfangen, wird der ssthresh-Wert als halb so groß wie cwnd gespeichert und der Zustand der schnellen Wiederherstellung eingeleitet.
Schnelle Wiederherstellung
Im Zustand „Fast Recovery“ wird der Wert des Überlastungsfensters cwnd für jede empfangene redundante ACK, also jede ACK, die nicht in der richtigen Reihenfolge eintrifft, um eine MSS erhöht. Dadurch werden die erfolgreich im Netzwerk übertragenen Paketsegmente genutzt, um die Übertragungseffizienz so weit wie möglich zu verbessern.
Wenn eine ACK des verlorenen Paketsegments eintrifft, verringert TCP den Wert von cwnd und wechselt dann in den Überlastungsvermeidungszustand. Dadurch wird die Größe des Überlastungsfensters gesteuert und eine weitere Zunahme der Netzwerküberlastung vermieden.
Tritt nach dem Überlastungskontrollzustand ein Timeout auf, verschärft sich die Netzwerksituation, und TCP wechselt vom Überlastungsvermeidungszustand in den Slow-Start-Zustand. In diesem Fall wird der Wert des Überlastungsfensters cwnd auf 1 MSS (die maximale Paketsegmentlänge) und der Slow-Start-Schwellenwert ssthresh auf die Hälfte von cwnd gesetzt. Dadurch wird das Überlastungsfenster nach der Wiederherstellung des Netzwerks schrittweise wieder vergrößert, um Übertragungsrate und Netzwerküberlastung auszugleichen.
Zusammenfassung
Als zuverlässiges Transportprotokoll implementiert TCP zuverlässigen Transport durch Sequenznummer, Bestätigung, Neuübertragungssteuerung, Verbindungsmanagement und Fenstersteuerung. Der Flusskontrollmechanismus steuert die vom Sender gesendete Datenmenge entsprechend der tatsächlichen Empfangskapazität des Empfängers und vermeidet so Netzwerküberlastung und Leistungseinbußen. Der Überlastungskontrollmechanismus verhindert Netzwerküberlastungen, indem er die vom Sender gesendete Datenmenge anpasst. Die Konzepte des Überlastungsfensters und des Sendefensters hängen zusammen, und die Datenmenge beim Sender wird durch dynamische Anpassung der Größe des Überlastungsfensters gesteuert. Langsamer Start, Überlastungsvermeidung und schnelle Wiederherstellung sind die drei Hauptbestandteile des TCP-Überlastungskontrollalgorithmus, der die Größe des Überlastungsfensters durch verschiedene Strategien an die Kapazität und den Überlastungsgrad des Netzwerks anpasst.
Im nächsten Abschnitt untersuchen wir den Retransmission-Mechanismus von TCP im Detail. Der Retransmission-Mechanismus ist ein wichtiger Bestandteil von TCP für eine zuverlässige Übertragung. Er gewährleistet die zuverlässige Datenübertragung, indem verlorene, beschädigte oder verzögerte Daten erneut übertragen werden. Das Implementierungsprinzip und die Strategie des Retransmission-Mechanismus werden im nächsten Abschnitt detailliert vorgestellt und analysiert. Bleiben Sie dran!
Veröffentlichungszeit: 24. Februar 2025