TCP-ühenduse seadistamine
Veebis surfates, e-kirja saates või võrgumänge mängides ei mõtle me tihtipeale selle taga peituvale keerukale võrguühendusele. Kuid just need pealtnäha väikesed sammud tagavad stabiilse suhtluse meie ja serveri vahel. Üks olulisemaid samme on TCP-ühenduse loomine ja selle tuumaks on kolmepoolne käepigistus.
See artikkel käsitleb üksikasjalikult kolmepoolse käepigistuse põhimõtet, protsessi ja olulisust. Samm-sammult selgitame, miks on kolmepoolne käepigistus vajalik, kuidas see tagab ühenduse stabiilsuse ja usaldusväärsuse ning kui oluline see on andmeedastuse jaoks. Kolmepoolse käepigistuse sügavama mõistmisega saame parema arusaama võrgukommunikatsiooni alusmehhanismidest ja selgema ülevaate TCP-ühenduste usaldusväärsusest.
TCP kolmepoolne käepigistusprotsess ja oleku üleminekud
TCP on ühendusepõhine transpordiprotokoll, mis nõuab enne andmeedastust ühenduse loomist. See ühenduse loomise protsess toimub kolmepoolse käepigistuse abil.
Vaatleme lähemalt iga ühenduse käigus saadetavaid TCP-pakette.
Algselt on nii klient kui ka server SULETUD. Esiteks kuulab server aktiivselt porti ja on KUULAMISE olekus, mis tähendab, et server tuleb käivitada. Seejärel on klient valmis veebilehele juurde pääsema. See peab serveriga ühenduse looma. Esimese ühenduspaketi vorming on järgmine:
Kui klient ühenduse loob, genereerib ta juhusliku esialgse järjekorranumbri (client_isn) ja paigutab selle TCP päise väljale "Järjekorranumber". Samal ajal seab klient SYN-lipu positsiooniks 1, et näidata, et väljaminev pakett on SYN-pakett. Klient näitab, et soovib serveriga ühenduse luua, saates serverile esimese SYN-paketi. See pakett ei sisalda rakenduskihi andmeid (st saadetud andmeid). Sel hetkel on kliendi olekuks märgitud SYN-SENT.
Kui server saab kliendilt SYN-paketi, initsialiseerib see juhuslikult oma seerianumbri (server_isn) ja lisab selle numbri TCP päise väljale „Serial number“. Seejärel sisestab server väljale „Acknowledgement number“ numbri client_isn + 1 ning määrab nii SYN- kui ka ACK-bitid väärtuseks 1. Lõpuks saadab server kliendile paketi, mis ei sisalda rakenduskihi andmeid (ega andmeid, mida server peaks saatma). Sel ajal on server olekus SYN-RCVD.
Kui klient on serverilt paketi kätte saanud, peab ta lõplikule vastusepaketile vastamiseks tegema järgmised optimeerimised: esiteks seab klient vastusepaketi TCP päise ACK-biti väärtuseks 1; teiseks sisestab klient väljale „Kinnita vastuse number“ väärtuse server_isn + 1; lõpuks saadab klient paketi serverisse. See pakett saab andmeid kliendilt serverisse edastada. Pärast nende toimingute lõpetamist läheb klient olekusse ESTABLISHED.
Kui server on kliendilt vastusepaketi kätte saanud, lülitub see samuti olekusse ESTABLISHED.
Nagu ülaltoodud protsessist näha, on kolmepoolse käepigistuse korral lubatud kolmandal käepigistusel andmeid edastada, kuid kahel esimesel käepigistusel mitte. Seda küsimust küsitakse intervjuudes sageli. Kui kolmepoolne käepigistus on lõppenud, lähevad mõlemad pooled olekusse ESTABLISHED, mis näitab, et ühendus on edukalt loodud, mille järel klient ja server saavad hakata üksteisele andmeid saatma.
Miks kolm käepigistust? Mitte kaks, vaid neli korda?
Levinud vastus on: „Sest kolmepoolne käepigistus tagab vastuvõtmise ja saatmise võimaluse.“ See vastus on õige, kuid see on vaid pealiskaudne põhjus ega too esile peamist põhjust. Järgnevalt analüüsin kolmekordse käepigistuse põhjuseid kolmest aspektist, et süvendada meie arusaamist sellest küsimusest.
Kolmepoolne käepigistus aitab tõhusalt vältida ajalooliselt korduvate ühenduste initsialiseerimist (peamine põhjus)
Kolmepoolne käepigistus tagab, et mõlemad pooled on saanud usaldusväärse esialgse järjekorranumbri.
Kolmepoolne käepigistus väldib ressursside raiskamist.
Põhjus 1: Vältige ajaloolisi duplikaatliitmisi
Lühidalt öeldes on kolmepoolse käepigistuse peamine eesmärk vältida segadust, mis on põhjustatud vanast duplikaatühenduse initsialiseerimisest. Keerulises võrgukeskkonnas ei saadeta andmepakette sihtmasinale alati ettenähtud aja jooksul ning vanad andmepaketid võivad võrgu ülekoormuse ja muude põhjuste tõttu sihtmasinale esimesena jõuda. Selle vältimiseks kasutab TCP ühenduse loomiseks kolmepoolset käepigistust.
Kui klient saadab järjest mitu SYN-ühenduse loomise paketti, näiteks võrgu ülekoormuse korral, võib juhtuda järgmine:
1- Vanad SYN-paketid saabuvad serverisse enne uusimaid SYN-pakette.
2- Pärast vana SYN-paketi kättesaamist vastab server kliendile SYN + ACK-paketiga.
3. Kui klient saab SYN + ACK paketi, määrab ta oma konteksti põhjal, et tegemist on ajaloolise ühendusega (järjekorranumber on aegunud või ajalõpp), ja saadab seejärel RST paketi serverile ühenduse katkestamiseks.
Kahe käepigistusega ühenduse puhul pole võimalik kindlaks teha, kas praegune ühendus on ajalooline. Kolmepoolne käepigistus võimaldab kliendil konteksti põhjal kindlaks teha, kas praegune ühendus on ajalooline, kui ta on valmis kolmandat paketti saatma:
1. Kui tegemist on ajaloolise ühendusega (järjekorranumber on aegunud või ajalõpp), on kolmanda käepigistusega saadetud pakett RST-pakett ajaloolise ühenduse katkestamiseks.
2- Kui tegemist pole ajaloolise ühendusega, on kolmandat korda saadetud pakett ACK-pakett ja kaks suhtlevat osapoolt loovad ühenduse edukalt.
Seega on TCP kolmepoolse käepigistuse kasutamise peamine põhjus ühenduse initsialiseerimine ajalooliste ühenduste vältimiseks.
Põhjus 2: Mõlema poole esialgsete järjekorranumbrite sünkroniseerimiseks
TCP-protokolli mõlemad pooled peavad säilitama järjekorranumbri, mis on usaldusväärse edastuse tagamise võtmetegur. Järjekorranumbritel on TCP-ühendustes oluline roll. Need teevad järgmist:
Vastuvõtja saab kõrvaldada duplikaatandmed ja tagada andmete täpsuse.
Vastuvõtja saab andmete terviklikkuse tagamiseks pakette vastu võtta järjekorranumbri järjekorras.
● Järjekorranumber suudab tuvastada teise osapoole poolt vastuvõetud andmepaketi, võimaldades usaldusväärset andmeedastust.
Seega saadab klient TCP-ühenduse loomisel SYN-pakette algse järjekorranumbriga ja nõuab serverilt ACK-paketi vastust, mis näitab kliendi SYN-paketi edukat vastuvõtmist. Seejärel saadab server kliendile SYN-paketi algse järjekorranumbriga ja ootab kliendi lõplikku vastust, et tagada algsete järjekorranumbrite usaldusväärne sünkroniseerimine.
Kuigi neljapoolse käepigistusega on võimalik usaldusväärselt sünkroniseerida mõlema poole esialgseid järjekorranumbreid, saab teise ja kolmanda sammu ühendada üheks sammuks, mille tulemuseks on kolmepoolse käepigistus. Kaks käepigistust garanteerivad aga ainult ühe poole esialgse järjekorranumbri eduka vastuvõtmise teise poole poolt, kuid puudub garantii, et mõlema poole esialgset järjekorranumbrit saab kinnitada. Seetõttu on kolmepoolse käepigistuse valimine parim valik TCP-ühenduste stabiilsuse ja usaldusväärsuse tagamiseks.
Põhjus 3: Vältige ressursside raiskamist
Kui toimub ainult "kahe käepigistus" ja kliendi SYN-päring on võrgus blokeeritud, ei saa klient serveri saadetud ACK-paketti vastu võtta ning SYN saadetakse uuesti. Kuna aga kolmandat käepigistust ei toimu, ei saa server kindlaks teha, kas klient sai ühenduse loomiseks ACK-kinnituse. Seetõttu saab server ühenduse luua alles pärast iga SYN-päringu vastuvõtmist. See viib järgmiseni:
Ressursside raiskamine: Kui kliendi SYN-päring blokeeritakse, mille tulemuseks on mitme SYN-paketi korduv edastamine, loob server pärast päringu saamist mitu redundantset kehtetut ühendust. See toob kaasa serveri ressursside tarbetu raiskamise.
Sõnumite säilitamine: Kolmanda käepigistuse puudumise tõttu ei ole serveril mingit võimalust teada, kas klient sai ühenduse loomiseks vajaliku ACK-kinnituse õigesti kätte. Selle tulemusena, kui sõnumid jäävad võrku kinni, saadab klient ikka ja jälle SYN-päringuid, pannes serveri pidevalt uusi ühendusi looma. See suurendab võrgu ülekoormust ja viivitusi ning mõjutab negatiivselt võrgu üldist jõudlust.
Seetõttu kasutab TCP võrguühenduse stabiilsuse ja töökindluse tagamiseks ühenduse loomiseks kolmepoolset käepigistust, et vältida nende probleemide tekkimist.
Kokkuvõte
SeeVõrgupaketi vahendajaTCP-ühenduse loomine toimub kolmepoolse käepigistusega. Kolmepoolse käepigistuse ajal saadab klient esmalt serverile SYN-lipuga paketi, mis näitab, et soovib ühendust luua. Pärast kliendilt päringu saamist vastab server kliendile SYN- ja ACK-lippudega paketiga, mis näitab, et ühendusepäring on vastu võetud, ja saadab oma esialgse järjekorranumbri. Lõpuks vastab klient serverile ACK-lipuga, mis näitab, et ühendus on edukalt loodud. Seega on mõlemad pooled olekus ESTABLISHED ja saavad hakata üksteisele andmeid saatma.
Üldiselt on TCP-ühenduse loomise kolmepoolne käepigistusprotsess loodud ühenduse stabiilsuse ja usaldusväärsuse tagamiseks, segaduse ja ressursside raiskamise vältimiseks ajalooliste ühenduste tõttu ning mõlema poole võimekuse tagamiseks andmete vastuvõtmiseks ja saatmiseks.
Postituse aeg: 08.01.2025