Transport de fiabilitate TCP
Cu toții suntem familiarizați cu protocolul TCP ca protocol de transport fiabil, dar cum asigură fiabilitatea transportului?
Pentru a obține o transmisie fiabilă, trebuie luați în considerare mulți factori, cum ar fi corupția datelor, pierderea, duplicarea și cioburile din afara ordinului. Dacă aceste probleme nu pot fi rezolvate, o transmisie fiabilă nu poate fi obținută.
Prin urmare, TCP folosește mecanisme precum numărul secvenței, răspunsul de confirmare, retendarea controlului, gestionarea conexiunii și controlul ferestrei pentru a obține o transmisie fiabilă.
În această lucrare, ne vom concentra pe fereastra glisantă, controlul debitului și controlul congestiei TCP. Mecanismul de retransmisie este acoperit separat în secțiunea următoare.
Controlul fluxului de rețea
Controlul fluxului de rețea sau cunoașterea faptului că controlul traficului de rețea este de fapt o manifestare a relației subtile între producători și consumatori. Probabil că ați întâlnit foarte mult acest scenariu la locul de muncă sau în interviuri. Dacă capacitatea producătorului de a produce depășește mult capacitatea consumatorului de a consuma, aceasta va face ca coada să crească la nesfârșit. Într -un caz mai grav, este posibil să știți că atunci când mesajele RabbitMQ se acumulează prea mult, poate provoca degradarea performanței întregului server MQ. Același lucru este valabil și pentru TCP; Dacă sunt lăsate necontrolate, vor fi introduse prea multe mesaje în rețea, iar consumatorii își vor depăși capacitatea, în timp ce producătorii vor continua să trimită mesaje duplicate, ceea ce va afecta foarte mult performanța rețelei.
Pentru a aborda acest fenomen, TCP oferă un mecanism pentru expeditor să controleze cantitatea de date trimise pe baza capacității de recepție reală a receptorului, care este cunoscută sub numele de control de flux. Receptorul menține o fereastră de primire, în timp ce expeditorul menține o fereastră de trimitere. Trebuie menționat că aceste ferestre sunt doar pentru o singură conexiune TCP și nu toate conexiunile partajează o fereastră.
TCP oferă controlul fluxului folosind o variabilă pentru o fereastră de recepție. Fereastra de recepție oferă expeditorului o indicație a cât de mult spațiu cache este încă disponibil. Expeditorul controlează cantitatea de date trimise în funcție de capacitatea de acceptare reală a receptorului.
Gazda receptorului notifică expeditorul cu privire la dimensiunea datelor pe care le poate primi, iar expeditorul trimite până la această limită. Această limită este dimensiunea ferestrei, vă amintiți antetul TCP? Există un câmp de fereastră de recepție, care este utilizat pentru a indica numărul de octeți pe care receptorul este capabil sau dispus să -l primească.
Gazda expeditor va trimite periodic un pachet de sondă pentru fereastră, care este utilizat pentru a detecta dacă gazda receptorului este în continuare capabilă să accepte date. Când tamponul receptorului este în pericol să se revarsă, dimensiunea ferestrei este setată la o valoare mai mică pentru a instrui expeditorul să controleze cantitatea de date trimise.
Iată o diagramă de control a fluxului de rețea:
Controlul congestiei rețelei
Înainte de a introduce controlul congestiei, trebuie să înțelegem că, pe lângă fereastra de primire și fereastra de trimitere, există și o fereastră de congestie, care este utilizată în principal pentru a rezolva problema la ce rată, expeditorul începe să trimită date la fereastra de primire. Prin urmare, fereastra de congestie este menținută și de expeditorul TCP. Avem nevoie de un algoritm pentru a decide cât de multe date sunt adecvate pentru a trimite, deoarece trimiterea prea mică sau prea multe date nu este ideală, de unde și conceptul de fereastră de congestionare.
În controlul anterior al fluxului de rețea, ceea ce am evitat a fost expeditorul care a completat cache -ul receptorului cu date, dar nu știam ce se întâmplă în rețea. De obicei, rețelele de calculatoare sunt într -un mediu partajat. Drept urmare, poate exista congestionarea rețelei din cauza comunicării între alte gazde.
Atunci când rețeaua este congestionată, dacă un număr mare de pachete vor fi trimise, poate provoca probleme precum întârzierea și pierderea pachetelor. În acest moment, TCP va retransmite datele, dar retransmisia va crește povara din rețea, ceea ce duce la întârzieri mai mari și mai multe pierderi de pachete. Acest lucru poate intra într -un ciclu vicios și poate continua să crească.
Astfel, TCP nu poate ignora ceea ce se întâmplă în rețea. Când rețeaua este congestionată, TCP se sacrifică prin reducerea cantității de date pe care le trimite.
Prin urmare, este propus controlul congestiei, care are ca scop evitarea completării întregii rețele cu date de la expeditor. Pentru a reglementa cantitatea de date pe care ar trebui să o trimită expeditorul, TCP definește un concept numit fereastra de congestionare. Algoritmul de control al congestiei va ajusta dimensiunea ferestrei de congestie în funcție de gradul de congestie al rețelei, astfel încât să controleze cantitatea de date trimise de expeditor.
Ce este o fereastră de congestie? Ce legătură are asta cu fereastra de trimitere?
Fereastra de congestie este o variabilă de stat menținută de expeditor care determină cantitatea de date pe care o poate trimite expeditorul. Fereastra de congestie se schimbă dinamic în funcție de nivelul de congestie al rețelei.
Fereastra de trimitere este o dimensiune a ferestrei convenite între expeditor și receptor care indică cantitatea de date pe care le poate primi receptorul. Fereastra de congestie și fereastra de trimitere sunt legate; Fereastra de trimitere este de obicei egală cu minimul de congestie și ferestre de primire, adică SWND = min (CWND, RWND).
Fereastra de congestie se modifică după cum urmează:
Dacă nu există congestie în rețea, adică nu are loc un interval de timp de retransmisie, fereastra de congestie crește.
Dacă există congestie în rețea, fereastra de congestie scade.
Expeditorul stabilește dacă rețeaua este congestionată observând dacă pachetul de confirmare ACK este primit în timpul specificat. Dacă expeditorul nu primește pachetul de confirmare ACK în timpul specificat, se consideră că rețeaua este congestionată.
Pe lângă fereastra de congestie, este timpul să discutăm algoritmul de control al congestiei TCP. Algoritmul de control al congestiei TCP este format din trei părți principale:
Start lent:Inițial, fereastra de congestie CWND este relativ mică, iar expeditorul crește fereastra de congestie exponențială pentru a se adapta rapid la capacitatea rețelei.
Evitarea congestiei:După ce fereastra de congestie depășește un anumit prag, expeditorul crește fereastra de congestie într -o manieră liniară pentru a încetini rata de creștere a ferestrei de congestie și a evita supraîncărcarea rețelei.
Recuperare rapidă:Dacă are loc congestionarea, expeditorul jumătate la jumătatea ferestrei de congestie și intră în starea de recuperare rapidă pentru a determina locația recuperării rețelei prin intermediul ACK -urilor duplicate primite, apoi continuă să crească fereastra de congestie.
Început lent
Când se stabilește o conexiune TCP, fereastra de congestie CWND este inițial setată la o valoare minimă MSS (dimensiunea maximă a segmentului). În acest fel, rata inițială de trimitere este despre MSS/RTT octeți/secundă. Lățimea de bandă disponibilă este de obicei mult mai mare decât MSS/RTT, astfel încât TCP dorește să găsească rata de trimitere optimă, care poate fi obținută cu ajutorul unui start lent.
În procesul de pornire lentă, valoarea ferestrei de congestie CWND va fi inițializată la 1 mss și, de fiecare dată, segmentul de pachete transmise este recunoscut, valoarea CWND va fi crescută cu un MSS, adică valoarea CWND va deveni 2 mss. După aceea, valoarea CWND este dublată pentru fiecare transmisie de succes a unui segment de pachete și așa mai departe. Procesul specific de creștere este prezentat în figura următoare.
Cu toate acestea, rata de trimitere nu poate crește întotdeauna; Creșterea trebuie să se încheie cândva. Deci, când se încheie rata de trimitere? START-START încheie de obicei creșterea ratei de trimitere într-unul din mai multe moduri:
Prima modalitate este cazul pierderii de pachete în timpul procesului de trimitere de pornire lentă. Când are loc o pierdere a pachetului, TCP stabilește fereastra de congestionare a expeditorului la 1 și repornește procesul de pornire lentă. În acest moment, este introdus un concept de prag de pornire lentă Ssthresh, a cărui valoare inițială este jumătate din valoarea CWND care generează pierderi de pachete. Adică, atunci când este detectată congestionarea, valoarea SSThresh este jumătate din valoarea ferestrei.
A doua modalitate este corelarea direct cu valoarea ssthresh-ului de prag lent. Deoarece valoarea SSThresh este jumătate din valoarea ferestrei atunci când este detectată congestionarea, pierderea pachetelor poate apărea cu fiecare dublare atunci când CWND este mai mare decât SSThresh. Prin urmare, cel mai bine este să setați CWND la Ssthresh, ceea ce va determina TCP să treacă la modul de control al congestiei și să se încheie lent.
Ultima modalitate prin care se poate încheia lent este să se termine este dacă sunt detectate trei ACK -uri redundante, TCP efectuează o retransmisie rapidă și intră în starea de recuperare. (Dacă nu este clar de ce există trei pachete ACK, acesta va fi explicat separat în mecanismul de retransmisie.)
Evitarea congestiei
Când TCP intră în starea de control a congestiei, CWND este setat la jumătate din pragul de congestie Ssthresh. Aceasta înseamnă că valoarea CWND nu poate fi dublată de fiecare dată când se primește un segment de pachete. În schimb, se adoptă o abordare relativ conservatoare în care valoarea CWND este crescută cu un singur MSS (lungimea maximă a segmentului de pachete) după ce fiecare transmisie este finalizată. De exemplu, chiar dacă sunt recunoscute 10 segmente de pachete, valoarea CWND va crește doar cu un MSS. Acesta este un model de creștere liniară și are, de asemenea, o legătură superioară a creșterii. Când are loc pierderea de pachete, valoarea CWND este modificată într -un MSS, iar valoarea SSThresh este setată la jumătate din CWND. Sau va opri, de asemenea, creșterea MSS atunci când se primesc 3 răspunsuri ACK redundante. Dacă trei ACK -uri redundante sunt încă primite după reducerea valorii CWND, valoarea SSThresh este înregistrată ca jumătate din valoarea CWND și starea de recuperare rapidă este introdusă.
Recuperare rapidă
În starea de recuperare rapidă, valoarea ferestrei de congestie CWND este crescută cu un MSS pentru fiecare ACK redundant primit, adică ACK care nu ajunge în secvență. Acest lucru este pentru a folosi segmentele de pachete care au fost transmise cu succes în rețea pentru a îmbunătăți cât mai mult eficiența transmisiei.
Când ajunge un ACK al segmentului de pachete pierdute, TCP scade valoarea CWND și apoi intră în starea de evitare a congestiei. Acest lucru este pentru a controla dimensiunea ferestrei de congestie și pentru a evita creșterea în continuare a congestionării rețelei.
Dacă un interval de timp are loc după starea de control a congestiei, starea rețelei devine mai gravă și TCP migrează de la starea de evitare a congestiei până la starea de pornire lentă. În acest caz, valoarea ferestrei de congestie CWND este setată la 1 mss, lungimea maximă a segmentului de pachete și valoarea SSThresh de prag lent este setată la jumătate din CWND. Scopul acestui lucru este de a crește din nou dimensiunea ferestrei de congestie după ce rețeaua se recuperează pentru a echilibra rata de transmisie și gradul de congestionare a rețelei.
Rezumat
Ca protocol de transport fiabil, TCP implementează un transport fiabil în funcție de numărul de secvență, confirmare, controlul retransmisiei, gestionarea conexiunii și controlul ferestrei. Printre aceștia, mecanismul de control al fluxului controlează cantitatea de date trimise de expeditor în funcție de capacitatea reală de primire a receptorului, care evită problemele congestiei rețelei și degradarea performanței. Mecanismul de control al congestiei evită apariția congestiei rețelei prin ajustarea cantității de date trimise de expeditor. Conceptele de fereastră de congestie și fereastra de trimitere sunt legate între ele, iar cantitatea de date la expeditor este controlată prin reglarea dinamică a dimensiunii ferestrei de congestionare. Începerea lentă, evitarea congestiei și recuperarea rapidă sunt cele trei părți principale ale algoritmului de control al congestionării TCP, care ajustează dimensiunea ferestrei de congestie prin diferite strategii pentru a se adapta la gradul de congestie și congestionarea rețelei.
În secțiunea următoare, vom examina în detaliu mecanismul de retransmisie al TCP. Mecanismul de retransmitere este o parte importantă a TCP pentru a obține o transmisie fiabilă. Acesta asigură transmiterea fiabilă a datelor prin retransmiterea datelor pierdute, corupte sau întârziate. Principiul de implementare și strategia mecanismului de retransmisie vor fi introduse și analizate în detaliu în secțiunea următoare. Rămâneţi aproape!
Timpul post: 14-2025 februarie