Misterele cheie ale conexiunilor TCP de tip Network Packet Broker: A demitizat necesitatea Triple Handshake

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 handshake-ul în trei direcții.

Acest articol va discuta în detaliu principiul, procesul și importanța handshake-ului trilateral. Pas cu pas, vom explica de ce este necesar handshake-ul trilateral, cum asigură stabilitatea și fiabilitatea conexiunii și cât de important este pentru transferul de date. Cu o înțelegere mai profundă a handshake-ului trilateral, vom obține o mai bună înțelegere a mecanismelor care stau la baza comunicării în rețea și o imagine mai clară asupra fiabilității conexiunilor TCP.

Procesul de handshake TCP în trei direcții și tranzițiile de stare
TCP este un protocol de transport orientat pe conexiune, care necesită stabilirea unei conexiuni înainte de transmiterea datelor. Acest proces de stabilire a conexiunii se realizează printr-o strângere de mână în trei direcții.

 Strângere de mână TCP în trei direcții

Să aruncăm o privire mai atentă asupra pachetelor TCP trimise în fiecare conexiune.

Inițial, atât clientul, cât și serverul sunt ÎNCHISE. Mai întâi, 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:

 Pachet SYN

Când un client inițiază o conexiune, acesta generează un număr de secvență inițial aleatoriu (client_isn) și îl plasează în câmpul „Număr de secvență” al antetului TCP. În același timp, clientul setează poziția steagului 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 nivel de aplicație (adică date trimise). În acest moment, starea clientului este marcată ca SYN-SENT.

Pachet SYN+ACK

Când un server primește un pachet SYN de la un client, acesta inițializează aleatoriu propriul număr de serie (server_isn) și apoi introduce acel număr în câmpul „Număr de serie” al antetului TCP. Apoi, serverul introduce client_isn + 1 în câmpul „Număr de confirmare” și setează atât biții SYN, cât și ACK la 1. În final, serverul trimite pachetul către client, care nu conține date la nivelul aplicației (și nici date pe care serverul să le trimită). În acest moment, serverul se află în starea SYN-RCVD.

Pachet ACK

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

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

După cum puteți vedea din procesul de mai sus, atunci când efectuați o handshake în trei direcții, a treia handshake are permisiunea de a transporta date, dar primele două handshake-uri nu. Aceasta este o întrebare care este adesea pusă în interviuri. Odată ce handshake-ul în trei direcții este complet, ambele părți intră în starea ESTABLISHED, indicând faptul 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, ci de patru ori?
Răspunsul obișnuit este: „Deoarece strângerea de mână triplă garantează capacitatea de a primi și trimite”. Acest răspuns este corect, dar este doar un motiv superficial, nu prezintă motivul principal. În continuare, voi analiza motivele strângerii de mână triplă din trei aspecte pentru a aprofunda înțelegerea acestei probleme.

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

Motivul 1: Evitați asocierile duplicate istorice
Pe scurt, principalul motiv pentru stabilirea conexiunii în trei direcții este evitarea confuziei cauzate de inițializarea conexiunii duplicate vechi. Într-un mediu de rețea complex, transmiterea pachetelor de date nu este întotdeauna trimisă către gazda destinație în conformitate cu timpul specificat, iar pachetele de date vechi pot ajunge mai întâi la gazda destinație din cauza congestiei rețelei și a altor motive. Pentru a evita acest lucru, TCP utilizează o stabilire a conexiunii în trei direcții.

strângerea de mână în trei direcții evită conexiunile duplicate istorice

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

1- Pachetele SYN vechi ajung la server înaintea celor mai recente pachete SYN.
2- Serverul va răspunde clientului cu un pachet SYN + ACK după ce primește vechiul pachet SYN.
3- Când clientul primește pachetul SYN + ACK, acesta stabilește că este o conexiune istorică (numărul de secvență a expirat sau a depășit timpul de așteptare) conform propriului context și apoi trimite pachetul RST către server pentru a anula conexiunea.

Cu o conexiune cu două handshake-uri, nu există nicio modalitate de a determina dacă conexiunea curentă este o conexiune istorică. Handshake-ul cu trei direcții permite clientului să determine dacă conexiunea curentă este o conexiune istorică pe baza contextului atunci când este gata să trimită al treilea pachet:

1- Dacă este o conexiune istorică (numărul de secvență a expirat sau a depășit timpul de așteptare), pachetul trimis de a treia handshake este un pachet RST pentru a abandona 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 folosește handshake-ul în trei direcții este că inițializează conexiunea pentru a preveni conexiunile istorice.

Motivul 2: Pentru a sincroniza numerele de secvență inițiale ale ambelor părți
Ambele părți ale protocolului TCP trebuie să mențină un număr de secvență, acesta fiind un factor cheie pentru asigurarea unei transmisii fiabile. Numerele de secvență joacă un rol important în conexiunile TCP. Acestea 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 primit de cealaltă parte, permițând o transmitere fiabilă a datelor.

Prin urmare, la stabilirea unei conexiuni TCP, clientul trimite pachete SYN cu numărul de secvență inițial și solicită serverului să răspundă cu un pachet ACK care indică recepționarea cu succes a pachetului SYN al clientului. Apoi, serverul trimite pachetul SYN cu numărul de secvență inițial 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 handshake în patru direcții este posibilă și 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 handshake în trei direcții. Cu toate acestea, cele două handshake-uri pot garanta doar că numărul de secvență inițial al unei părți este recepționat cu succes de către cealaltă parte, dar nu există nicio garanție că numărul de secvență inițial al ambelor părți poate fi confirmat. Prin urmare, handshake-ul în trei direcții este cea mai bună alegere pentru a asigura stabilitatea și fiabilitatea conexiunilor TCP.

Motivul 3: Evitați risipa resurselor
Dacă există doar o „două handshake-uri”, atunci când cererea SYN a clientului este blocată în rețea, clientul nu poate primi pachetul ACK trimis de server, așadar SYN-ul va fi retransmis. Cu toate acestea, deoarece nu există o a treia handshake-uri, serverul nu poate determina dacă clientul a primit o confirmare ACK pentru a stabili conexiunea. Prin urmare, serverul poate stabili o conexiune doar proactiv după primirea fiecărei cereri SYN. ​​Aceasta duce la următoarele:

Risipă de resurse: Dacă solicitarea SYN a clientului este blocată, rezultând transmiterea repetată a mai multor pachete SYN, serverul va stabili mai multe conexiuni redundante și nevalide după primirea solicitării. Aceasta duce la o risipă inutilă a resurselor serverului.

Reținerea mesajelor: Din cauza lipsei unei a treia handshake-uri, serverul nu are cum să știe dacă clientul a primit corect confirmarea ACK pentru a stabili conexiunea. Drept urmare, dacă mesajele se blochează în rețea, clientul va continua să trimită cereri SYN în mod repetat, ceea ce va determina serverul să stabilească constant noi conexiuni. Acest lucru va crește congestia și întârzierea rețelei și va afecta negativ performanța generală a rețelei.

Evitați risipa de resurse

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

Rezumat
Cel/Cea/Cei/CeleBroker de pachete de rețeaStabilirea conexiunii TCP se face printr-o handshake în trei direcții. În timpul handshake-ului în trei direcții, clientul trimite mai întâi un pachet cu steagul SYN către server, indicând faptul că dorește să stabilească o conexiune. După primirea cererii de la client, serverul răspunde cu un pachet cu steagurile SYN și ACK către client, indicând faptul că cererea de conexiune este acceptată și trimite propriul 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 se află în starea ESTABLISHED și pot începe să își trimită date una către cealaltă.

În general, procesul de handshake în trei direcții pentru stabilirea unei conexiuni TCP este conceput pentru a asigura stabilitatea și fiabilitatea conexiunii, a evita confuzia și risipa de resurse în cazul conexiunilor istorice și a se asigura că ambele părți pot primi și trimite date.


Data publicării: 08 ian. 2025