Transportul de fiabilitate TCP
Cu toții suntem familiarizați cu protocolul TCP ca un protocol de transport fiabil, dar cum asigură acesta fiabilitatea transportului?
Pentru a obține o transmisie fiabilă, trebuie luați în considerare mulți factori, cum ar fi coruperea datelor, pierderea, duplicarea și fragmentele de date nefuncționale. Dacă aceste probleme nu pot fi rezolvate, nu se poate realiza o transmisie fiabilă.
Prin urmare, TCP folosește mecanisme precum numărul de secvență, răspunsul de confirmare, controlul retrimiterii, gestionarea conexiunilor și controlul ferestrelor pentru a realiza o transmisie fiabilă.
În această lucrare, ne vom concentra pe fereastra glisantă, controlul fluxului și controlul congestiei în TCP. Mecanismul de retransmisie este tratat separat în secțiunea următoare.
Controlul fluxului de rețea
Controlul fluxului de rețea sau cunoscut sub numele de Controlul traficului de rețea este de fapt o manifestare a relației subtile dintre producători și consumatori. Probabil ați întâlnit acest scenariu des la locul de muncă sau în interviuri. Dacă capacitatea producătorului de a produce depășește cu mult capacitatea consumatorului de a consuma, acest lucru va face ca coada să crească la nesfârșit. Într-un caz mai grav, știți probabil că atunci când mesajele RabbitMQ se acumulează prea mult, acest lucru poate provoca degradarea performanței întregului server MQ. Același lucru este valabil și pentru TCP; dacă nu este verificat, prea multe mesaje vor fi introduse în rețea, iar consumatorii își vor fi depășit 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 prin care expeditorul poate controla cantitatea de date trimise pe baza capacității reale de recepție a receptorului, mecanism cunoscut sub numele de control al fluxului. Receptorul menține o fereastră de recepție, î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 prin utilizarea unei variabile pentru o fereastră de recepție. Fereastra de recepție oferă expeditorului o indicație despre cât spațiu cache este încă disponibil. Expeditorul controlează cantitatea de date trimise în funcție de capacitatea reală de acceptare 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 pentru fereastra de primire, care este folosit pentru a indica numărul de octeți pe care receptorul este capabil sau dorește să îi primească.
Gazda expeditorului va trimite periodic un pachet de sondă pentru ferestre, care este utilizat pentru a detecta dacă gazda receptorului este încă capabilă să accepte date. Când buffer-ul receptorului este în pericol de depășire, dimensiunea ferestrei este setată la o valoare mai mică pentru a instrui expeditorul să controleze cantitatea de date trimise.
Iată o diagramă de control al fluxului de rețea:
Controlul congestiei rețelei
Înainte de a introduce controlul congestiei, trebuie să înțelegem că, pe lângă fereastra de recepție și fereastra de trimitere, există și o fereastră de congestie, care este utilizată în principal pentru a rezolva problema ratei la care expeditorul începe să trimită date către fereastra de recepție. Prin urmare, fereastra de congestie este, de asemenea, menținută de expeditorul TCP. Avem nevoie de un algoritm pentru a decide câte date sunt potrivite pentru a fi trimise, deoarece trimiterea de prea puține sau prea multe date nu este ideală, de unde și conceptul de fereastră de congestie.
În controlul anterior al fluxului de rețea, ceea ce am evitat a fost umplerea memoriei cache a receptorului cu date de către expeditor, dar nu știam ce se întâmplă în rețea. De obicei, rețelele de calculatoare se află într-un mediu partajat. Drept urmare, poate exista congestie a rețelei din cauza comunicării dintre alte gazde.
Când rețeaua este congestionată, dacă se continuă trimiterea unui număr mare de pachete, pot apărea probleme precum întârzieri și pierderi de pachete. În acest moment, TCP va retransmite datele, dar retransmisia va crește sarcina asupra rețelei, rezultând întârzieri mai mari și mai multe pierderi de pachete. Acest lucru poate intra într-un cerc vicios și poate continua să se agraveze.
Prin urmare, 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 o trimite.
Prin urmare, se propune controlul congestiei, care are ca scop evitarea umplerii întregii rețele cu date de la expeditor. Pentru a regla cantitatea de date pe care expeditorul ar trebui să o trimită, TCP definește un concept numit fereastră de congestie. 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 aceasta cu fereastra de trimitere?
Fereastra de congestie este o variabilă de stare gestionată de expeditor, care determină cantitatea de date pe care expeditorul o poate trimite. Fereastra de congestie se modifică dinamic în funcție de nivelul de congestie al rețelei.
Fereastra de trimitere este o dimensiune a ferestrei convenită între expeditor și receptor, care indică cantitatea de date pe care receptorul o poate primi. Fereastra de congestie și fereastra de trimitere sunt corelate; fereastra de trimitere este de obicei egală cu minimul dintre ferestrele de congestie și de recepție, adică swnd = min(cwnd, rwnd).
Fereastra de congestie cwnd se modifică după cum urmează:
Dacă nu există congestie în rețea, adică nu apare nicio expirare a retransmisiei, fereastra de congestie crește.
Dacă există congestie în rețea, fereastra de congestie scade.
Expeditorul determină dacă rețeaua este congestionată observând dacă pachetul de confirmare ACK este primit în intervalul de timp specificat. Dacă expeditorul nu primește pachetul de confirmare ACK în intervalul de timp 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 constă din trei părți principale:
Pornire lentă:Inițial, fereastra de congestie cwnd este relativ mică, iar expeditorul măreș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, emițătorul măreș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ă apare congestie, expeditorul înjumătățește fereastra de congestie și intră în starea de recuperare rapidă pentru a determina locația recuperării rețelei prin confirmările duplicate primite, apoi continuă să crească fereastra de congestie.
Pornire 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 de aproximativ MSS/RTT octeți/secundă. Lățimea de bandă disponibilă este de obicei mult mai mare decât MSS/RTT, așa că TCP dorește să găsească rata optimă de trimitere, care poate fi atinsă prin intermediul unui slow-start.
În procesul de pornire lentă, valoarea ferestrei de congestie cwnd va fi inițializată la 1 MSS, iar de fiecare dată când segmentul de pachet transmis este confirmat, valoarea lui cwnd va fi crescută cu un MSS, adică valoarea lui cwnd va deveni 2 MSS. După aceea, valoarea lui cwnd este dublată pentru fiecare transmitere reușită a unui segment de pachet și așa mai departe. Procesul specific de creștere este prezentat în figura următoare.
Totuși, rata de trimitere nu poate crește întotdeauna; creșterea trebuie să se oprească la un moment dat. Așadar, când se oprește creșterea ratei de trimitere? Pornirea lentă încheie de obicei creșterea ratei de trimitere într-unul din următoarele moduri:
Prima modalitate este cazul pierderii de pachete în timpul procesului de trimitere cu pornire lentă. Când are loc o pierdere de pachete, TCP setează fereastra de congestie cwnd a expeditorului la 1 și repornește procesul de pornire lentă. În acest moment, se introduce conceptul de prag de pornire lentă ssthresh, a cărui valoare inițială este jumătate din valoarea lui cwnd care generează pierderea de pachete. Adică, atunci când se detectează congestie, valoarea lui ssthresh este jumătate din valoarea ferestrei.
A doua metodă este corelarea directă cu valoarea pragului de pornire lentă ssthresh. Deoarece valoarea lui ssthresh este jumătate din valoarea ferestrei atunci când se detectează congestie, se pot produce pierderi de pachete la fiecare dublare atunci când cwnd este mai mare decât ssthresh. Prin urmare, este recomandat să setați cwnd la ssthresh, ceea ce va determina TCP să treacă în modul de control al congestiei și să încheie pornirea lentă.
Ultima modalitate prin care pornirea lentă se poate termina este dacă sunt detectate trei ACK-uri redundante, TCP efectuând o retransmisie rapidă și intrând în starea de recuperare. (Dacă nu este clar de ce există trei pachete ACK, acest lucru va fi explicat separat în mecanismul de retransmisie.)
Evitarea congestiei
Când TCP intră în starea de control al congestiei, cwnd este setat la jumătate din pragul de congestie ssthresh. Aceasta înseamnă că valoarea lui cwnd nu poate fi dublată de fiecare dată când este primit un segment de pachet. În schimb, se adoptă o abordare relativ conservatoare în care valoarea lui cwnd este crescută cu doar un MSS (lungimea maximă a segmentului de pachet) după finalizarea fiecărei transmisii. De exemplu, chiar dacă sunt confirmate 10 segmente de pachet, valoarea lui cwnd va crește doar cu un MSS. Acesta este un model de creștere liniară și are, de asemenea, o limită superioară a creșterii. Când are loc o pierdere de pachete, valoarea lui cwnd este schimbată într-un MSS, iar valoarea lui ssthresh este setată la jumătate din cwnd. Sau va opri, de asemenea, creșterea MSS atunci când sunt primite 3 răspunsuri ACK redundante. Dacă se primesc încă trei confirmări redundante după înjumătățirea valorii lui cwnd, valoarea lui ssthresh este înregistrată ca jumătate din valoarea lui cwnd și se intră în starea de recuperare rapidă.
Recuperare rapidă
În starea Fast Recovery (Recuperare rapidă), valoarea ferestrei de congestie cwnd este crescută cu un MSS pentru fiecare ACK redundant primit, adică ACK care nu sosește în secvență. Acest lucru are ca scop utilizarea segmentelor de pachete care au fost transmise cu succes în rețea pentru a îmbunătăți cât mai mult posibil eficiența transmisiei.
Când sosește un ACK al segmentului de pachet pierdut, TCP scade valoarea lui cwnd și apoi intră în starea de evitare a congestiei. Acest lucru are rolul de a controla dimensiunea ferestrei de congestie și de a evita creșterea suplimentară a congestiei rețelei.
Dacă apare o expirare după starea de control al congestiei, condiția rețelei devine mai gravă și TCP migrează din starea de evitare a congestiei în starea de pornire lentă. În acest caz, valoarea ferestrei de congestie cwnd este setată la 1 MSS, lungimea maximă a segmentului de pachet, iar valoarea pragului de pornire lentă ssthresh este setată la jumătate din cwnd. Scopul acestei operațiuni este de a crește din nou treptat dimensiunea ferestrei de congestie după ce rețeaua se recuperează, pentru a echilibra rata de transmisie și gradul de congestie a rețelei.
Rezumat
Ca protocol de transport fiabil, TCP implementează transport fiabil prin număr de secvență, confirmare, control al retransmisiei, gestionarea conexiunii și controlul ferestrei. Printre acestea, mecanismul de control al fluxului controlează cantitatea de date trimise de expeditor în funcție de capacitatea reală de recepție a receptorului, ceea ce evită problemele de congestie a 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 fereastră de trimitere sunt corelate, iar cantitatea de date la expeditor este controlată prin ajustarea dinamică a dimensiunii ferestrei de congestie. Pornirea lentă, evitarea congestiei și recuperarea rapidă sunt cele trei părți principale ale algoritmului de control al congestiei TCP, care ajustează dimensiunea ferestrei de congestie prin diferite strategii pentru a se adapta la capacitatea și gradul de congestie al rețelei.
În secțiunea următoare, vom examina în detaliu mecanismul de retransmisie al protocolului TCP. Mecanismul de retransmisie este o parte importantă a protocolului TCP pentru a realiza 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 pe fază!
Data publicării: 24 februarie 2025