TCP slaptasis ginklas: tinklo srauto valdymas ir tinklo perkrovos valdymas

TCP patikimumo perdavimas
Visi esame susipažinę su TCP protokolu kaip patikimu perdavimo protokolu, bet kaip jis užtikrina perdavimo patikimumą?

Norint užtikrinti patikimą perdavimą, reikia atsižvelgti į daugelį veiksnių, tokių kaip duomenų sugadinimas, praradimas, dubliavimas ir netvarkinga duomenų fragmentų eilė. Jei šių problemų nepavyksta išspręsti, patikimo perdavimo neįmanoma pasiekti.

Todėl TCP naudoja tokius mechanizmus kaip sekos numeris, patvirtinimo atsakymas, pakartotinio siuntimo kontrolė, ryšio valdymas ir langų valdymas, kad būtų užtikrintas patikimas perdavimas.

Šiame straipsnyje daugiausia dėmesio skirsime TCP slenkančiam langui, srauto valdymui ir perkrovos valdymui. Pakartotinio perdavimo mechanizmas bus aptartas atskirai kitame skyriuje.

Tinklo srauto valdymas
Tinklo srauto valdymas, arba kitaip dar vadinamas tinklo srauto valdymu, iš tikrųjų yra subtilaus ryšio tarp gamintojų ir vartotojų išraiška. Tikriausiai su šiuo scenarijumi esate daug kartų susidūrę darbe ar pokalbių metu. Jei gamintojo gamybos pajėgumai gerokai viršija vartotojo vartojimo pajėgumus, eilė neribotai augs. Rimtesniu atveju, galite žinoti, kad kai „RabbitMQ“ pranešimai susikaupia per daug, tai gali pabloginti viso MQ serverio našumą. Tas pats pasakytina ir apie TCP; jei tai nebus kontroliuojama, į tinklą bus įtraukta per daug pranešimų, o vartotojai viršys savo pajėgumus, o gamintojai ir toliau siųs pasikartojančius pranešimus, o tai labai paveiks tinklo našumą.

Siekdamas išspręsti šį reiškinį, TCP protokolas suteikia mechanizmą siuntėjui, skirtą valdyti siunčiamų duomenų kiekį pagal imtuvo faktinę priėmimo galią, tai vadinama srauto valdymu. Imtuvas palaiko priėmimo langą, o siuntėjas – siuntimo langą. Reikėtų pažymėti, kad šie langai skirti tik vienam TCP ryšiui ir ne visi ryšiai dalijasi lange.

TCP užtikrina srauto valdymą naudodamas kintamąjį priėmimo langui. Gavimo langas nurodo siuntėjui, kiek vietos talpykloje dar yra laisva. Siuntėjas kontroliuoja siunčiamų duomenų kiekį pagal faktinį imtuvo priėmimo pajėgumą.

Gavėjas praneša siuntėjui apie duomenų dydį, kurį jis gali gauti, o siuntėjas siunčia duomenis iki šios ribos. Ši riba yra lango dydis, prisimenate TCP antraštę? Yra priėmimo lango laukas, kuris naudojamas nurodyti baitų skaičių, kurį gavėjas gali arba nori gauti.

Siuntėjas periodiškai siunčia lango zondo paketą, kuris naudojamas norint nustatyti, ar imtuvo mazgas vis dar gali priimti duomenis. Kai gresia imtuvo buferio perpildymas, lango dydis nustatomas į mažesnę reikšmę, kad siuntėjas galėtų kontroliuoti siunčiamų duomenų kiekį.

Čia yra tinklo srauto valdymo schema:

Eismo kontrolė

Tinklo perkrovos valdymas
Prieš įvedant perkrovos kontrolę, turime suprasti, kad be priėmimo lango ir siuntimo lango, yra ir perkrovos langas, kuris daugiausia naudojamas problemai, kokiu greičiu siuntėjas pradeda siųsti duomenis į priėmimo langą, išspręsti. Todėl perkrovos langą taip pat palaiko TCP siuntėjas. Mums reikia algoritmo, kuris nuspręstų, kiek duomenų tinkama siųsti, nes per mažai arba per daug duomenų siuntimas nėra idealus, todėl ir atsirado perkrovos lango sąvoka.

Ankstesniame tinklo srauto valdymo metode vengėme, kad siuntėjas užpildytų gavėjo talpyklą duomenimis, bet nežinojome, kas vyksta tinkle. Paprastai kompiuterių tinklai yra bendroje aplinkoje. Dėl to gali susidaryti tinklo perkrova dėl ryšio tarp kitų pagrindinių kompiuterių.

Kai tinklas yra perpildytas, jei ir toliau siunčiamas didelis paketų skaičius, tai gali sukelti problemų, tokių kaip paketų vėlavimas ir praradimas. Šiuo metu TCP pakartotinai perduos duomenis, tačiau pakartotinis perdavimas padidins tinklo apkrovą, todėl vėlavimai bus didesni ir bus prarasta daugiau paketų. Tai gali patekti į užburtą ratą ir toliau didėti.

Taigi, TCP negali ignoruoti to, kas vyksta tinkle. Kai tinklas yra perpildytas, TCP aukoja save sumažindamas siunčiamų duomenų kiekį.

Todėl siūlomas perkrovos valdymas, kuriuo siekiama išvengti viso tinklo užpildymo siuntėjo duomenimis. Norėdamas reguliuoti duomenų kiekį, kurį siuntėjas turėtų siųsti, TCP apibrėžia sąvoką, vadinamą perkrovos langu. Perkrovos valdymo algoritmas koreguos perkrovos lango dydį pagal tinklo perkrovos laipsnį, kad būtų galima kontroliuoti siuntėjo siunčiamų duomenų kiekį.

Kas yra perkrovos langas? Ką tai turi bendro su siuntimo langu?

Perkrovos langas yra siuntėjo palaikomas būsenos kintamasis, kuris nustato duomenų kiekį, kurį siuntėjas gali siųsti. Perkrovos langas dinamiškai keičiasi atsižvelgiant į tinklo perkrovos lygį.

Siuntimo langas yra siuntėjo ir imtuvo sutartas lango dydis, nurodantis duomenų kiekį, kurį imtuvas gali gauti. Perkrovos langas ir siuntimo langas yra susiję; siuntimo langas paprastai yra lygus minimaliam perkrovos ir priėmimo langų dydžiui, t. y. swnd = min(cwnd, rwnd).

Perkrovos lango cwnd reikšmė keičiasi taip:

Jei tinkle nėra perkrovos, t. y. neįvyksta pakartotinio perdavimo skirtojo laiko pabaiga, perkrovos langas padidėja.

Jei tinkle yra perkrova, perkrovos langas sumažėja.

Siuntėjas nustato, ar tinklas yra perpildytas, stebėdamas, ar ACK patvirtinimo paketas gaunamas per nurodytą laiką. Jei siuntėjas negauna ACK patvirtinimo paketo per nurodytą laiką, laikoma, kad tinklas yra perpildytas.

Be perkrovos lango, laikas aptarti TCP perkrovos valdymo algoritmą. TCP perkrovos valdymo algoritmą sudaro trys pagrindinės dalys:

Lėta pradžia:Iš pradžių cwnd perkrovos langas yra santykinai mažas, o siuntėjas eksponentiškai didina perkrovos langą, kad greitai prisitaikytų prie tinklo pralaidumo.
Spūsčių vengimas:Kai perkrovos langas viršija tam tikrą ribą, siuntėjas tiesiškai didina perkrovos langą, kad sulėtintų perkrovos lango augimo tempą ir išvengtų tinklo perkrovos.
Greitas atsigavimas:Jei susidaro perkrova, siuntėjas perpus sumažina perkrovos langą ir pereina į greito atkūrimo būseną, kad nustatytų tinklo atkūrimo vietą pagal gautus pasikartojančius patvirtinimus, o tada toliau didina perkrovos langą.

Lėta pradžia
Kai užmezgamas TCP ryšys, perkrovos lango „cwnd“ pradinė vertė nustatoma į minimalią MSS (maksimalaus segmento dydžio) reikšmę. Tokiu būdu pradinis siuntimo greitis yra maždaug MSS/RTT baitų per sekundę. Faktinis galimas pralaidumas paprastai yra daug didesnis nei MSS/RTT, todėl TCP nori rasti optimalų siuntimo greitį, kurį galima pasiekti lėtos pradžios metodu.

Lėtos pradžios procese perkrovos lango cwnd reikšmė bus inicijuota į 1 MSS, ir kiekvieną kartą, kai patvirtinamas perduotas paketo segmentas, cwnd reikšmė bus padidinta vienu MSS, t. y. cwnd reikšmė taps 2 MSS. Vėliau cwnd reikšmė dvigubinama už kiekvieną sėkmingą paketo segmento perdavimą ir t. t. Konkretus augimo procesas parodytas toliau pateiktame paveikslėlyje.

 Tinklo perkrovos valdymas

Tačiau siuntimo sparta ne visada gali augti; augimas kada nors turi baigtis. Taigi, kada siuntimo spartos didėjimas baigiasi? Lėta pradžia paprastai užbaigia siuntimo spartos didėjimą vienu iš kelių būdų:

Pirmasis atvejis yra paketų praradimas lėtos pradžios siuntimo proceso metu. Kai prarandamas paketas, TCP nustato siuntėjo perkrovos langą cwnd į 1 ir iš naujo paleidžia lėtos pradžios procesą. Šiuo metu įvedama lėtos pradžios slenksčio ssthresh koncepcija, kurios pradinė vertė yra pusė cwnd vertės, kuri generuoja paketų praradimą. Tai yra, kai aptinkama perkrova, ssthresh vertė yra lygi pusei lango vertės.

Antras būdas – tiesiogiai koreliuoti su lėtos pradžios slenksčio ssthresh verte. Kadangi ssthresh vertė, kai aptinkama perkrova, yra lygi pusei lango vertės, kiekvieną kartą padvigubėjus, kai cwnd yra didesnė už ssthresh, gali būti prarasti paketai. Todėl geriausia nustatyti cwnd į ssthresh, kad TCP persijungtų į perkrovos valdymo režimą ir nutrauktų lėtą pradžią.

Paskutinis būdas, kuriuo lėta pradžia gali baigtis, yra aptikus tris nereikalingus patvirtinimus (ACK), TCP atlieka greitą pakartotinį perdavimą ir pereina į atkūrimo būseną. (Jei neaišku, kodėl yra trys ACK paketai, tai bus paaiškinta atskirai pakartotinio perdavimo mechanizme.)

Spūsčių vengimas
Kai TCP pereina į perkrovos valdymo būseną, cwnd nustatomas į pusę perkrovos slenksčio ssthresh. Tai reiškia, kad cwnd reikšmės negalima padvigubinti kiekvieną kartą gavus paketo segmentą. Vietoj to, taikomas santykinai konservatyvus metodas, kai cwnd reikšmė padidinama tik vienu MSS (maksimalus paketo segmento ilgis) po kiekvieno perdavimo pabaigos. Pavyzdžiui, net jei patvirtinama 10 paketo segmentų, cwnd reikšmė padidės tik vienu MSS. Tai yra linijinio augimo modelis, ir jis taip pat turi viršutinę augimo ribą. Kai prarandami paketai, cwnd reikšmė pakeičiama į MSS, o ssthresh reikšmė nustatoma į pusę cwnd. Arba MSS augimas sustabdomas, kai gaunami 3 pertekliniai ACK atsakymai. Jei po cwnd reikšmės sumažinimo perpus vis dar gaunami trys pertekliniai patvirtinimai, ssthresh reikšmė įrašoma kaip pusė cwnd reikšmės ir pereinama į greito atkūrimo būseną.

Greitas atsigavimas
Greito atkūrimo būsenoje perkrovos lango „cwnd“ reikšmė padidinama vienu MSS už kiekvieną gautą perteklinį ACK, t. y. ACK, kuris neatvyksta iš eilės. Taip siekiama panaudoti sėkmingai tinkle perduotus paketų segmentus, kad būtų kuo labiau padidintas perdavimo efektyvumas.

Kai gaunamas prarasto paketo segmento ACK, TCP sumažina cwnd reikšmę ir pereina į perkrovos vengimo būseną. Taip siekiama kontroliuoti perkrovos lango dydį ir išvengti tolesnio tinklo perkrovos didinimo.

Jei po perkrovos valdymo būsenos įvyksta skirtasis laikas, tinklo situacija tampa rimtesnė ir TCP pereina iš perkrovos vengimo būsenos į lėtos pradžios būseną. Tokiu atveju perkrovos lango „cwnd“ reikšmė nustatoma į 1 MSS, maksimalų paketo segmento ilgį, o lėtos pradžios slenksčio „ssthresh“ reikšmė nustatoma į pusę „cwnd“. Šio veiksmo tikslas – palaipsniui didinti perkrovos lango dydį, kai tinklas atsigauna, siekiant subalansuoti perdavimo greitį ir tinklo perkrovos laipsnį.

Santrauka
Kaip patikimas perdavimo protokolas, TCP įgyvendina patikimą perdavimą pagal sekos numerį, patvirtinimą, retransliacijos valdymą, ryšio valdymą ir langų valdymą. Tarp jų srauto valdymo mechanizmas kontroliuoja siuntėjo siunčiamų duomenų kiekį pagal faktinį imtuvo priėmimo pajėgumą, taip išvengiant tinklo perkrovos ir našumo pablogėjimo problemų. Perkrovos valdymo mechanizmas padeda išvengti tinklo perkrovos, reguliuodamas siuntėjo siunčiamų duomenų kiekį. Perkrovos lango ir siuntimo lango sąvokos yra susijusios viena su kita, o siuntėjo duomenų kiekis kontroliuojamas dinamiškai reguliuojant perkrovos lango dydį. Lėta pradžia, perkrovos vengimas ir greitas atkūrimas yra trys pagrindinės TCP perkrovos valdymo algoritmo dalys, kurios reguliuoja perkrovos lango dydį, taikydamos skirtingas strategijas, kad prisitaikytų prie tinklo pajėgumo ir perkrovos laipsnio.

Kitame skyriuje išsamiai išnagrinėsime TCP retransliacijos mechanizmą. Retransliacijos mechanizmas yra svarbi TCP dalis, siekiant patikimo perdavimo. Jis užtikrina patikimą duomenų perdavimą, pakartotinai perduodamas prarastus, sugadintus ar uždelstus duomenis. Retransliacijos mechanizmo įgyvendinimo principas ir strategija bus pristatyti ir išsamiai analizuojami kitame skyriuje. Sekite naujienas!


Įrašo laikas: 2025 m. vasario 24 d.