Verkkopakettivälittäjän TCP-yhteyksien keskeiset mysteerit: Kolmoiskättelyn tarve selvitetty

TCP-yhteyden asetukset
Kun selailemme verkkoa, lähetämme sähköpostia tai pelaamme online-peliä, emme usein ajattele sen taustalla olevaa monimutkaista verkkoyhteyttä. Juuri nämä näennäisesti pienet vaiheet varmistavat kuitenkin vakaan viestinnän meidän ja palvelimen välillä. Yksi tärkeimmistä vaiheista on TCP-yhteyden muodostaminen, ja sen ydin on kolmen osapuolen kättely.

Tässä artikkelissa käsitellään yksityiskohtaisesti kolmitieisen kättelyn periaatetta, prosessia ja merkitystä. Vaiheittaisesti selitämme, miksi kolmitieistä kättelyä tarvitaan, miten se varmistaa yhteyden vakauden ja luotettavuuden ja kuinka tärkeä se on tiedonsiirrolle. Kolmitieisen kättelyn syvempi ymmärtäminen antaa meille paremman käsityksen verkkoviestinnän taustalla olevista mekanismeista ja selkeämmän kuvan TCP-yhteyksien luotettavuudesta.

TCP:n kolmisuuntainen kättelyprosessi ja tilasiirtymät
TCP on yhteydellinen siirtoprotokolla, joka vaatii yhteyden muodostamisen ennen tiedonsiirtoa. Tämä yhteyden muodostamisprosessi tapahtuu kolmiosaisella kättelyllä.

 TCP:n kolmitieinen kättely

Tarkastellaanpa tarkemmin kussakin yhteydessä lähetettäviä TCP-paketteja.

Aluksi sekä asiakas että palvelin ovat SULJETTUJA. Ensin palvelin kuuntelee aktiivisesti porttia ja on KUUNTELU-tilassa, mikä tarkoittaa, että palvelin on käynnistettävä. Seuraavaksi asiakas on valmis aloittamaan verkkosivun käytön. Sen on muodostettava yhteys palvelimeen. Ensimmäisen yhteyspaketin muoto on seuraava:

 SYN-paketti

Kun asiakasohjelma aloittaa yhteyden, se luo satunnaisen aloitusjärjestysnumeron (client_isn) ja sijoittaa sen TCP-otsikon "Sarjanumero"-kenttään. Samalla asiakasohjelma asettaa SYN-lipun arvoon 1 osoittaakseen, että lähtevä paketti on SYN-paketti. Asiakasohjelma ilmaisee haluavansa muodostaa yhteyden palvelimeen lähettämällä ensimmäisen SYN-paketin palvelimelle. Tämä paketti ei sisällä sovelluskerroksen tietoja (eli lähetettyjä tietoja). Tässä vaiheessa asiakkaan tilaksi merkitään SYN-LÄHETETTY.

SYN+ACK-paketti

Kun palvelin vastaanottaa SYN-paketin asiakkaalta, se alustaa oman sarjanumeronsa (server_isn) satunnaisesti ja lisää sen TCP-otsikon "Sarjanumero"-kenttään. Seuraavaksi palvelin syöttää "Kuittausnumero"-kenttään client_isn + 1 ja asettaa sekä SYN- että ACK-bitit arvoon 1. Lopuksi palvelin lähettää paketin asiakkaalle, eikä se sisällä sovelluskerroksen tietoja (eikä palvelimen lähetettäviä tietoja). Tällä hetkellä palvelin on SYN-RCVD-tilassa.

ACK-paketti

Kun asiakas vastaanottaa paketin palvelimelta, sen on suoritettava seuraavat optimoinnit vastatakseen lopulliseen vastauspakettiin: Ensin asiakas asettaa vastauspaketin TCP-otsikon ACK-bitin arvoon 1; Toiseksi asiakas syöttää arvon server_isn + 1 "Vahvista vastauksen numero" -kenttään; Lopuksi asiakas lähettää paketin palvelimelle. Tämä paketti voi kuljettaa dataa asiakkaalta palvelimelle. Näiden toimintojen valmistuttua asiakas siirtyy ESTABLISHED-tilaan.

Kun palvelin vastaanottaa vastauspaketin asiakkaalta, se siirtyy myös ESTABLISHED-tilaan.

Kuten yllä olevasta prosessista voi nähdä, kolmen osapuolen kättelyssä kolmas kättely voi siirtää dataa, mutta kaksi ensimmäistä kättelyä eivät. Tätä kysymystä kysytään usein haastatteluissa. Kun kolmen osapuolen kättely on valmis, molemmat osapuolet siirtyvät MUODOSTETTU-tilaan, mikä osoittaa, että yhteys on muodostettu onnistuneesti. Tämän jälkeen asiakas ja palvelin voivat aloittaa datan lähettämisen toisilleen.

Miksi kolme kädenpuristusta? Ei kaksi, vaan neljä kertaa?
Yleinen vastaus on: "Koska kolmen kädenpuristus takaa kyvyn vastaanottaa ja lähettää." Tämä vastaus on oikea, mutta se on vain pinnallinen syy, eikä se esitä pääasiallista syytä. Seuraavaksi analysoin kolmen kädenpuristuksen syitä kolmesta näkökulmasta syventääkseni ymmärrystämme tästä asiasta.

Kolmitieinen kättely voi tehokkaasti välttää historiallisesti toistuvien yhteyksien alustuksen (pääsyy)
Kolmiosainen kättely takaa, että molemmat osapuolet ovat saaneet luotettavan alkuperäisen järjestysnumeron.
Kolmen osapuolen kättely välttää resurssien tuhlaamista.

Syy 1: Vältä historiallisia kaksoisliitoksia
Lyhyesti sanottuna kolmitieisen kättelyn pääasiallinen tarkoitus on välttää vanhan päällekkäisen yhteyden alustuksen aiheuttamaa sekaannusta. Monimutkaisessa verkkoympäristössä datapakettien lähetys ei aina tapahdu kohdekoneelle määritetyn ajan mukaisesti, ja vanhat datapaketit saattavat saapua kohdekoneelle ensin verkon ruuhkautumisen ja muiden syiden vuoksi. Tämän välttämiseksi TCP käyttää kolmitieistä kättelyä yhteyden muodostamiseen.

kolmenvälisellä kättelyllä vältetään aiemmat kaksoisyhteydet

Kun asiakas lähettää useita SYN-yhteydenmuodostuspaketteja peräkkäin esimerkiksi verkon ruuhkautumisen kaltaisissa tilanteissa, voi tapahtua seuraavaa:

1- Vanhat SYN-paketit saapuvat palvelimelle ennen uusimpia SYN-paketteja.
2- Palvelin vastaa SYN + ACK -paketilla asiakkaalle vastaanotettuaan vanhan SYN-paketin.
3- Kun asiakas vastaanottaa SYN + ACK -paketin, se määrittää oman kontekstinsa perusteella, että yhteys on historiallinen yhteys (järjestysnumero vanhentunut tai aikakatkaistu), ja lähettää sitten RST-paketin palvelimelle yhteyden katkaisemiseksi.

Kahden kädenpuristuksessa ei ole mahdollista määrittää, onko nykyinen yhteys historiallinen. Kolmiosaisen kättelyn avulla asiakas voi määrittää kontekstin perusteella, onko nykyinen yhteys historiallinen, milloin se on valmis lähettämään kolmannen paketin:

1- Jos kyseessä on historiallinen yhteys (järjestysnumero vanhentunut tai aikakatkaistu), kolmannen kättelyn lähettämä paketti on RST-paketti, jolla keskeytetään historiallinen yhteys.
2- Jos kyseessä ei ole historiallinen yhteys, kolmannen kerran lähetetty paketti on ACK-paketti, ja kaksi kommunikoivaa osapuolta muodostavat yhteyden onnistuneesti.

Siksi tärkein syy siihen, miksi TCP käyttää kolmisuuntaista kättelyä, on se, että se alustaa yhteyden estääkseen historialliset yhteydet.

Syy 2: Molempien osapuolten alkuperäisten järjestysnumeroiden synkronointi
TCP-protokollan molempien osapuolten on ylläpidettävä järjestysnumeroa, joka on avaintekijä luotettavan tiedonsiirron varmistamiseksi. Järjestysnumeroilla on tärkeä rooli TCP-yhteyksissä. Ne tekevät seuraavaa:

Vastaanottaja voi poistaa päällekkäiset tiedot ja varmistaa tietojen oikeellisuuden.

Vastaanottaja voi vastaanottaa paketteja järjestysnumeron mukaisessa järjestyksessä varmistaakseen datan eheyden.

● Järjestysnumero voi tunnistaa toisen osapuolen vastaanottaman datapaketin, mikä mahdollistaa luotettavan tiedonsiirron.

Siksi TCP-yhteyden muodostamisen yhteydessä asiakas lähettää SYN-paketteja alkuperäisellä järjestysnumerolla ja vaatii palvelinta vastaamaan ACK-paketilla, joka osoittaa asiakkaan SYN-paketin onnistuneen vastaanoton. Sitten palvelin lähettää SYN-paketin alkuperäisellä järjestysnumerolla asiakkaalle ja odottaa asiakkaan lopullista vastausta varmistaakseen, että alkuperäiset järjestysnumerot synkronoidaan luotettavasti.

Synkronoi molempien osapuolten alkuperäiset sarjanumerot

Vaikka nelitieinen kättely on myös mahdollinen osapuolten alkuperäisten järjestysnumeroiden luotettavaan synkronointiin, toinen ja kolmas vaihe voidaan yhdistää yhdeksi vaiheeksi, jolloin tuloksena on kolmitieinen kättely. Nämä kaksi kättelyä voivat kuitenkin taata vain sen, että toisen osapuolen alkuperäinen järjestysnumero vastaanotetaan onnistuneesti toiselle osapuolelle, mutta ei ole takeita siitä, että molempien osapuolten alkuperäinen järjestysnumero voidaan vahvistaa. Siksi kolmitieinen kättely on paras vaihtoehto TCP-yhteyksien vakauden ja luotettavuuden varmistamiseksi.

Syy 3: Vältä resurssien tuhlaamista
Jos tapahtuu vain "kaksi kättelyä", asiakas ei voi vastaanottaa palvelimen lähettämää ACK-pakettia, kun asiakkaan SYN-pyyntö on estetty verkossa. Koska kolmatta kättelyä ei kuitenkaan ole, palvelin ei voi määrittää, saiko asiakas ACK-kuittauksen yhteyden muodostamiseksi. Siksi palvelin voi muodostaa yhteyden ennakoivasti vasta vastaanotettuaan jokaisen SYN-pyynnön. Tämä johtaa seuraavaan:

Resurssien tuhlausta: Jos asiakkaan SYN-pyyntö estetään, mikä johtaa useiden SYN-pakettien toistuvaan lähettämiseen, palvelin muodostaa useita redundantteja virheellisiä yhteyksiä pyynnön vastaanottamisen jälkeen. Tämä johtaa palvelinresurssien tarpeettomaan tuhlaamiseen.

Viestien säilytys: Koska kolmatta kättelyä ei tapahdu, palvelimella ei ole mitään keinoa tietää, vastaanottiko asiakas oikein ACK-kuittauksen yhteyden muodostamiseksi. Tämän seurauksena, jos viestit juuttuvat verkkoon, asiakas lähettää SYN-pyyntöjä yhä uudelleen ja uudelleen, jolloin palvelin joutuu jatkuvasti muodostamaan uusia yhteyksiä. Tämä lisää verkon ruuhkautumista ja viiveitä sekä vaikuttaa negatiivisesti verkon yleiseen suorituskykyyn.

Vältä resurssien tuhlaamista

Siksi verkkoyhteyden vakauden ja luotettavuuden varmistamiseksi TCP käyttää kolmitieistä kättelyä yhteyden muodostamiseen näiden ongelmien välttämiseksi.

Yhteenveto
TheVerkkopakettien välittäjäTCP-yhteyden muodostaminen tapahtuu kolmiosaisella kättelyllä. Kolmiosaisessa kättelyssä asiakas lähettää ensin palvelimelle SYN-lipulla varustetun paketin, joka osoittaa haluavansa muodostaa yhteyden. Saatuaan pyynnön asiakkaalta palvelin vastaa asiakkaalle SYN- ja ACK-lipuilla varustetulla paketilla, joka osoittaa, että yhteyspyyntö on hyväksytty, ja lähettää oman alkuperäisen järjestysnumeronsa. Lopuksi asiakas vastaa palvelimelle ACK-lipulla, joka osoittaa yhteyden onnistuneen muodostumisen. Näin osapuolet ovat MUODOSTETTU-tilassa ja voivat aloittaa datan lähettämisen toisilleen.

Yleisesti ottaen TCP-yhteyden muodostamiseen käytettävä kolmitieinen kättelyprosessi on suunniteltu varmistamaan yhteyden vakaus ja luotettavuus, välttämään sekaannusta ja resurssien tuhlausta historiallisten yhteyksien aikana sekä varmistamaan, että molemmat osapuolet pystyvät vastaanottamaan ja lähettämään dataa.


Julkaisun aika: 08.01.2025