Tajná zbraň TCP: Riadenie toku siete a riadenie preťaženia siete

Spoľahlivosť prenosu TCP
Všetci poznáme protokol TCP ako spoľahlivý transportný protokol, ale ako zabezpečuje spoľahlivosť prenosu?

Na dosiahnutie spoľahlivého prenosu je potrebné zvážiť mnoho faktorov, ako napríklad poškodenie údajov, stratu, duplikáciu a shardy mimo poradia. Ak sa tieto problémy nedajú vyriešiť, nie je možné dosiahnuť spoľahlivý prenos.

Preto TCP využíva mechanizmy ako poradové číslo, potvrdzovaciu odpoveď, riadenie opätovného odoslania, správu pripojenia a riadenie okna na dosiahnutie spoľahlivého prenosu.

V tomto článku sa zameriame na posuvné okno, riadenie toku a riadenie preťaženia protokolu TCP. Mechanizmus retransmisie je samostatne rozobratý v ďalšej časti.

Riadenie toku siete
Riadenie toku v sieti alebo tiež riadenie sieťovej prevádzky je v skutočnosti prejavom jemného vzťahu medzi producentmi a spotrebiteľmi. S týmto scenárom ste sa pravdepodobne stretli už veľakrát v práci alebo na pohovoroch. Ak kapacita producenta produkovať výrazne prevyšuje kapacitu spotrebiteľa konzumovať, spôsobí to, že front bude nekonečne rásť. V závažnejšom prípade možno viete, že keď sa správy RabbitMQ príliš hromadia, môže to spôsobiť zníženie výkonu celého servera MQ. To isté platí pre TCP; ak sa nekontroluje, do siete sa dostane príliš veľa správ a spotrebitelia prekročia svoju kapacitu, zatiaľ čo producenti budú naďalej odosielať duplicitné správy, čo výrazne ovplyvní výkon siete.

Na riešenie tohto javu poskytuje TCP mechanizmus, ktorý umožňuje odosielateľovi riadiť množstvo odoslaných údajov na základe skutočnej prijímacej kapacity prijímača, čo sa nazýva riadenie toku. Prijímač si udržiava prijímacie okno, zatiaľ čo odosielateľ si udržiava odosielacie okno. Treba poznamenať, že tieto okná sú určené iba pre jedno TCP pripojenie a nie všetky pripojenia zdieľajú jedno okno.

TCP poskytuje riadenie toku pomocou premennej pre prijímacie okno. Prijímacie okno informuje odosielateľa o tom, koľko miesta vo vyrovnávacej pamäti je ešte k dispozícii. Odosielateľ riadi množstvo odoslaných údajov podľa skutočnej akceptačnej kapacity prijímača.

Prijímajúci hostiteľ upozorní odosielateľa na veľkosť dát, ktoré môže prijať, a odosielateľ odošle dáta do tohto limitu. Tento limit je veľkosť okna, pamätáte si na hlavičku TCP? Existuje pole prijímacieho okna, ktoré sa používa na označenie počtu bajtov, ktoré je prijímač schopný alebo ochotný prijať.

Odosielajúci hostiteľ bude pravidelne odosielať paket s testom okna, ktorý sa používa na zistenie, či je prijímajúci hostiteľ stále schopný prijímať dáta. Keď hrozí preplnenie vyrovnávacej pamäte prijímača, veľkosť okna sa nastaví na menšiu hodnotu, aby odosielateľ mal riadiť množstvo odoslaných dát.

Tu je diagram riadenia toku v sieti:

Riadenie dopravy

Riadenie preťaženia siete
Pred zavedením kontroly preťaženia musíme pochopiť, že okrem okna prijímania a okna odosielania existuje aj okno preťaženia, ktoré sa používa hlavne na riešenie problému, akou rýchlosťou odosielateľ začína odosielať dáta do okna prijímania. Okno preťaženia si preto udržiava aj odosielateľ TCP. Potrebujeme algoritmus, ktorý rozhoduje o tom, koľko dát je vhodné odoslať, pretože odosielanie príliš malého alebo príliš veľkého množstva dát nie je ideálne, a preto pochádza koncept okna preťaženia.

V predchádzajúcom riadení toku v sieti sme sa vyhýbali tomu, aby odosielateľ napĺňal vyrovnávaciu pamäť príjemcu dátami, ale nevedeli sme, čo sa deje v sieti. Počítačové siete sa zvyčajne nachádzajú v zdieľanom prostredí. V dôsledku toho môže dôjsť k preťaženiu siete v dôsledku komunikácie medzi inými hostiteľmi.

Keď je sieť preťažená a neustále sa odosiela veľký počet paketov, môže to spôsobiť problémy, ako sú oneskorenia a straty paketov. V tomto bode TCP znova odošle dáta, ale tento opakovaný prenos zvýši zaťaženie siete, čo bude mať za následok väčšie oneskorenia a straty paketov. To sa môže dostať do začarovaného kruhu a neustále sa zväčšovať.

TCP teda nemôže ignorovať, čo sa deje v sieti. Keď je sieť preťažená, TCP sa obetuje tým, že znižuje množstvo odosielaných údajov.

Preto sa navrhuje riadenie preťaženia, ktorého cieľom je zabrániť zaplneniu celej siete dátami od odosielateľa. Na reguláciu množstva dát, ktoré by mal odosielateľ odosielať, TCP definuje koncept nazývaný okno preťaženia. Algoritmus riadenia preťaženia upraví veľkosť okna preťaženia podľa stupňa preťaženia siete, aby sa kontrolovalo množstvo dát odoslaných odosielateľom.

Čo je to okno preťaženia? Čo to má spoločné s oknom odosielania?

Okno preťaženia je stavová premenná, ktorú udržiava odosielateľ a ktorá určuje množstvo dát, ktoré môže odosielateľ odoslať. Okno preťaženia sa dynamicky mení podľa úrovne preťaženia siete.

Odosielacie okno je dohodnutá veľkosť okna medzi odosielateľom a prijímačom, ktorá udáva množstvo dát, ktoré môže prijímač prijať. Okno preťaženia a odosielacie okno spolu súvisia; odosielacie okno sa zvyčajne rovná minimu z okien preťaženia a prijímania, teda swnd = min(cwnd, rwnd).

Okno preťaženia cwnd sa mení takto:

Ak v sieti nie je preťaženie, t. j. nedôjde k prekročeniu časového limitu opakovaného prenosu, okno preťaženia sa zväčšuje.

Ak je v sieti preťaženie, okno preťaženia sa zmenšuje.

Odosielateľ určí, či je sieť preťažená, sledovaním, či bol potvrdzovací paket ACK prijatý v zadanom čase. Ak odosielateľ nedostane potvrdzovací paket ACK v zadanom čase, považuje sa to za preťaženú sieť.

Okrem okna preťaženia je čas prediskutovať algoritmus riadenia preťaženia TCP. Algoritmus riadenia preťaženia TCP pozostáva z troch hlavných častí:

Pomalý štart:Spočiatku je okno preťaženia cwnd relatívne malé a odosielateľ exponenciálne zvyšuje okno preťaženia, aby sa rýchlo prispôsobil kapacite siete.
Zabránenie dopravným zápcham:Keď okno preťaženia prekročí určitú prahovú hodnotu, odosielateľ lineárne zvyšuje okno preťaženia, aby spomalil tempo rastu okna preťaženia a zabránil preťaženiu siete.
Rýchle zotavenie:Ak dôjde k preťaženiu, odosielateľ skracuje okno preťaženia na polovicu a prejde do stavu rýchlej obnovy, aby určil miesto obnovy siete prostredníctvom prijatých duplicitných potvrdení (ACK), a potom pokračuje v zväčšovaní okna preťaženia.

Pomalý štart
Keď je nadviazané TCP spojenie, okno preťaženia cwnd sa spočiatku nastaví na minimálnu hodnotu MSS (maximálna veľkosť segmentu). Týmto spôsobom je počiatočná rýchlosť odosielania približne MSS/RTT bajtov za sekundu. Skutočná dostupná šírka pásma je zvyčajne oveľa väčšia ako MSS/RTT, takže TCP chce nájsť optimálnu rýchlosť odosielania, čo sa dá dosiahnuť pomocou pomalého štartu.

V procese pomalého štartu sa hodnota okna preťaženia cwnd inicializuje na 1 MSS a pri každom potvrdení odoslaného segmentu paketu sa hodnota cwnd zvýši o jeden MSS, t. j. hodnota cwnd sa zmení na 2 MSS. Potom sa hodnota cwnd zdvojnásobí za každý úspešný prenos segmentu paketu atď. Konkrétny proces rastu je znázornený na nasledujúcom obrázku.

 Riadenie preťaženia siete

Miera odosielania však nemôže vždy rásť; rast sa musí niekedy skončiť. Kedy sa teda zvyšovanie miery odosielania končí? Pomalý štart zvyčajne ukončí zvyšovanie miery odosielania jedným z niekoľkých spôsobov:

Prvým spôsobom je prípad straty paketov počas procesu odosielania s pomalým štartom. Keď dôjde k strate paketov, TCP nastaví okno preťaženia odosielateľa cwnd na 1 a reštartuje proces pomalého štartu. V tomto bode sa zavádza koncept prahu pomalého štartu ssthresh, ktorého počiatočná hodnota je polovica hodnoty cwnd, ktorá generuje stratu paketov. To znamená, že keď sa zistí preťaženie, hodnota ssthresh je polovica hodnoty okna.

Druhým spôsobom je priama korelácia s hodnotou prahu pomalého štartu ssthresh. Keďže hodnota ssthresh je pri detekcii preťaženia polovica hodnoty okna, môže dôjsť k strate paketov pri každom zdvojnásobení, keď je cwnd väčšie ako ssthresh. Preto je najlepšie nastaviť cwnd na ssthresh, čo spôsobí, že TCP prepne do režimu riadenia preťaženia a ukončí pomalý štart.

Posledným spôsobom, ako môže pomalý štart skončiť, je zistenie troch redundantných potvrdení (ACK), kedy TCP vykoná rýchly retransmisný prenos a prejde do stavu obnovy. (Ak nie je jasné, prečo existujú tri pakety ACK, bude to vysvetlené samostatne v mechanizme retransmisie.)

Vyhýbanie sa dopravným zápcham
Keď TCP prejde do stavu riadenia preťaženia, cwnd sa nastaví na polovicu prahovej hodnoty preťaženia ssthresh. To znamená, že hodnota cwnd sa nemôže zdvojnásobiť pri každom prijatí segmentu paketu. Namiesto toho sa používa relatívne konzervatívny prístup, pri ktorom sa hodnota cwnd po každom dokončení prenosu zvyšuje iba o jeden MSS (maximálna dĺžka segmentu paketu). Napríklad, aj keď sa potvrdí 10 segmentov paketu, hodnota cwnd sa zvýši iba o jeden MSS. Ide o lineárny model rastu a má tiež hornú hranicu rastu. Keď dôjde k strate paketu, hodnota cwnd sa zmení na MSS a hodnota ssthresh sa nastaví na polovicu cwnd. Alebo sa rast MSS zastaví aj po prijatí 3 redundantných odpovedí ACK. Ak sa po znížení hodnoty cwnd na polovicu stále prijmú tri redundantné odpovede ACK, hodnota ssthresh sa zaznamená ako polovica hodnoty cwnd a prejde sa do stavu rýchlej obnovy.

Rýchle zotavenie
V stave rýchlej obnovy sa hodnota okna preťaženia cwnd zvýši o jednu MSS pre každé prijaté redundantné potvrdenie ACK, teda potvrdenie ACK, ktoré neprichádza v poradí. Cieľom je využiť segmenty paketov, ktoré boli úspešne prenesené v sieti, a čo najviac zlepšiť efektivitu prenosu.

Keď príde potvrdenie (ACK) strateného segmentu paketu, TCP zníži hodnotu cwnd a potom prejde do stavu predchádzania preťaženiu. Cieľom je riadiť veľkosť okna preťaženia a zabrániť ďalšiemu zvyšovaniu preťaženia siete.

Ak po stave riadenia preťaženia dôjde k uplynutiu časového limitu, stav siete sa zhorší a TCP prejde zo stavu predchádzania preťaženiu do stavu pomalého štartu. V tomto prípade je hodnota okna preťaženia cwnd nastavená na 1 MSS, maximálna dĺžka segmentu paketu a hodnota prahu pomalého štartu ssthresh je nastavená na polovicu cwnd. Účelom je postupne zväčšovať veľkosť okna preťaženia po zotavení siete, aby sa vyvážila prenosová rýchlosť a stupeň preťaženia siete.

Zhrnutie
Ako spoľahlivý transportný protokol implementuje TCP spoľahlivý transport pomocou poradového čísla, potvrdenia, riadenia opakovaného prenosu, správy pripojenia a riadenia okien. Medzi nimi mechanizmus riadenia toku riadi množstvo dát odoslaných odosielateľom podľa skutočnej prijímacej kapacity prijímača, čím sa predchádza problémom s preťažením siete a znížením výkonu. Mechanizmus riadenia preťaženia zabraňuje vzniku preťaženia siete úpravou množstva dát odoslaných odosielateľom. Pojmy okna preťaženia a okna odosielania spolu súvisia a množstvo dát u odosielateľa sa riadi dynamickou úpravou veľkosti okna preťaženia. Pomalý štart, predchádzanie preťaženiu a rýchla obnova sú tri hlavné časti algoritmu riadenia preťaženia TCP, ktoré upravujú veľkosť okna preťaženia pomocou rôznych stratégií, aby sa prispôsobili kapacite a stupňu preťaženia siete.

V ďalšej časti sa podrobne pozrieme na mechanizmus retransmisie protokolu TCP. Mechanizmus retransmisie je dôležitou súčasťou protokolu TCP na dosiahnutie spoľahlivého prenosu. Zaisťuje spoľahlivý prenos dát retransmisiou stratených, poškodených alebo oneskorených dát. Princíp implementácie a stratégia mechanizmu retransmisie budú predstavené a podrobne analyzované v ďalšej časti. Zostaňte naladení!


Čas uverejnenia: 24. februára 2025