Het geheime wapen van TCP: netwerkstroombeheer en netwerkcongestiebeheer.

TCP-betrouwbaarheidstransport
We kennen allemaal het TCP-protocol als een betrouwbaar transportprotocol, maar hoe garandeert het die betrouwbaarheid van het transport?

Om een ​​betrouwbare gegevensoverdracht te realiseren, moet rekening worden gehouden met vele factoren, zoals gegevenscorruptie, verlies, duplicatie en de verkeerde volgorde van de gegevensfragmenten. Als deze problemen niet kunnen worden opgelost, is een betrouwbare gegevensoverdracht onmogelijk.

TCP maakt daarom gebruik van mechanismen zoals volgnummering, bevestigingsantwoorden, herverzendingcontrole, verbindingsbeheer en venstercontrole om betrouwbare transmissie te realiseren.

In dit artikel richten we ons op het schuifvenster, de stroomregeling en de congestieregeling van TCP. Het herverzendingsmechanisme wordt in de volgende sectie apart behandeld.

Netwerkstroombeheer
Netwerkstroombeheer, ook wel netwerkverkeersbeheer genoemd, is in feite een manifestatie van de subtiele relatie tussen producenten en consumenten. Je bent dit scenario waarschijnlijk al vaak tegengekomen op je werk of tijdens sollicitatiegesprekken. Als de productiecapaciteit van de producent de consumptiecapaciteit van de consument ruimschoots overschrijdt, zal de wachtrij oneindig blijven groeien. In een ernstiger geval weet je misschien dat een te grote ophoping van RabbitMQ-berichten de prestaties van de hele MQ-server kan verslechteren. Hetzelfde geldt voor TCP; als er geen controle op wordt uitgeoefend, zullen er te veel berichten in het netwerk worden geplaatst, waardoor de consumenten hun capaciteit overschrijden, terwijl de producenten dubbele berichten blijven versturen, wat de netwerkprestaties aanzienlijk zal beïnvloeden.

Om dit fenomeen aan te pakken, biedt TCP een mechanisme waarmee de zender de hoeveelheid verzonden data kan regelen op basis van de daadwerkelijke ontvangstcapaciteit van de ontvanger. Dit mechanisme staat bekend als flow control. De ontvanger beheert een ontvangstvenster, terwijl de zender een verzendvenster beheert. Het is belangrijk om te weten dat deze vensters slechts voor één TCP-verbinding gelden en dat niet alle verbindingen een venster delen.

TCP biedt stroomcontrole door middel van een variabele voor een ontvangstvenster. Het ontvangstvenster geeft de zender een indicatie van hoeveel cachegeheugen er nog beschikbaar is. De zender regelt de hoeveelheid verzonden data op basis van de daadwerkelijke acceptatiecapaciteit van de ontvanger.

De ontvangende host laat de verzender weten hoeveel data er maximaal beschikbaar is, en de verzender verzendt tot deze limiet. Deze limiet is de venstergrootte; herinnert u zich de TCP-header nog? Er is een veld voor het ontvangstvenster, dat aangeeft hoeveel bytes de ontvanger kan of wil ontvangen.

De verzendende host stuurt periodiek een vensterprobe-pakket, waarmee wordt gecontroleerd of de ontvangende host nog steeds gegevens kan accepteren. Wanneer de buffer van de ontvanger dreigt over te lopen, wordt de venstergrootte verkleind om de verzender te instrueren de hoeveelheid verzonden gegevens te beperken.

Hier is een diagram van netwerkstroombeheer:

Verkeersregeling

Netwerkcongestiebeheer
Voordat we congestiebeheer introduceren, moeten we begrijpen dat er naast het ontvangstvenster en het verzendvenster ook een congestievenster bestaat. Dit congestievenster wordt voornamelijk gebruikt om het probleem op te lossen van de snelheid waarmee de zender gegevens naar het ontvangstvenster begint te sturen. Het congestievenster wordt dus ook door de TCP-zender beheerd. We hebben een algoritme nodig om te bepalen hoeveel gegevens er verzonden mogen worden, aangezien het verzenden van te weinig of te veel gegevens niet ideaal is. Vandaar het concept van een congestievenster.

Bij de vorige netwerkstroomcontrole voorkwamen we dat de zender de cache van de ontvanger vulde met gegevens, maar we wisten niet wat er zich in het netwerk afspeelde. Computernetwerken bevinden zich doorgaans in een gedeelde omgeving. Daardoor kan er netwerkcongestie ontstaan ​​als gevolg van communicatie tussen verschillende hosts.

Wanneer het netwerk overbelast is en er continu grote aantallen pakketten worden verzonden, kan dit problemen veroorzaken zoals vertraging en pakketverlies. TCP zal de gegevens dan opnieuw verzenden, maar deze herverzending verhoogt de belasting van het netwerk, wat resulteert in grotere vertragingen en meer pakketverlies. Dit kan een vicieuze cirkel worden die steeds groter wordt.

TCP kan dus niet negeren wat er op het netwerk gebeurt. Wanneer het netwerk overbelast is, offert TCP zichzelf op door de hoeveelheid data die het verzendt te verminderen.

Daarom wordt congestiebeheer voorgesteld, dat tot doel heeft te voorkomen dat het hele netwerk overbelast raakt met data van de zender. Om de hoeveelheid data die de zender moet verzenden te reguleren, definieert TCP een concept genaamd het congestievenster. Het congestiebeheeralgoritme past de grootte van het congestievenster aan op basis van de mate van congestie in het netwerk, om zo de hoeveelheid data die door de zender wordt verzonden te beheersen.

Wat is een congestievenster? Wat heeft dit te maken met het verzendvenster?

Het congestievenster is een statusvariabele die door de zender wordt bijgehouden en die bepaalt hoeveel data de zender kan verzenden. Het congestievenster verandert dynamisch afhankelijk van de mate van netwerkcongestie.

Het verzendvenster is een overeengekomen venstergrootte tussen de zender en de ontvanger die aangeeft hoeveel gegevens de ontvanger kan ontvangen. Het congestievenster en het verzendvenster zijn aan elkaar gerelateerd; het verzendvenster is meestal gelijk aan het minimum van het congestievenster en het ontvangstvenster, oftewel swnd = min(cwnd, rwnd).

De congestievenster-cwnd verandert als volgt:

Als er geen netwerkcongestie is, oftewel als er geen time-out optreedt bij herverzending, wordt het congestievenster groter.

Als er sprake is van netwerkcongestie, neemt het congestievenster af.

De afzender bepaalt of het netwerk overbelast is door te controleren of het ACK-bevestigingspakket binnen de opgegeven tijd wordt ontvangen. Als de afzender het ACK-bevestigingspakket niet binnen de opgegeven tijd ontvangt, wordt aangenomen dat het netwerk overbelast is.

Naast het congestievenster is het tijd om het TCP-congestiebeheeralgoritme te bespreken. Het TCP-congestiebeheeralgoritme bestaat uit drie hoofdonderdelen:

Langzame start:Aanvankelijk is het congestievenster van cwnd relatief klein, en de zender vergroot het congestievenster exponentieel om zich snel aan te passen aan de capaciteit van het netwerk.
Filevermijding:Nadat het congestievenster een bepaalde drempelwaarde overschrijdt, vergroot de zender het congestievenster lineair om de groeisnelheid van het congestievenster te vertragen en overbelasting van het netwerk te voorkomen.
Snel herstel:Als er congestie optreedt, halveert de zender het congestievenster en gaat naar de snelle herstelmodus om de locatie van het netwerkherstel te bepalen aan de hand van de ontvangen dubbele bevestigingen, waarna het congestievenster weer wordt vergroot.

Langzame start
Wanneer een TCP-verbinding tot stand wordt gebracht, wordt het congestievenster cwnd aanvankelijk ingesteld op een minimale MSS-waarde (maximum segment size). Op deze manier is de initiële verzendsnelheid ongeveer MSS/RTT bytes/seconde. De daadwerkelijk beschikbare bandbreedte is meestal veel groter dan MSS/RTT, dus TCP streeft ernaar de optimale verzendsnelheid te vinden, wat kan worden bereikt door middel van slow-start.

Tijdens het slow-startproces wordt de waarde van het congestievenster cwnd geïnitialiseerd op 1 MSS. Telkens wanneer een verzonden pakketsegment wordt bevestigd, wordt de waarde van cwnd met één MSS verhoogd, oftewel de waarde van cwnd wordt 2 MSS. Vervolgens wordt de waarde van cwnd verdubbeld voor elke succesvolle verzending van een pakketsegment, enzovoort. Het specifieke groeiproces wordt weergegeven in de volgende afbeelding.

 Netwerkcongestiebeheer

De verzendsnelheid kan echter niet eeuwig blijven groeien; de groei moet op een gegeven moment stoppen. Dus, wanneer stopt de toename van de verzendsnelheid? Een langzame start beëindigt de toename van de verzendsnelheid doorgaans op een van de volgende manieren:

De eerste manier is het geval van pakketverlies tijdens het verzenden van een pakket via slow start. Wanneer er pakketverlies optreedt, stelt TCP het congestievenster (cwnd) van de afzender in op 1 en herstart het slow start-proces. Op dit punt wordt het concept van een slow start-drempelwaarde (ssthresh) geïntroduceerd, waarvan de beginwaarde de helft is van de cwnd-waarde die pakketverlies veroorzaakt. Dat wil zeggen, wanneer congestie wordt gedetecteerd, is de waarde van ssthresh de helft van de vensterwaarde.

De tweede methode is om een ​​directe correlatie te leggen met de waarde van de slow-start-drempel ssthresh. Omdat de waarde van ssthresh de helft van de vensterwaarde is wanneer congestie wordt gedetecteerd, kan er pakketverlies optreden bij elke verdubbeling wanneer cwnd groter is dan ssthresh. Daarom is het het beste om cwnd gelijk te stellen aan ssthresh, waardoor TCP overschakelt naar de congestiebeheermodus en slow-start wordt beëindigd.

De laatste manier waarop een slow start kan eindigen, is wanneer drie redundante ACK-pakketten worden gedetecteerd. TCP voert dan een snelle herverzending uit en gaat naar de herstelmodus. (Als het niet duidelijk is waarom er drie ACK-pakketten zijn, wordt dit apart uitgelegd in het gedeelte over het herverzendingsmechanisme.)

Filevermijding
Wanneer TCP de congestiecontrolemodus ingaat, wordt cwnd ingesteld op de helft van de congestiedrempel ssthresh. Dit betekent dat de waarde van cwnd niet elke keer dat een pakketsegment wordt ontvangen, kan worden verdubbeld. In plaats daarvan wordt een relatief conservatieve aanpak gehanteerd, waarbij de waarde van cwnd na elke voltooide transmissie slechts met één MSS (maximale pakketsegmentlengte) wordt verhoogd. Zelfs als er bijvoorbeeld 10 pakketsegmenten worden bevestigd, zal de waarde van cwnd slechts met één MSS toenemen. Dit is een lineair groeimodel met een bovengrens voor de groei. Bij pakketverlies wordt de waarde van cwnd gewijzigd naar een MSS en wordt de waarde van ssthresh ingesteld op de helft van cwnd. De groei van MSS wordt ook gestopt wanneer 3 redundante ACK-reacties worden ontvangen. Als er na het halveren van de waarde van cwnd nog steeds drie redundante ACK's worden ontvangen, wordt de waarde van ssthresh ingesteld op de helft van de waarde van cwnd en wordt de snelle herstelmodus geactiveerd.

Snel herstel
In de Fast Recovery-modus wordt de waarde van het congestievenster cwnd verhoogd met één MSS voor elke ontvangen redundante ACK, oftewel elke ACK die niet in de juiste volgorde aankomt. Dit is om de pakketsegmenten die al succesvol in het netwerk zijn verzonden optimaal te benutten en zo de transmissie-efficiëntie te verbeteren.

Wanneer een ACK van het verloren pakketsegment arriveert, verlaagt TCP de waarde van cwnd en gaat vervolgens over naar de congestievermijdingsmodus. Dit dient om de grootte van het congestievenster te beheersen en verdere toename van de netwerkcongestie te voorkomen.

Als er na de congestiecontrolefase een time-out optreedt, verslechtert de netwerkconditie en schakelt TCP over van de congestievermijdingsfase naar de slow-startfase. In dit geval wordt de waarde van het congestievenster (cwnd) ingesteld op 1 MSS (maximale pakketsegmentlengte) en de waarde van de slow-startdrempel (ssthresh) op de helft van cwnd. Het doel hiervan is om de grootte van het congestievenster geleidelijk weer te vergroten nadat het netwerk is hersteld, om zo de transmissiesnelheid en de mate van netwerkcongestie in evenwicht te brengen.

Samenvatting
Als betrouwbaar transportprotocol implementeert TCP betrouwbaar transport door middel van sequentienummering, bevestiging, herverzendingcontrole, verbindingsbeheer en venstercontrole. Het stroomcontrolemechanisme regelt de hoeveelheid data die de zender verzendt op basis van de werkelijke ontvangstcapaciteit van de ontvanger, waardoor problemen met netwerkcongestie en prestatievermindering worden voorkomen. Het congestiecontrolemechanisme voorkomt netwerkcongestie door de hoeveelheid data die de zender verzendt aan te passen. De concepten van congestievenster en verzendvenster zijn met elkaar verbonden, en de hoeveelheid data die de zender verzendt, wordt geregeld door de grootte van het congestievenster dynamisch aan te passen. Slow start, congestievermijding en snel herstel zijn de drie belangrijkste onderdelen van het TCP-congestiecontrolealgoritme, die de grootte van het congestievenster aanpassen met behulp van verschillende strategieën om zich aan te passen aan de capaciteit en de mate van congestie van het netwerk.

In het volgende gedeelte zullen we het herverzendingsmechanisme van TCP in detail bekijken. Het herverzendingsmechanisme is een belangrijk onderdeel van TCP voor een betrouwbare gegevensoverdracht. Het zorgt voor een betrouwbare overdracht van gegevens door verloren, beschadigde of vertraagde gegevens opnieuw te verzenden. Het implementatieprincipe en de strategie van het herverzendingsmechanisme zullen in het volgende gedeelte worden geïntroduceerd en geanalyseerd. Blijf kijken!


Geplaatst op: 24 februari 2025