TCP ryšio sąranka
Naršydami internete, siuntdami el. laišką ar žaisdami internetinį žaidimą, dažnai nepagalvojame apie sudėtingą tinklo ryšį. Tačiau būtent šie, atrodytų, maži žingsniai užtikrina stabilų ryšį tarp mūsų ir serverio. Vienas iš svarbiausių žingsnių yra TCP ryšio nustatymas, o jo esmė – trišalis rankos paspaudimas.
Šiame straipsnyje bus išsamiai aptartas trišalio pasisveikinimo principas, procesas ir svarba. Žingsnis po žingsnio paaiškinsime, kodėl reikalingas trišalis pasisveikinimas, kaip jis užtikrina ryšio stabilumą ir patikimumą, ir koks jis svarbus duomenų perdavimui. Giliau supratę trišalį pasisveikinimą, geriau suprasime pagrindinius tinklo ryšio mechanizmus ir aiškiau suprasime TCP ryšių patikimumą.
TCP trišalis pasisveikinimo procesas ir būsenų perėjimai
TCP yra ryšiu pagrįstas perdavimo protokolas, kuriam reikalingas ryšio užmezgimas prieš duomenų perdavimą. Šis ryšio užmezgimo procesas atliekamas trišaliu rankos paspaudimu.
Atidžiau panagrinėkime TCP paketus, kurie siunčiami kiekviename ryšyje.
Iš pradžių ir klientas, ir serveris yra UŽDARYTI. Pirmiausia serveris aktyviai klausosi prievado ir yra KLAUSYMO būsenoje, o tai reiškia, kad serveris turi būti paleistas. Tada klientas yra pasirengęs pradėti jungtis prie tinklalapio. Jam reikia užmegzti ryšį su serveriu. Pirmojo ryšio paketo formatas yra toks:
Kai klientas inicijuoja ryšį, jis sugeneruoja atsitiktinį pradinį sekos 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, kad parodytų, jog siunčiamas paketas yra SYN paketas. Klientas nurodo, kad nori užmegzti ryšį su serveriu, išsiųsdamas jam pirmąjį SYN paketą. Šiame pakete nėra taikomojo lygio duomenų (t. y. išsiųstų duomenų). Šiuo metu kliento būsena pažymėta kaip SYN-SENT.
Kai serveris gauna SYN paketą iš kliento, jis atsitiktinai inicijuoja savo serijos numerį (server_isn) ir įtraukia šį numerį į TCP antraštės lauką „Serijos numeris“. Tada serveris į lauką „Patvirtinimo numeris“ įveda client_isn + 1 ir nustato SYN bei ACK bitus į 1. Galiausiai serveris siunčia paketą klientui, kuriame nėra jokių taikomojo lygio duomenų (ir jokių duomenų, kuriuos serveris turėtų siųsti). Šiuo metu serveris yra SYN-RCVD būsenoje.
Kai klientas gauna paketą iš serverio, jis turi atlikti šiuos optimizavimus, kad galėtų reaguoti į galutinį atsakomąjį paketą: pirma, klientas nustato atsakomojo 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į. Baigus šias operacijas, klientas pereis į būseną ESTABLISHED.
Kai serveris gauna atsakymo paketą iš kliento, jis taip pat persijungia į būseną „ESTABLISHED“.
Kaip matote iš aukščiau pateikto proceso, atliekant trišalį rankos paspaudimą, trečiuoju rankos paspaudimu leidžiama perduoti duomenis, bet pirmaisiais dviem – ne. Šis klausimas dažnai užduodamas pokalbių metu. Kai trišalis rankos paspaudimas baigtas, abi šalys pereina į UŽKURTA būseną, rodančią, kad ryšys sėkmingai užmegztas, o tada klientas ir serveris gali pradėti siųsti duomenis vienas kitam.
Kodėl trys rankos paspaudimai? Ne du, o keturis kartus?
Dažnas atsakymas yra: „Nes trišalis rankos paspaudimas garantuoja galimybę priimti ir siųsti.“ Šis atsakymas teisingas, tačiau tai tik paviršutiniška priežastis, nenurodanti pagrindinės priežasties. Toliau analizuosiu trišalio rankos paspaudimo priežastis trimis aspektais, kad geriau suprastume šią problemą.
Trišalis rankos paspaudimas gali efektyviai išvengti istoriškai pasikartojančių jungčių inicijavimo (pagrindinė priežastis)
Trišalis rankos paspaudimas garantuoja, kad abi šalys gavo patikimą pradinį sekos numerį.
Trišalis rankos paspaudimas padeda išvengti išteklių švaistymo.
1 priežastis: venkite istorinių pasikartojančių sujungimų
Trumpai tariant, pagrindinė trišalio pasisveikinimo priežastis yra išvengti painiavos, kurią sukelia senas pasikartojantis ryšio inicijavimas. Sudėtingoje tinklo aplinkoje duomenų paketų perdavimas ne visada siunčiamas į paskirties kompiuterį pagal nurodytą laiką, o seni duomenų paketai gali pasiekti paskirties kompiuterį pirmiausia dėl tinklo perkrovos ir kitų priežasčių. Norėdami to išvengti, TCP naudoja trišalį pasisveikinimą ryšiui užmegzti.
Kai klientas siunčia kelis SYN ryšio užmezgimo paketus iš eilės, tokiose situacijose kaip tinklo perkrova, gali įvykti šie įvykiai:
1. Seni SYN paketai į serverį atvyksta anksčiau nei naujausi SYN paketai.
2. Gavęs seną SYN paketą, serveris klientui atsakys SYN + ACK paketu.
3. Kai klientas gauna SYN + ACK paketą, jis pagal savo kontekstą nustato, kad ryšys yra istorinis (sekos numeris pasibaigęs arba skirtasis laikas pasibaigęs), ir tada siunčia RST paketą serveriui, kad nutrauktų ryšį.
Dviejų rankų paspaudimo atveju nėra jokio būdo nustatyti, ar dabartinis ryšys yra istorinis. Trijų krypčių rankų paspaudimas leidžia klientui nustatyti, ar dabartinis ryšys yra istorinis, remiantis kontekstu, kai jis yra pasiruošęs siųsti trečiąjį paketą:
1. Jei tai istorinis ryšys (sekos numeris pasibaigęs arba skirtasis laikas pasibaigęs), trečiojo patvirtinimo metu išsiųstas paketas yra RST paketas, skirtas nutraukti istorinį ryšį.
2. Jei tai nėra istorinis ryšys, trečią kartą išsiųstas paketas yra ACK paketas, ir abi bendraujančios šalys sėkmingai užmezga ryšį.
Todėl pagrindinė priežastis, kodėl TCP naudoja trišalį rankos paspaudimą, yra ta, kad jis inicijuoja ryšį, kad būtų išvengta istorinių ryšių.
2 priežastis: sinchronizuoti abiejų šalių pradinius sekos numerius
Abi TCP protokolo pusės turi turėti sekos numerį, kuris yra pagrindinis veiksnys užtikrinant patikimą perdavimą. Sekos numeriai vaidina svarbų vaidmenį TCP ryšiuose. Jie atlieka šias funkcijas:
Gavėjas gali pašalinti pasikartojančius duomenis ir užtikrinti duomenų tikslumą.
Imtuvas gali priimti paketus eilės numerio tvarka, kad užtikrintų duomenų vientisumą.
● Sekos numeris gali identifikuoti duomenų paketą, kurį gavo kita šalis, taip užtikrindamas patikimą duomenų perdavimą.
Todėl, užmezgus TCP ryšį, klientas siunčia SYN paketus su pradiniu sekos numeriu ir reikalauja, kad serveris atsakytų ACK paketu, rodančiu sėkmingą kliento SYN paketo priėmimą. Tada serveris siunčia SYN paketą su pradiniu sekos numeriu klientui ir laukia kliento atsakymo kartą ir visiems laikams, kad įsitikintų, jog pradiniai sekos numeriai yra patikimai sinchronizuoti.
Nors keturių šalių rankų paspaudimas taip pat gali patikimai sinchronizuoti abiejų šalių pradinius sekos numerius, antrasis ir trečiasis žingsniai gali būti sujungti į vieną žingsnį, gaunant trijų šalių rankų paspaudimą. Tačiau du rankų paspaudimai gali garantuoti tik tai, kad vienos šalies pradinis sekos numeris bus sėkmingai gautas kitos šalies, bet nėra garantijos, kad abiejų šalių pradinis sekos numeris bus patvirtintas. Todėl trijų šalių rankų paspaudimas yra geriausias pasirinkimas siekiant užtikrinti TCP ryšių stabilumą ir patikimumą.
3 priežastis: venkite švaistyti išteklius
Jei įvyksta tik „dviejų rankų paspaudimas“, kai kliento SYN užklausa tinkle yra užblokuota, klientas negali gauti serverio išsiųsto ACK paketo, todėl SYN bus išsiųstas iš naujo. Tačiau kadangi nėra trečio rankų paspaudimo, serveris negali nustatyti, ar klientas gavo ACK patvirtinimą ryšiui užmegzti. Todėl serveris gali aktyviai užmegzti ryšį tik gavęs kiekvieną SYN užklausą. Tai lemia:
Išteklių švaistymas: jei kliento SYN užklausa yra blokuojama ir dėl to pakartotinai siunčiami keli SYN paketai, serveris, gavęs užklausą, užmegs kelis nereikalingus negaliojančius ryšius. Tai veda prie nereikalingo serverio išteklių švaistymo.
Pranešimų išsaugojimas: dėl trečio patvirtinimo nebuvimo serveris negali žinoti, ar klientas teisingai gavo ACK patvirtinimą ryšiui užmegzti. Todėl, jei pranešimai užstringa tinkle, klientas nuolat siunčia SYN užklausas, todėl serveris nuolat užmezga naujus ryšius. Tai padidina tinklo apkrovą ir vėlinimą bei neigiamai veikia bendrą tinklo našumą.
Todėl, siekiant užtikrinti tinklo ryšio stabilumą ir patikimumą, TCP naudoja trijų krypčių rankos paspaudimą ryšiui užmegzti, kad būtų išvengta šių problemų.
Santrauka
TheTinklo paketų tarpininkasTCP ryšio užmezgimas atliekamas trišaliu susitarimu. Trišalio susitarimo metu klientas pirmiausia siunčia serveriui paketą su SYN vėliavėle, nurodydamas, kad nori užmegzti ryšį. Gavęs kliento užklausą, serveris atsako klientui paketu su SYN ir ACK vėliavėlėmis, nurodydamas, kad ryšio užklausa priimta, ir siunčia savo pradinį sekos numerį. Galiausiai klientas atsako serveriui ACK vėliavėle, nurodydamas, kad ryšys sėkmingai užmegztas. Taigi, abi šalys yra UŽKURTOS būsenoje ir gali pradėti siųsti duomenis viena kitai.
Apskritai, trijų krypčių pasisveikinimo procesas TCP ryšiui užmegzti 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ų priimti ir siųsti duomenis.
Įrašo laikas: 2025 m. sausio 8 d.