TCP-betrouwbaarheidstransport
We kennen het TCP-protocol allemaal als een betrouwbaar transportprotocol, maar hoe garandeert het de betrouwbaarheid van het transport?
Om een betrouwbare transmissie te bereiken, moeten veel factoren in acht worden genomen, zoals gegevensbeschadiging, -verlies, -duplicatie en niet-geordende shards. Als deze problemen niet kunnen worden opgelost, is een betrouwbare transmissie niet mogelijk.
Daarom maakt TCP gebruik van mechanismen zoals volgnummering, bevestigingsantwoord, controle over opnieuw verzenden, verbindingsbeheer en vensterbeheer om een betrouwbare transmissie te bereiken.
In dit artikel richten we ons op het schuifvenster, de stroomregeling en de congestiecontrole van TCP. Het hertransmissiemechanisme wordt in de volgende sectie apart behandeld.
Netwerkstroombeheer
Network Flow Control, of beter bekend als Network Traffic Control, is in feite een manifestatie van de subtiele relatie tussen producenten en consumenten. Je bent dit scenario waarschijnlijk vaak tegengekomen op je werk of tijdens sollicitatiegesprekken. Als de productiecapaciteit van de producent de consumptiecapaciteit van de consument ruimschoots overtreft, zal de wachtrij oneindig lang worden. In een ernstiger geval weet je misschien dat wanneer RabbitMQ-berichten zich te veel opstapelen, dit kan leiden tot prestatieverslechtering van de gehele MQ-server. Hetzelfde geldt voor TCP; als je dit niet in de gaten houdt, worden er te veel berichten in het netwerk geplaatst en overschrijden de consumenten hun capaciteit, 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 verzender de hoeveelheid verzonden data kan regelen op basis van de werkelijke ontvangstcapaciteit van de ontvanger. Dit staat bekend als flow control. De ontvanger onderhoudt een ontvangstvenster, terwijl de verzender een verzendvenster onderhoudt. Deze vensters zijn slechts voor één TCP-verbinding en niet alle verbindingen delen een venster.
TCP biedt datastroomcontrole door een variabele voor een ontvangstvenster te gebruiken. Het ontvangstvenster geeft de verzender een indicatie van hoeveel cacheruimte er nog beschikbaar is. De verzender bepaalt de hoeveelheid verzonden data op basis van de werkelijke acceptatiecapaciteit van de ontvanger.
De ontvangende host informeert de verzender over de grootte van de data die hij kan ontvangen, en de verzender verzendt tot aan deze limiet. Deze limiet is de venstergrootte, weet u nog de TCP-header? Er is een ontvangstvensterveld, dat wordt gebruikt om het aantal bytes aan te geven dat de ontvanger kan of wil ontvangen.
De verzendende host verzendt periodiek een window probe-pakket, waarmee wordt vastgesteld of de ontvangende host nog steeds gegevens kan ontvangen. Wanneer de buffer van de ontvanger dreigt te overstromen, wordt de window size ingesteld op een kleinere waarde om de verzender te instrueren de hoeveelheid verzonden gegevens te beheren.
Hier ziet u een Network Flow Control-diagram:
Netwerkcongestiecontrole
Voordat we congestiecontrole introduceren, moeten we begrijpen dat er naast het ontvangstvenster en het verzendvenster ook een congestievenster bestaat. Dit venster wordt voornamelijk gebruikt om het probleem op te lossen van de snelheid waarmee de verzender gegevens naar het ontvangstvenster verzendt. Het congestievenster wordt dus ook beheerd door de TCP-verzender. We hebben een algoritme nodig om te bepalen hoeveel gegevens geschikt zijn om te verzenden, aangezien het verzenden van te weinig of te veel gegevens niet ideaal is. Vandaar het concept van een congestievenster.
In de vorige netwerkstroomregeling voorkwamen we dat de verzender de cache van de ontvanger vulde met gegevens, maar we wisten niet wat er in het netwerk gebeurde. Computernetwerken bevinden zich doorgaans in een gedeelde omgeving. Hierdoor kan er netwerkcongestie ontstaan door communicatie tussen andere hosts.
Wanneer het netwerk overbelast is en er voortdurend een groot aantal pakketten wordt verzonden, kan dit problemen veroorzaken zoals vertraging en pakketverlies. TCP zal de gegevens dan opnieuw verzenden, maar deze hertransmissie verhoogt de belasting van het netwerk, wat resulteert in grotere vertragingen en meer pakketverlies. Dit kan leiden tot een vicieuze cirkel 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 verstuurt te verminderen.
Daarom wordt congestiecontrole voorgesteld, die ervoor moet zorgen dat het hele netwerk niet vol raakt met data van de verzender. Om de hoeveelheid data die de verzender mag verzenden te reguleren, definieert TCP een concept genaamd het congestievenster. Het congestiecontrolealgoritme past de grootte van het congestievenster aan op basis van de mate van congestie in het netwerk, om zo de hoeveelheid data die de verzender verzendt te beheersen.
Wat is een congestievenster? Wat heeft dit te maken met het verzendvenster?
Het congestievenster is een statusvariabele die door de verzender wordt beheerd en die de hoeveelheid data bepaalt die de verzender kan verzenden. Het congestievenster verandert dynamisch afhankelijk van de mate van congestie in het netwerk.
Het verzendvenster is een overeengekomen venstergrootte tussen de verzender en de ontvanger die aangeeft hoeveel data de ontvanger kan ontvangen. Het congestievenster en het verzendvenster zijn gerelateerd; het verzendvenster is meestal gelijk aan het minimum van het congestie- en ontvangstvenster, dat wil zeggen: swnd = min(cwnd, rwnd).
Het congestievenster cwnd verandert als volgt:
Als er geen congestie in het netwerk is, dat wil zeggen als er geen time-out voor hertransmissie optreedt, neemt het congestievenster toe.
Als er congestie is in het netwerk, wordt het congestievenster korter.
De verzender bepaalt of het netwerk overbelast is door te kijken of het ACK-bevestigingspakket binnen de opgegeven tijd wordt ontvangen. Als de verzender 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-congestiecontrolealgoritme te bespreken. Het TCP-congestiecontrolealgoritme bestaat uit drie hoofdonderdelen:
Langzame start:In eerste instantie is het cwnd-congestievenster relatief klein. De verzender vergroot het congestievenster vervolgens exponentieel om zich snel aan te passen aan de capaciteit van het netwerk.
Vermijden van files:Zodra het congestievenster een bepaalde drempel overschrijdt, vergroot de verzender 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 verzender het congestievenster en gaat hij naar de snelle herstelstatus om de locatie van het netwerkherstel te bepalen aan de hand van de ontvangen dubbele bevestigingen. Vervolgens verlengt hij het congestievenster steeds verder.
Langzame start
Wanneer een TCP-verbinding tot stand wordt gebracht, wordt het congestievenster cwnd aanvankelijk ingesteld op een minimale MSS-waarde (maximale segmentgrootte). Hierdoor ligt de initiële verzendsnelheid rond de MSS/RTT bytes/seconde. De daadwerkelijk beschikbare bandbreedte is meestal veel groter dan MSS/RTT, dus TCP wil de optimale verzendsnelheid vinden, wat kan worden bereikt door middel van slow-start.
In het slow-startproces wordt de waarde van het congestievenster cwnd geïnitialiseerd op 1 MSS. Telkens wanneer het verzonden pakketsegment wordt bevestigd, wordt de waarde van cwnd met één MSS verhoogd, wat betekent dat de waarde van cwnd 2 MSS wordt. Daarna wordt de waarde van cwnd verdubbeld voor elke succesvolle verzending van een pakketsegment, enzovoort. Het specifieke groeiproces wordt weergegeven in de volgende afbeelding.
De verzendsnelheid kan echter niet altijd toenemen; de groei moet ooit stoppen. Dus, wanneer stopt de toename van de verzendsnelheid? Slow-start beëindigt de toename van de verzendsnelheid meestal op een van de volgende manieren:
De eerste manier is het geval van pakketverlies tijdens het verzenden van een langzame start. Wanneer er pakketverlies optreedt, stelt TCP het congestievenster cwnd van de verzender in op 1 en start het langzame startproces opnieuw. Op dit punt wordt het concept van de drempelwaarde voor langzame start ssthresh geïntroduceerd, waarvan de initiële waarde de helft is van de waarde van cwnd die pakketverlies genereert. Dat wil zeggen, wanneer congestie wordt gedetecteerd, is de waarde van ssthresh de helft van de vensterwaarde.
De tweede manier is om direct te correleren met de waarde van de slow-startdrempel ssthresh. Omdat de waarde van ssthresh de helft is van de windowwaarde wanneer congestie wordt gedetecteerd, kan er bij elke verdubbeling pakketverlies optreden wanneer cwnd groter is dan ssthresh. Daarom is het het beste om cwnd in te stellen op ssthresh, waardoor TCP overschakelt naar de congestiecontrolemodus en de slow-start stopt.
De laatste manier waarop een langzame start kan eindigen, is wanneer er drie redundante ACK's worden gedetecteerd. TCP voert dan een snelle hertransmissie uit en gaat in de herstelstatus. (Als het niet duidelijk is waarom er drie ACK-pakketten zijn, wordt dit apart uitgelegd in het hertransmissiemechanisme.)
Vermijding van congestie
Wanneer TCP de congestiecontrolestatus bereikt, 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 benadering gehanteerd waarbij de waarde van cwnd met slechts één MSS (maximale pakketsegmentlengte) wordt verhoogd na voltooiing van elke transmissie. Zelfs als bijvoorbeeld 10 pakketsegmenten worden bevestigd, zal de waarde van cwnd slechts met één MSS toenemen. Dit is een lineair groeimodel en heeft ook een bovengrens voor de groei. Wanneer pakketverlies optreedt, wordt de waarde van cwnd gewijzigd in een MSS en de waarde van ssthresh ingesteld op de helft van cwnd. Of het stopt ook de groei van MSS wanneer er 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 geregistreerd als de helft van de waarde van cwnd en wordt de snelle herstelstatus bereikt.
Snel herstel
In de Fast Recovery-status wordt de waarde van het congestievenster cwnd met één MSS verhoogd voor elke ontvangen redundante ACK, d.w.z. ACK die niet in de juiste volgorde aankomt. Dit is bedoeld om de pakketsegmenten die succesvol in het netwerk zijn verzonden, te gebruiken om de transmissie-efficiëntie zoveel mogelijk te verbeteren.
Wanneer een ACK van het verloren pakketsegment arriveert, verlaagt TCP de waarde van cwnd en schakelt het over naar de congestievermijdingsstatus. Dit is om de grootte van het congestievenster te beheersen en verdere toename van de netwerkcongestie te voorkomen.
Als er een time-out optreedt na de congestiecontrolestatus, wordt de netwerkconditie ernstiger en migreert TCP van de congestievermijdingsstatus naar de langzame startstatus. In dit geval wordt de waarde van het congestievenster cwnd ingesteld op 1 MSS, de maximale pakketsegmentlengte, en de waarde van de drempelwaarde voor langzame start ssthresh op de helft van cwnd. Het doel hiervan is om de grootte van het congestievenster geleidelijk te vergroten nadat het netwerk is hersteld, om de transmissiesnelheid en de mate van netwerkcongestie in evenwicht te brengen.
Samenvatting
Als betrouwbaar transportprotocol implementeert TCP betrouwbaar transport via volgnummering, bevestiging, hertransmissiecontrole, verbindingsbeheer en venstercontrole. Het stroomcontrolemechanisme regelt de hoeveelheid data die door de verzender wordt verzonden op basis van de werkelijke ontvangstcapaciteit van de ontvanger, waardoor problemen met netwerkcongestie en prestatieverslechtering worden vermeden. Het congestiecontrolemechanisme voorkomt netwerkcongestie door de hoeveelheid data die door de verzender wordt verzonden aan te passen. De concepten congestievenster en verzendvenster zijn aan elkaar gerelateerd, en de hoeveelheid data bij de verzender wordt geregeld door de grootte van het congestievenster dynamisch aan te passen. Langzame 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 de volgende sectie zullen we het retransmissiemechanisme van TCP in detail bekijken. Het retransmissiemechanisme is een belangrijk onderdeel van TCP voor een betrouwbare gegevensoverdracht. Het zorgt voor een betrouwbare gegevensoverdracht door verloren, beschadigde of vertraagde gegevens opnieuw te verzenden. Het implementatieprincipe en de strategie van het retransmissiemechanisme worden in de volgende sectie in detail geïntroduceerd en geanalyseerd. Blijf op de hoogte!
Plaatsingstijd: 24-02-2025