TCP-pålidelighedstransport
Vi kender alle TCP-protokollen som en pålidelig transportprotokol, men hvordan sikrer den transportens pålidelighed?
For at opnå pålidelig transmission skal mange faktorer tages i betragtning, såsom datakorruption, tab, duplikering og skær i forkert rækkefølge. Hvis disse problemer ikke kan løses, kan pålidelig transmission ikke opnås.
Derfor anvender TCP mekanismer som sekvensnummer, bekræftelsessvar, gensend-kontrol, forbindelsesstyring og vindueskontrol for at opnå pålidelig transmission.
I denne artikel vil vi fokusere på TCP's glidende vindue, flowkontrol og overbelastningskontrol. Retransmissionsmekanismen behandles separat i næste afsnit.
Netværksflowkontrol
Netværksflowkontrol eller kendt som netværkstrafikkontrol er faktisk en manifestation af det subtile forhold mellem producenter og forbrugere. Du er sikkert stødt på dette scenarie ofte på arbejdet eller i interviews. Hvis producentens produktionskapacitet i høj grad overstiger forbrugerens forbrugskapacitet, vil det få køen til at vokse i det uendelige. I et mere alvorligt tilfælde ved du måske, at når RabbitMQ-meddelelser hober sig op for meget, kan det forårsage ydeevneforringelse af hele MQ-serveren. Det samme gælder for TCP; hvis det ikke kontrolleres, vil der blive sendt for mange meddelelser til netværket, og forbrugerne vil have overskredet deres kapacitet, mens producenterne vil fortsætte med at sende dubletter, hvilket i høj grad vil påvirke netværkets ydeevne.
For at imødegå dette fænomen tilbyder TCP en mekanisme, der gør det muligt for afsenderen at kontrollere mængden af sendte data baseret på modtagerens faktiske modtagekapacitet, hvilket kaldes flowkontrol. Modtageren opretholder et modtagevindue, mens afsenderen opretholder et sendevindue. Det skal bemærkes, at disse vinduer kun er til en enkelt TCP-forbindelse, og ikke alle forbindelser deler et vindue.
TCP leverer flowkontrol ved at bruge en variabel til et modtagevindue. Modtagevinduet giver afsenderen en indikation af, hvor meget cacheplads der stadig er tilgængelig. Afsenderen styrer mængden af data, der sendes, i henhold til modtagerens faktiske acceptkapacitet.
Modtagerværten giver afsenderen besked om størrelsen på de data, den kan modtage, og afsenderen sender op til denne grænse. Denne grænse er vinduesstørrelsen, husker du TCP-headeren? Der er et modtagevinduesfelt, som bruges til at angive antallet af bytes, som modtageren er i stand til eller villig til at modtage.
Afsenderens vært sender med jævne mellemrum en vinduesprøvepakke, som bruges til at detektere, om modtagerens vært stadig kan acceptere data. Når modtagerens buffer er i fare for at overfyldes, indstilles vinduesstørrelsen til en mindre værdi for at instruere afsenderen i at kontrollere mængden af sendte data.
Her er et diagram over netværksflowkontrol:
Kontrol af netværksbelastning
Før vi introducerer kontrol af overbelastning, skal vi forstå, at der ud over modtagevinduet og sendevinduet også er et overbelastningsvindue, som primært bruges til at løse problemet med, hvor hurtigt afsenderen begynder at sende data til modtagevinduet. Derfor vedligeholdes overbelastningsvinduet også af TCP-afsenderen. Vi har brug for en algoritme til at bestemme, hvor meget data der er passende at sende, da det ikke er ideelt at sende for lidt eller for meget data, deraf konceptet med et overbelastningsvindue.
I den tidligere netværksflowkontrol undgik vi, at afsenderen fyldte modtagerens cache med data, men vi vidste ikke, hvad der skete i netværket. Typisk er computernetværk i et delt miljø. Som følge heraf kan der være netværksbelastning på grund af kommunikation mellem andre værter.
Når netværket er overbelastet, og et stort antal pakker fortsætter med at blive sendt, kan det forårsage problemer såsom forsinkelse og tab af pakker. På dette tidspunkt vil TCP videresende dataene, men videresendelsen vil øge belastningen på netværket, hvilket resulterer i større forsinkelser og flere pakketab. Dette kan ende i en ond cirkel, der kun bliver større.
TCP kan derfor ikke ignorere, hvad der sker på netværket. Når netværket er overbelastet, ofrer TCP sig selv ved at reducere mængden af data, det sender.
Derfor foreslås overbelastningskontrol, som har til formål at undgå at fylde hele netværket med data fra afsenderen. For at regulere mængden af data, som afsenderen skal sende, definerer TCP et koncept kaldet overbelastningsvinduet. Overbelastningskontrolalgoritmen justerer størrelsen af overbelastningsvinduet i henhold til netværkets overbelastningsgrad for at kontrollere mængden af data, der sendes af afsenderen.
Hvad er et overbelastningsvindue? Hvad har det at gøre med afsendelsesvinduet?
Overbelastningsvinduet er en tilstandsvariabel, der vedligeholdes af afsenderen, og som bestemmer mængden af data, afsenderen kan sende. Overbelastningsvinduet ændrer sig dynamisk i henhold til netværkets overbelastningsniveau.
Afsendelsesvinduet er en aftalt vinduesstørrelse mellem afsender og modtager, der angiver den mængde data, modtageren kan modtage. Overbelastningsvinduet og afsendelsesvinduet er relaterede; afsendelsesvinduet er normalt lig med minimum af overbelastnings- og modtagervinduet, det vil sige swnd = min(cwnd, rwnd).
Overbelastningsvinduet cwnd ændres som følger:
Hvis der ikke er nogen overbelastning i netværket, dvs. hvis der ikke opstår nogen timeout for retransmission, øges overbelastningsvinduet.
Hvis der er overbelastning i netværket, mindskes overbelastningsvinduet.
Afsenderen afgør, om netværket er overbelastet, ved at observere, om ACK-bekræftelsespakken modtages inden for den angivne tid. Hvis afsenderen ikke modtager ACK-bekræftelsespakken inden for den angivne tid, betragtes det som overbelastet netværk.
Ud over overbelastningsvinduet er det tid til at diskutere TCP-overbelastningskontrolalgoritmen. TCP-overbelastningskontrolalgoritmen består af tre hoveddele:
Langsom start:I starten er cwnd-overbelastningsvinduet relativt lille, og afsenderen øger overbelastningsvinduet eksponentielt for hurtigt at tilpasse sig netværkets kapacitet.
Undgåelse af trafikpropper:Når overbelastningsvinduet overstiger en bestemt tærskel, øger afsenderen overbelastningsvinduet lineært for at bremse vækstraten i overbelastningsvinduet og undgå overbelastning af netværket.
Hurtig genopretning:Hvis der opstår overbelastning, halverer afsenderen overbelastningsvinduet og går ind i tilstanden hurtig genoprettelse for at bestemme placeringen af netværksgendannelsen via de modtagne duplikater, og fortsætter derefter med at øge overbelastningsvinduet.
Langsom start
Når en TCP-forbindelse etableres, indstilles overbelastningsvinduet cwnd initialt til en minimumsværdi for MSS (maksimal segmentstørrelse). På denne måde er den indledende sendehastighed omkring MSS/RTT bytes/sekund. Den faktisk tilgængelige båndbredde er normalt meget større end MSS/RTT, så TCP ønsker at finde den optimale sendehastighed, hvilket kan opnås ved hjælp af slow-start.
I den langsomme startproces initialiseres værdien af overbelastningsvinduet cwnd til 1 MSS, og hver gang det transmitterede pakkesegment bekræftes, øges værdien af cwnd med én MSS, dvs. værdien af cwnd bliver 2 MSS. Derefter fordobles værdien af cwnd for hver vellykket transmission af et pakkesegment, og så videre. Den specifikke vækstproces er vist i den følgende figur.
Sendehastigheden kan dog ikke altid vokse; væksten skal slutte på et tidspunkt. Så hvornår slutter stigningen i sendehastigheden? En langsom start afslutter typisk stigningen i sendehastigheden på en af flere måder:
Den første metode er tilfældet med pakketab under afsendelsesprocessen med langsom start. Når der opstår et pakketab, sætter TCP afsenderens overbelastningsvindue cwnd til 1 og genstarter den langsomme startproces. På dette tidspunkt introduceres et koncept med en langsom starttærskel ssthresh, hvis startværdi er halvdelen af den værdi af cwnd, der genererer pakketab. Det vil sige, at når der registreres overbelastning, er værdien af ssthresh halvdelen af vinduesværdien.
Den anden måde er at korrelere direkte med værdien af ssthresh, der er tærsklen for langsom start. Da værdien af ssthresh er halvdelen af vinduesværdien, når der registreres overbelastning, kan der forekomme pakketab ved hver fordobling, når cwnd er større end ssthresh. Derfor er det bedst at indstille cwnd til ssthresh, hvilket vil få TCP til at skifte til overbelastningskontroltilstand og afslutte langsom start.
Den sidste måde, hvorpå en langsom start kan ophøre, er hvis der registreres tre redundante ACK-pakker. TCP udfører en hurtig retransmission og går i genoprettelsestilstand. (Hvis det ikke er klart, hvorfor der er tre ACK-pakker, vil det blive forklaret separat i retransmissionsmekanismen.)
Undgåelse af trafikpropper
Når TCP går ind i tilstanden "congestion control", sættes cwnd til halvdelen af "congestion thresh"-tærsklen. Det betyder, at værdien af cwnd ikke kan fordobles, hver gang et pakkesegment modtages. I stedet anvendes en relativt konservativ tilgang, hvor værdien af cwnd kun øges med én MSS (maksimal pakkesegmentlængde), efter hver transmission er afsluttet. For eksempel, selvom 10 pakkesegmenter bekræftes, vil værdien af cwnd kun stige med én MSS. Dette er en lineær vækstmodel, og den har også en øvre grænse for vækst. Når der opstår pakketab, ændres værdien af cwnd til en MSS, og værdien af ssthresh sættes til halvdelen af cwnd. Eller den stopper også væksten af MSS, når der modtages 3 redundante ACK-svar. Hvis der stadig modtages tre redundante ACK'er efter halvering af værdien af cwnd, registreres værdien af ssthresh som halvdelen af værdien af cwnd, og den hurtige genoprettelsestilstand går ind.
Hurtig bedring
I tilstanden Fast Recovery øges værdien af overbelastningsvinduet cwnd med én MSS for hver modtaget redundant ACK, dvs. ACK, der ikke ankommer i rækkefølge. Dette er for at udnytte de pakkesegmenter, der er blevet transmitteret succesfuldt i netværket, til at forbedre transmissionseffektiviteten så meget som muligt.
Når en ACK for det mistede pakkesegment ankommer, reducerer TCP værdien af cwnd og går derefter i tilstanden for undgåelse af overbelastning. Dette er for at kontrollere størrelsen af overbelastningsvinduet og undgå yderligere at øge netværksbelastningen.
Hvis der opstår en timeout efter overbelastningskontroltilstanden, bliver netværkstilstanden mere alvorlig, og TCP migrerer fra overbelastningsundgåelsestilstanden til langsom starttilstand. I dette tilfælde sættes værdien af overbelastningsvinduet cwnd til 1 MSS, den maksimale pakkesegmentlængde, og værdien af langsom starttærsklen ssthresh sættes til halvdelen af cwnd. Formålet med dette er gradvist at øge størrelsen af overbelastningsvinduet, efter at netværket er genoprettet, for at afbalancere transmissionshastigheden og graden af netværksoverbelastning.
Oversigt
Som en pålidelig transportprotokol implementerer TCP pålidelig transport via sekvensnummer, bekræftelse, retransmissionskontrol, forbindelsesstyring og vindueskontrol. Blandt disse styrer flowkontrolmekanismen mængden af data, der sendes af afsenderen, i henhold til modtagerens faktiske modtagekapacitet, hvilket undgår problemer med netværksbelastning og forringelse af ydeevnen. Overbelastningskontrolmekanismen undgår forekomsten af netværksbelastning ved at justere mængden af data, der sendes af afsenderen. Begreberne overbelastningsvindue og sendevindue er relateret til hinanden, og mængden af data hos afsenderen styres ved dynamisk at justere størrelsen af overbelastningsvinduet. Langsom start, overbelastningsundgåelse og hurtig genopretning er de tre hoveddele af TCP's overbelastningskontrolalgoritme, som justerer størrelsen af overbelastningsvinduet gennem forskellige strategier for at tilpasse sig netværkets kapacitet og grad af overbelastning.
I næste afsnit vil vi undersøge TCP's retransmissionsmekanisme i detaljer. Retransmissionsmekanismen er en vigtig del af TCP for at opnå pålidelig transmission. Den sikrer pålidelig datatransmission ved at retransmittere mistede, beskadigede eller forsinkede data. Implementeringsprincippet og strategien for retransmissionsmekanismen vil blive introduceret og analyseret i detaljer i næste afsnit. Følg med!
Opslagstidspunkt: 24. feb. 2025