Pagrindinės tinklo paketų brokerio TCP ryšių paslaptys: išspręstas trigubo rankos paspaudimo poreikis

TCP ryšio sąranka
Kai naršome žiniatinklį, siunčiame el. laišką ar žaidžiame internetinį žaidimą, dažnai nesusimąstome apie sudėtingą tinklo ryšį. Tačiau būtent šie iš pažiūros nedideli žingsneliai užtikrina stabilų ryšį tarp mūsų ir serverio. Vienas iš svarbiausių žingsnių yra TCP ryšio nustatymas, o jo esmė yra trijų krypčių rankos paspaudimas.

Šiame straipsnyje bus išsamiai aptariamas trijų krypčių rankos paspaudimo principas, procesas ir svarba. Žingsnis po žingsnio paaiškinsime, kam reikalingas trijų krypčių rankos paspaudimas, kaip jis užtikrina ryšio stabilumą ir patikimumą bei kiek jis svarbus duomenų perdavimui. Giliau suprasdami trijų krypčių rankos paspaudimą, geriau suprasime pagrindinius tinklo komunikacijos mechanizmus ir aiškesnį vaizdą apie TCP jungčių patikimumą.

TCP trijų krypčių rankos paspaudimo procesas ir būsenos perėjimai
TCP yra į ryšį orientuotas perdavimo protokolas, kuriam prieš perduodant duomenis reikalingas ryšys. Šis ryšio užmezgimo procesas atliekamas trijų krypčių rankos paspaudimu.

 TCP trijų krypčių rankos paspaudimas

Pažvelkime atidžiau į TCP paketus, kurie siunčiami kiekviename ryšyje.

Iš pradžių ir klientas, ir serveris yra UŽDARYTI. Pirma, serveris aktyviai klausosi prievado ir yra LISTEN būsenoje, o tai reiškia, kad serveris turi būti paleistas. Tada klientas yra pasirengęs pradėti pasiekti tinklalapį. Jis turi užmegzti ryšį su serveriu. Pirmojo ryšio paketo formatas yra toks:

 SYN paketas

Kai klientas inicijuoja ryšį, jis sugeneruoja atsitiktinį pradinį eilės numerį (client_isn) ir įdeda jį į TCP antraštės lauką "Sekos numeris". Tuo pačiu metu klientas nustato SYN vėliavėlės padėtį į 1, nurodydamas, kad siunčiamas paketas yra SYN paketas. Klientas nurodo, kad nori užmegzti ryšį su serveriu, išsiųsdamas serveriui pirmąjį SYN paketą. Šiame pakete nėra taikomųjų programų lygmens duomenų (ty išsiųstų duomenų). Šiuo metu kliento būsena pažymėta kaip SYN-SENT.

SYN+ACK paketas

Kai serveris gauna SYN paketą iš kliento, jis atsitiktinai inicijuoja savo serijos numerį (server_isn) ir įdeda tą numerį į TCP antraštės lauką "Serial number". Tada serveris įveda client_isn + 1 lauke „Patvirtinimo numeris“ ir nustato SYN ir ACK bitus į 1. Galiausiai serveris klientui siunčia paketą, kuriame nėra taikomųjų programų lygmens duomenų (ir serverio duomenų). siųsti). Šiuo metu serveris yra SYN-RCVD būsenoje.

ACK paketas

Kai klientas gauna paketą iš serverio, jis turi atlikti šiuos optimizavimus, kad reaguotų į galutinį atsakymo paketą: Pirma, klientas nustato atsakymo paketo TCP antraštės ACK bitą į 1; Antra, klientas įveda reikšmę server_isn + 1 lauke "Patvirtinti atsakymo numerį"; Galiausiai klientas siunčia paketą į serverį. Šis paketas gali perduoti duomenis iš kliento į serverį. Baigęs šias operacijas, klientas pereis į NUSTATYTA būseną.

Kai serveris gauna atsakymo paketą iš kliento, jis taip pat persijungia į NUSTATYTA būseną.

Kaip matote iš aukščiau pateikto proceso, atliekant trijų krypčių rankos paspaudimą, trečiajam rankos paspaudimui leidžiama perduoti duomenis, tačiau pirmiems dviem rankos paspaudimams – ne. Tai klausimas, kuris dažnai užduodamas interviu. Pasibaigus trijų krypčių rankos paspaudimui, abi šalys pereina į NUSTATYTA būseną, o tai rodo, kad ryšys sėkmingai užmegztas, tada klientas ir serveris gali pradėti siųsti duomenis vienas kitam.

Kodėl trys rankos paspaudimai? Ne du, keturis kartus?
Dažnas atsakymas yra toks: „Nes trijų krypčių rankos paspaudimas garantuoja galimybę priimti ir siųsti“. Šis atsakymas yra teisingas, bet tai tik paviršinė priežastis, nenurodo pagrindinės priežasties. Toliau panagrinėsiu trigubo rankos paspaudimo priežastis trimis aspektais, kad geriau suprastume šią problemą.

Trijų krypčių rankos paspaudimas gali veiksmingai išvengti istoriškai pasikartojančių ryšių inicijavimo (pagrindinė priežastis)
Trijų krypčių rankos paspaudimas garantuoja, kad abi šalys gavo patikimą pradinį eilės numerį.
Trijų krypčių rankos paspaudimas leidžia išvengti išteklių švaistymo.

1 priežastis: venkite istorinių pasikartojančių sujungimų
Trumpai tariant, pagrindinė trijų krypčių rankos paspaudimo priežastis yra išvengti painiavos, kurią sukelia senas pasikartojančio ryšio inicijavimas. Sudėtingoje tinklo aplinkoje duomenų paketai ne visada siunčiami į paskirties pagrindinį kompiuterį per nurodytą laiką, o seni duomenų paketai pirmiausia gali patekti į paskirties pagrindinį kompiuterį dėl tinklo perkrovos ir kitų priežasčių. Kad to išvengtų, TCP ryšiui užmegzti naudoja trijų krypčių rankos paspaudimą.

trijų krypčių rankos paspaudimas leidžia išvengti istorinių pasikartojančių ryšių

Kai klientas siunčia kelis SYN ryšio užmezgimo paketus iš eilės, tokiose situacijose kaip tinklo perkrova, gali įvykti:

1- Senieji SYN paketai į serverį patenka anksčiau nei naujausi SYN paketai.
2- Serveris atsakys į SYN + ACK paketą klientui, gavęs seną SYN paketą.
3. Kai klientas gauna SYN + ACK paketą, jis nustato, kad ryšys yra istorinis ryšys (sekos numeris pasibaigęs arba skirtasis laikas) pagal savo kontekstą, ir tada siunčia RST paketą į serverį, kad nutrauktų ryšį.

Naudojant dviejų rankų paspaudimų ryšį, neįmanoma nustatyti, ar dabartinis ryšys yra istorinis ryšys. Trijų krypčių rankos paspaudimas leidžia klientui nustatyti, ar dabartinis ryšys yra istorinis ryšys, remiantis kontekstu, kai jis yra pasirengęs siųsti trečiąjį paketą:

1- Jei tai istorinis ryšys (baigėsi eilės numeris arba baigėsi skirtasis laikas), trečiojo rankos paspaudimo siunčiamas paketas yra RST paketas, kuriuo nutraukiamas istorinis ryšys.
2- Jei tai nėra istorinis ryšys, trečią kartą išsiųstas paketas yra ACK paketas, o abi bendraujančios šalys sėkmingai užmezga ryšį.

Todėl pagrindinė priežastis, kodėl TCP naudoja trijų krypčių rankos paspaudimą, yra ta, kad inicijuoja ryšį, kad būtų išvengta istorinių ryšių.

2 priežastis: sinchronizuoti abiejų šalių pradinius eilės numerius
Abi TCP protokolo pusės turi išlaikyti eilės numerį, kuris yra pagrindinis veiksnys siekiant užtikrinti patikimą perdavimą. Sekos numeriai atlieka svarbų vaidmenį TCP ryšiuose. Jie atlieka šiuos veiksmus:

Imtuvas gali pašalinti pasikartojančius duomenis ir užtikrinti duomenų tikslumą.

Imtuvas gali priimti paketus eilės numerio tvarka, kad būtų užtikrintas duomenų vientisumas.

● Eilės numeris gali identifikuoti duomenų paketą, kurį gavo kita šalis, todėl galima patikimai perduoti duomenis.

Todėl, užmezgęs TCP ryšį, klientas siunčia SYN paketus su pradiniu eilės numeriu ir reikalauja, kad serveris atsakytų ACK paketu, nurodant sėkmingą kliento SYN paketo priėmimą. Tada serveris siunčia klientui SYN paketą su pradiniu eilės numeriu ir laukia, kol klientas atsakys kartą ir visiems laikams, kad įsitikintų, jog pradiniai eilės numeriai yra patikimai sinchronizuoti.

Sinchronizuokite pradinius abiejų šalių serijos numerius

Nors keturių krypčių rankos paspaudimas taip pat gali patikimai sinchronizuoti abiejų šalių pradinius eilės numerius, antrasis ir trečiasis žingsniai gali būti sujungti į vieną veiksmą, todėl gaunamas trijų krypčių rankos paspaudimas. Tačiau du rankos paspaudimai gali garantuoti tik tai, kad vienos šalies pradinį eilės numerį sėkmingai gaus kita šalis, tačiau nėra garantijos, kad bus patvirtintas abiejų šalių pradinis eilės numeris. Todėl trijų krypčių rankos paspaudimas yra geriausias pasirinkimas siekiant užtikrinti TCP ryšių stabilumą ir patikimumą.

3 priežastis: venkite eikvoti išteklius
Jei yra tik „dviejų rankų paspaudimas“, kai tinkle užblokuota kliento SYN užklausa, klientas negali gauti serverio siunčiamo ACK paketo, todėl SYN bus išsiųstas iš naujo. Tačiau kadangi nėra trečiojo rankos paspaudimo, serveris negali nustatyti, ar klientas gavo ACK patvirtinimą, kad užmegztų ryšį. Todėl serveris gali aktyviai užmegzti ryšį tik gavęs kiekvieną SYN užklausą. Tai veda prie šių dalykų:

Išteklių švaistymas: jei kliento SYN užklausa užblokuojama, todėl pakartotinai perduodami keli SYN paketai, serveris, gavęs užklausą, užmegs kelis nereikalingus netinkamus ryšius. Tai veda prie nereikalingo serverio išteklių švaistymo.

Pranešimo išlaikymas: dėl to, kad nėra trečiojo rankos paspaudimo, serveris negali žinoti, ar klientas teisingai gavo ACK patvirtinimą, kad užmegztų ryšį. Dėl to, jei pranešimai įstringa tinkle, klientas nuolat siųs SYN užklausas, todėl serveris nuolatos užmegs naujus ryšius. Tai padidins tinklo perkrovą ir vėlavimą bei neigiamai paveiks bendrą tinklo našumą.

Venkite eikvoti išteklius

Todėl, siekdamas užtikrinti tinklo ryšio stabilumą ir patikimumą, TCP naudoja trijų krypčių rankos paspaudimą ryšiui užmegzti, kad išvengtų šių problemų.

Santrauka
TheTinklo paketų brokerisTCP ryšio užmezgimas atliekamas trijų krypčių rankos paspaudimu. Trijų krypčių rankos paspaudimo metu klientas pirmiausia siunčia į serverį paketą su SYN vėliava, nurodydamas, kad nori užmegzti ryšį. Gavęs užklausą iš kliento, serveris atsako klientui paketą su SYN ir ACK vėliavėlėmis, nurodydamas, kad prisijungimo užklausa priimta, ir išsiunčia savo pradinį eilės numerį. Galiausiai klientas atsako su ACK vėliava serveriui, nurodydamas, kad ryšys sėkmingai užmegztas. Taigi, abi šalys yra NUSTATYTOS būsenos ir gali pradėti siųsti duomenis viena kitai.

Apskritai, TCP ryšio užmezgimo trijų krypčių rankų paspaudimo procesas yra skirtas užtikrinti ryšio stabilumą ir patikimumą, išvengti painiavos ir išteklių švaistymo dėl istorinių ryšių ir užtikrinti, kad abi šalys galėtų gauti ir siųsti duomenis.


Paskelbimo laikas: 2025-08-08