Misterele cheie ale conexiunilor TCP Network Packet Broker: a demistificat nevoia de strângere de mână triplă

Configurarea conexiunii TCP
Când navigăm pe web, trimitem un e-mail sau jucăm un joc online, adesea nu ne gândim la conexiunea complexă de rețea din spatele acesteia. Cu toate acestea, acești pași aparent mici asigură o comunicare stabilă între noi și server. Unul dintre cei mai importanți pași este configurarea conexiunii TCP, iar nucleul acesteia este strângerea de mână în trei căi.

Acest articol va discuta în detaliu principiul, procesul și importanța strângerii de mână în trei căi. Pas cu pas, vom explica de ce este nevoie de strângere de mână în trei căi, cum asigură stabilitatea și fiabilitatea conexiunii și cât de important este pentru transferul de date. Cu o înțelegere mai profundă a strângerii de mână în trei căi, vom obține o mai bună înțelegere a mecanismelor de bază ale comunicării în rețea și o vedere mai clară a fiabilității conexiunilor TCP.

Procesul de strângere de mână în trei căi TCP și tranzițiile de stat
TCP este un protocol de transport orientat spre conexiune, care necesită stabilirea conexiunii înainte de transmiterea datelor. Acest proces de stabilire a conexiunii se face printr-o strângere de mână în trei căi.

 Strângere de mână în trei căi TCP

Să aruncăm o privire mai atentă la pachetele TCP care sunt trimise în fiecare conexiune.

Inițial, atât clientul, cât și serverul sunt ÎNCHIși. În primul rând, serverul ascultă activ pe un port și se află în starea LISTEN, ceea ce înseamnă că serverul trebuie pornit. Apoi, clientul este gata să înceapă să acceseze pagina web. Trebuie să stabilească o conexiune cu serverul. Formatul primului pachet de conexiune este următorul:

 Pachetul SYN

Când un client inițiază o conexiune, generează un număr de secvență inițial aleatoriu (client_isn) și îl plasează în câmpul „Număr de secvență” din antetul TCP. În același timp, clientul setează poziția flag SYN la 1 pentru a indica faptul că pachetul de ieșire este un pachet SYN. Clientul indică faptul că dorește să stabilească o conexiune cu serverul prin trimiterea primului pachet SYN către server. Acest pachet nu conține date de la nivelul aplicației (adică date trimise). În acest moment, starea clientului este marcată ca SYN-SENT.

Pachetul SYN+ACK

Când un server primește un pachet SYN de la un client, își inițializează aleatoriu propriul număr de serie (server_isn) și apoi pune acel număr în câmpul „Număr de serie” din antetul TCP. Apoi, serverul introduce client_isn + 1 în câmpul „Acknowledgement number” și setează atât biții SYN, cât și ACK la 1. În cele din urmă, serverul trimite pachetul către client, care nu conține date de la nivelul aplicației (și nici date pentru server). a trimite). În acest moment, serverul este în starea SYN-RCVD.

Pachetul ACK

Odată ce clientul primește pachetul de la server, trebuie să efectueze următoarele optimizări pentru a răspunde la pachetul de răspuns final: În primul rând, clientul setează bitul ACK al antetului TCP al pachetului de răspuns la 1; În al doilea rând, clientul introduce valoarea server_isn + 1 în câmpul „Confirmați numărul răspunsului”; În cele din urmă, clientul trimite pachetul către server. Acest pachet poate transporta date de la client la server. La finalizarea acestor operațiuni, clientul va intra în starea STABILIT.

Odată ce serverul primește pachetul de răspuns de la client, trece și la starea ESTABLISHED.

După cum puteți vedea din procesul de mai sus, atunci când efectuați o strângere de mână în trei direcții, a treia strângere de mână este permisă să transporte date, dar primele două strângeri de mână nu sunt. Aceasta este o întrebare care se pune adesea în interviuri. Odată ce strângerea de mână în trei căi este încheiată, ambele părți intră în starea ESTABLISHED, indicând că conexiunea a fost stabilită cu succes, moment în care clientul și serverul pot începe să își trimită date unul altuia.

De ce trei strângeri de mână? Nu de două ori, de patru ori?
Răspunsul obișnuit este: „Pentru că strângerea de mână în trei direcții garantează capacitatea de a primi și de a trimite”. Acest răspuns este corect, dar este doar motivul de suprafață, nu prezintă motivul principal. În cele ce urmează, voi analiza motivele strângerii triple de mână din trei aspecte pentru a ne aprofunda înțelegerea acestei probleme.

Strângerea de mână în trei căi poate evita în mod eficient inițializarea conexiunilor repetate istoric (motivul principal)
Strângerea de mână în trei direcții garantează că ambele părți au primit un număr de secvență inițial de încredere.
Strângerea de mână în trei direcții evită irosirea resurselor.

Motivul 1: Evitați asocierile istorice duplicate
Pe scurt, principalul motiv pentru strângerea de mână în trei căi este evitarea confuziei cauzate de vechea inițializare a conexiunii duplicate. Într-un mediu de rețea complex, transmisia pachetelor de date nu este întotdeauna trimisă la gazda de destinație în conformitate cu ora specificată, iar pachetele de date vechi pot ajunge mai întâi la gazda de destinație din cauza congestiei rețelei și din alte motive. Pentru a evita acest lucru, TCP folosește o strângere de mână în trei căi pentru a stabili conexiunea.

strângerea de mână în trei căi evită conexiunile istorice duplicate

Când un client trimite mai multe pachete de stabilire a conexiunii SYN în succesiune, în situații precum congestionarea rețelei, pot apărea următoarele:

1- Vechile pachete SYN ajung la server înainte de cele mai recente pachete SYN.
2- Serverul va răspunde clientului un pachet SYN + ACK după ce a primit vechiul pachet SYN.
3- Când clientul primește pachetul SYN + ACK, acesta determină că conexiunea este o conexiune istorică (număr de secvență a expirat sau timeout) conform propriului context, apoi trimite pachetul RST către server pentru a anula conexiunea.

Cu o conexiune cu două strângeri de mână, nu există nicio modalitate de a determina dacă conexiunea actuală este o conexiune istorică. Strângerea de mână în trei căi permite clientului să determine dacă conexiunea curentă este o conexiune istorică pe baza contextului când este gata să trimită al treilea pachet:

1- Dacă este o conexiune istorică (numărul de secvență a expirat sau timeout), pachetul trimis de a treia strângere de mână este un pachet RST pentru a anula conexiunea istorică.
2- Dacă nu este o conexiune istorică, pachetul trimis pentru a treia oară este un pachet ACK, iar cele două părți care comunică stabilesc cu succes conexiunea.

Prin urmare, principalul motiv pentru care TCP utilizează strângerea de mână în trei căi este că inițializează conexiunea pentru a preveni conexiunile istorice.

Motivul 2: Pentru a sincroniza numerele de ordine inițiale ale ambelor părți
Ambele părți ale protocolului TCP trebuie să mențină un număr de secvență, care este un factor cheie pentru a asigura o transmisie fiabilă. Numerele de secvență joacă un rol important în conexiunile TCP. Ele fac următoarele:

Receptorul poate elimina datele duplicate și poate asigura acuratețea datelor.

Receptorul poate primi pachete în ordinea numărului de secvență pentru a asigura integritatea datelor.

● Numărul de secvență poate identifica pachetul de date care a fost primit de cealaltă parte, permițând transmiterea fiabilă a datelor.

Prin urmare, la stabilirea unei conexiuni TCP, clientul trimite pachete SYN cu numărul inițial de secvență și solicită serverului să răspundă cu un pachet ACK care indică recepția cu succes a pachetului SYN al clientului. Apoi, serverul trimite pachetul SYN cu numărul inițial de secvență către client și așteaptă ca clientul să răspundă, o dată pentru totdeauna, pentru a se asigura că numerele de secvență inițiale sunt sincronizate în mod fiabil.

Sincronizați numerele de serie inițiale ale ambelor părți

Deși o strângere de mână în patru căi este, de asemenea, posibilă pentru a sincroniza în mod fiabil numerele de secvență inițiale ale ambelor părți, al doilea și al treilea pas pot fi combinați într-un singur pas, rezultând o strângere de mână în trei căi. Cu toate acestea, cele două strângeri de mână pot garanta doar că numărul inițial de secvență al uneia dintre părți este primit cu succes de cealaltă parte, dar nu există nicio garanție că numărul inițial de secvență al ambelor părți poate fi confirmat. Prin urmare, strângerea de mână în trei căi este cea mai bună alegere de luat pentru a asigura stabilitatea și fiabilitatea conexiunilor TCP.

Motivul 3: Evitați irosirea resurselor
Dacă există doar o „două strângere de mână”, când cererea SYN a clientului este blocată în rețea, clientul nu poate primi pachetul ACK trimis de server, astfel încât SYN-ul va fi retrimis. Cu toate acestea, deoarece nu există o a treia strângere de mână, serverul nu poate determina dacă clientul a primit o confirmare ACK pentru a stabili conexiunea. Prin urmare, serverul poate stabili în mod proactiv o conexiune numai după primirea fiecărei cereri SYN. Acest lucru duce la următoarele:

Risipirea resurselor: Dacă cererea SYN a clientului este blocată, ducând la transmiterea repetată a mai multor pachete SYN, serverul va stabili mai multe conexiuni nevalide redundante după primirea cererii. Acest lucru duce la o risipă inutilă a resurselor serverului.

Reținerea mesajelor: Din cauza lipsei unei a treia strângeri de mână, serverul nu are de unde să știe dacă clientul a primit corect confirmarea ACK pentru a stabili conexiunea. Ca rezultat, dacă mesajele rămân blocate în rețea, clientul va continua să trimită cereri SYN din nou și din nou, determinând serverul să stabilească constant noi conexiuni. Acest lucru va crește congestionarea și întârzierea rețelei și va afecta negativ performanța generală a rețelei.

Evitați irosirea resurselor

Prin urmare, pentru a asigura stabilitatea și fiabilitatea conexiunii la rețea, TCP folosește handshake-ul în trei căi pentru a stabili conexiunea pentru a evita apariția acestor probleme.

Rezumat
TheNetwork Packet BrokerStabilirea conexiunii TCP se face cu o strângere de mână în trei căi. În timpul strângerii de mână în trei căi, clientul trimite mai întâi un pachet cu steag SYN către server, indicând că dorește să stabilească o conexiune. După ce a primit cererea de la client, serverul răspunde unui pachet cu steagurile SYN și ACK către client, indicând că cererea de conectare este acceptată și trimite propriul său număr de secvență inițial. În cele din urmă, clientul răspunde cu un steag ACK către server pentru a indica faptul că conexiunea a fost stabilită cu succes. Astfel, cele două părți sunt în starea STABILIT și pot începe să-și trimită date unul către celălalt.

În general, procesul de strângere de mână în trei căi pentru stabilirea conexiunii TCP este conceput pentru a asigura stabilitatea și fiabilitatea conexiunii, pentru a evita confuzia și risipa de resurse prin conexiunile istorice și pentru a se asigura că ambele părți sunt capabile să primească și să trimită date.


Ora postării: 08-ian-2025