Postavljanje TCP veze
Kada pretražujemo web, šaljemo e-poštu ili igramo online igru, često ne razmišljamo o složenoj mrežnoj vezi koja stoji iza toga. Međutim, upravo su ti naizgled mali koraci ti koji osiguravaju stabilnu komunikaciju između nas i servera. Jedan od najvažnijih koraka je postavljanje TCP veze, a srž toga je trostrano rukovanje.
Ovaj članak će detaljno razmotriti princip, proces i važnost trosmjernog rukovanja. Korak po korak, objasnit ćemo zašto je trosmjerno rukovanje potrebno, kako osigurava stabilnost i pouzdanost veze i koliko je važno za prijenos podataka. Dubljim razumijevanjem trosmjernog rukovanja, steći ćemo bolje razumijevanje osnovnih mehanizama mrežne komunikacije i jasniju sliku pouzdanosti TCP veza.
TCP proces trosmjernog rukovanja i promjene stanja
TCP je transportni protokol orijentisan na konekcije, koji zahtijeva uspostavljanje veze prije prenosa podataka. Ovaj proces uspostavljanja veze se vrši trostrukim rukovanjem.
Pogledajmo detaljnije TCP pakete koji se šalju u svakoj konekciji.
U početku su i klijent i server ZATVORENI. Prvo, server aktivno osluškuje port i nalazi se u stanju SLUŠANJA (LISTEN), što znači da server mora biti pokrenut. Zatim je klijent spreman za početak pristupa web stranici. Potrebno je uspostaviti vezu sa serverom. Format prvog paketa za povezivanje je sljedeći:
Kada klijent inicira vezu, generira slučajni početni redni broj (client_isn) i postavlja ga u polje "Redni broj" TCP zaglavlja. Istovremeno, klijent postavlja SYN zastavicu na 1 kako bi naznačio da je odlazni paket SYN paket. Klijent označava da želi uspostaviti vezu sa serverom slanjem prvog SYN paketa serveru. Ovaj paket ne sadrži podatke aplikacijskog sloja (tj. poslane podatke). U ovom trenutku, status klijenta je označen kao SYN-SENT.
Kada server primi SYN paket od klijenta, on nasumično inicijalizira vlastiti serijski broj (server_isn), a zatim taj broj stavlja u polje "Serijski broj" TCP zaglavlja. Zatim, server unosi client_isn + 1 u polje "Broj potvrde" i postavlja i SYN i ACK bitove na 1. Konačno, server šalje paket klijentu, koji ne sadrži podatke aplikacijskog sloja (i nema podataka koje server treba poslati). U ovom trenutku, server je u SYN-RCVD stanju.
Nakon što klijent primi paket od servera, potrebno je izvršiti sljedeće optimizacije kako bi odgovorio na konačni paket odgovora: Prvo, klijent postavlja ACK bit TCP zaglavlja paketa odgovora na 1; Drugo, klijent unosi vrijednost server_isn + 1 u polje "Potvrdi broj odgovora"; Konačno, klijent šalje paket serveru. Ovaj paket može nositi podatke od klijenta do servera. Nakon završetka ovih operacija, klijent će ući u stanje ESTABLISHED.
Nakon što server primi odgovorni paket od klijenta, također prelazi u stanje ESTABLISHED.
Kao što možete vidjeti iz gore navedenog procesa, prilikom izvođenja trostranog rukovanja, treće rukovanje smije prenositi podatke, ali prva dva rukovanja ne. Ovo je pitanje koje se često postavlja u intervjuima. Nakon što je trostrano rukovanje završeno, obje strane ulaze u stanje USPOSTAVLJENO, što ukazuje na to da je veza uspješno uspostavljena, u kojem trenutku klijent i server mogu početi slati podatke jedan drugom.
Zašto tri rukovanja? Ne dva puta, četiri puta?
Uobičajeni odgovor je: "Zato što trostruko rukovanje garantuje mogućnost primanja i slanja." Ovaj odgovor je tačan, ali je samo površinski razlog, ne ističe glavni razlog. U nastavku ću analizirati razloge za trostruko rukovanje iz tri aspekta kako bih produbio naše razumijevanje ovog problema.
Trostruko rukovanje može efikasno izbjeći inicijalizaciju historijski ponovljenih veza (glavni razlog)
Trostrano rukovanje garantuje da su obje strane primile pouzdan početni redni broj.
Trostrano rukovanje izbjegava rasipanje resursa.
Razlog 1: Izbjegavajte historijske duplikate spajanja
Ukratko, glavni razlog za trostruko rukovanje je izbjegavanje konfuzije uzrokovane starom inicijalizacijom duplikata veze. U složenom mrežnom okruženju, prijenos paketa podataka se ne šalje uvijek odredišnom hostu u skladu s navedenim vremenom, a stari paketi podataka mogu prvi stići do odredišnog hosta zbog zagušenja mreže i drugih razloga. Da bi se to izbjeglo, TCP koristi trostruko rukovanje za uspostavljanje veze.
Kada klijent šalje više SYN paketa za uspostavljanje veze uzastopno, u situacijama kao što je zagušenje mreže, može se dogoditi sljedeće:
1- Stari SYN paketi stižu na server prije najnovijih SYN paketa.
2- Server će odgovoriti SYN + ACK paketom klijentu nakon što primi stari SYN paket.
3- Kada klijent primi SYN + ACK paket, utvrđuje da je veza historijska veza (istekao je redni broj ili je isteklo vrijeme) prema vlastitom kontekstu, a zatim šalje RST paket serveru da bi prekinuo vezu.
Kod dvosmjernog rukovanja, ne postoji način da se utvrdi da li je trenutna veza historijska veza. Trosmjerno rukovanje omogućava klijentu da utvrdi da li je trenutna veza historijska veza na osnovu konteksta kada je spreman za slanje trećeg paketa:
1- Ako se radi o historijskoj vezi (istekao je redni broj ili je isteklo vrijeme), paket poslan trećim rukovanjem je RST paket za prekid historijske veze.
2- Ako se ne radi o historijskoj vezi, paket poslan treći put je ACK paket i dvije strane koje komuniciraju uspješno uspostavljaju vezu.
Stoga, glavni razlog zašto TCP koristi trostruko rukovanje je taj što inicijalizira vezu kako bi spriječio historijske veze.
Razlog 2: Sinhronizacija početnih sekvencijalnih brojeva obje strane
Obje strane TCP protokola moraju održavati redni broj, što je ključni faktor za osiguranje pouzdanog prijenosa. Redni brojevi igraju važnu ulogu u TCP vezama. Oni rade sljedeće:
Prijemnik može eliminirati duplicirane podatke i osigurati tačnost podataka.
Prijemnik može primati pakete po redoslijedu sekvencijalnog broja kako bi osigurao integritet podataka.
● Redni broj može identificirati paket podataka koji je primila druga strana, omogućavajući pouzdan prijenos podataka.
Stoga, nakon uspostavljanja TCP veze, klijent šalje SYN pakete s početnim sekvencijalnim brojem i zahtijeva od servera da odgovori ACK paketom koji označava uspješan prijem klijentovog SYN paketa. Zatim, server šalje SYN paket s početnim sekvencijalnim brojem klijentu i čeka da klijent odgovori, jednom zauvijek, kako bi se osiguralo da su početni sekvencijski brojevi pouzdano sinhronizirani.
Iako je rukovanje s četiri strane također moguće za pouzdanu sinhronizaciju početnih sekvencijalnih brojeva obje strane, drugi i treći korak mogu se kombinirati u jedan korak, što rezultira rukovanjem s tri strane. Međutim, dva rukovanja mogu garantirati samo da će druga strana uspješno primiti početni sekvencijski broj jedne strane, ali ne postoji garancija da će se početni sekvencijski broj obje strane moći potvrditi. Stoga je rukovanje s tri strane najbolji izbor kako bi se osigurala stabilnost i pouzdanost TCP veza.
Razlog 3: Izbjegavajte rasipanje resursa
Ako postoji samo "dvostruko rukovanje", kada je SYN zahtjev klijenta blokiran u mreži, klijent ne može primiti ACK paket koji je poslao server, pa će SYN biti ponovo poslan. Međutim, budući da nema trećeg rukovanja, server ne može utvrditi da li je klijent primio ACK potvrdu za uspostavljanje veze. Stoga, server može proaktivno uspostaviti vezu samo nakon što primi svaki SYN zahtjev. To dovodi do sljedećeg:
Rasipanje resursa: Ako je SYN zahtjev klijenta blokiran, što rezultira ponovljenim slanjem više SYN paketa, server će uspostaviti više redundantnih nevažećih veza nakon prijema zahtjeva. To dovodi do nepotrebnog rasipanja resursa servera.
Zadržavanje poruka: Zbog nedostatka trećeg rukovanja, server nema načina da sazna da li je klijent ispravno primio ACK potvrdu za uspostavljanje veze. Kao rezultat toga, ako se poruke zaglave u mreži, klijent će nastaviti slati SYN zahtjeve iznova i iznova, uzrokujući da server stalno uspostavlja nove veze. Ovo će povećati zagušenje mreže i kašnjenje i negativno uticati na ukupne performanse mreže.
Stoga, kako bi se osigurala stabilnost i pouzdanost mrežne veze, TCP koristi trostruko rukovanje za uspostavljanje veze kako bi se izbjegla pojava ovih problema.
Sažetak
TheMrežni posrednik paketaUspostavljanje TCP veze se vrši trostrukim rukovanjem. Tokom trostrukog rukovanja, klijent prvo šalje paket sa SYN zastavicom serveru, što ukazuje da želi uspostaviti vezu. Nakon što primi zahtjev od klijenta, server odgovara paketom sa SYN i ACK zastavicama klijentu, što ukazuje da je zahtjev za vezu prihvaćen, i šalje svoj početni redni broj. Konačno, klijent odgovara serveru sa ACK zastavicom kako bi naznačio da je veza uspješno uspostavljena. Dakle, dvije strane su u USPOSTAVLJENOM stanju i mogu početi slati podatke jedna drugoj.
Općenito, proces trostrukog rukovanja za uspostavljanje TCP veze osmišljen je kako bi se osigurala stabilnost i pouzdanost veze, izbjegla konfuzija i rasipanje resursa zbog historije veza, te osiguralo da obje strane mogu primati i slati podatke.
Vrijeme objave: 08.01.2025.