Pouzdanost TCP transporta
Svi smo upoznati s TCP protokolom kao pouzdanim transportnim protokolom, ali kako on osigurava pouzdanost transporta?
Da bi se postigao pouzdan prijenos, potrebno je uzeti u obzir mnoge faktore, kao što su oštećenje podataka, gubitak, dupliciranje i fragmenti koji nisu u redoslijedu. Ako se ovi problemi ne mogu riješiti, ne može se postići ni pouzdan prijenos.
Stoga, TCP koristi mehanizme kao što su sekvencijalni broj, potvrda odgovora, kontrola ponovnog slanja, upravljanje vezom i kontrola prozora kako bi se postigao pouzdan prijenos.
U ovom radu ćemo se fokusirati na klizni prozor, kontrolu protoka i kontrolu zagušenja TCP-a. Mehanizam ponovnog slanja podataka je posebno obrađen u sljedećem odjeljku.
Kontrola protoka mreže
Kontrola mrežnog protoka ili poznata kao Kontrola mrežnog prometa zapravo je manifestacija suptilnog odnosa između proizvođača i potrošača. Vjerovatno ste se često susretali s ovim scenarijem na poslu ili u intervjuima. Ako kapacitet proizvođača za proizvodnju znatno premašuje kapacitet potrošača za konzumaciju, to će uzrokovati da red čekanja raste unedogled. U ozbiljnijem slučaju, možda znate da kada se RabbitMQ poruke previše nagomilaju, to može uzrokovati smanjenje performansi cijelog MQ servera. Isto važi i za TCP; ako se ne kontrolira, previše poruka će biti poslano u mrežu i potrošači će premašiti svoj kapacitet, dok će proizvođači nastaviti slati duplicirane poruke, što će uveliko utjecati na performanse mreže.
Da bi se riješio ovaj fenomen, TCP pruža mehanizam za pošiljaoca da kontroliše količinu poslanih podataka na osnovu stvarnog kapaciteta prijema prijemnika, što je poznato kao kontrola protoka. Primalac održava prozor za prijem, dok pošiljalac održava prozor za slanje. Treba napomenuti da su ovi prozori samo za jednu TCP vezu i da ne dijele sve veze prozor.
TCP omogućava kontrolu protoka korištenjem varijable za prozor prijema. Prozor prijema daje pošiljatelju indikaciju o tome koliko je keš prostora još dostupno. Pošiljatelj kontrolira količinu poslanih podataka u skladu sa stvarnim kapacitetom prijema prijemnika.
Prijemni host obavještava pošiljatelja o veličini podataka koje može primiti, a pošiljatelj šalje podatke do te granice. Ovo ograničenje je veličina prozora, sjećate li se TCP zaglavlja? Postoji polje za prijemni prozor koje se koristi za označavanje broja bajtova koje primatelj može ili želi primiti.
Host pošiljatelj će periodično slati paket za testiranje prozora, koji se koristi za otkrivanje da li host primatelj još uvijek može prihvatiti podatke. Kada postoji opasnost od prepunjenosti bafera primatelja, veličina prozora se postavlja na manju vrijednost kako bi se pošiljatelju dalo instrukcije da kontrolira količinu poslanih podataka.
Evo dijagrama kontrole protoka mreže:
Kontrola zagušenja mreže
Prije uvođenja kontrole zagušenja, moramo shvatiti da pored prozora za prijem i prozora za slanje, postoji i prozor zagušenja, koji se uglavnom koristi za rješavanje problema kojom brzinom pošiljalac počinje slati podatke u prozor za prijem. Stoga, prozor zagušenja održava i TCP pošiljalac. Potreban nam je algoritam koji će odlučiti koliko podataka je prikladno poslati, budući da slanje premale ili prevelike količine podataka nije idealno, otuda i koncept prozora zagušenja.
U prethodnoj kontroli protoka mreže, ono što smo izbjegavali bilo je da pošiljatelj puni keš memoriju primatelja podacima, ali nismo znali šta se događa u mreži. Tipično, računarske mreže se nalaze u dijeljenom okruženju. Kao rezultat toga, može doći do zagušenja mreže zbog komunikacije između drugih hostova.
Kada je mreža preopterećena, ako se nastavi slati veliki broj paketa, to može uzrokovati probleme poput kašnjenja i gubitka paketa. U ovom trenutku, TCP će ponovo poslati podatke, ali će ponovni prijenos povećati opterećenje mreže, što će rezultirati većim kašnjenjima i gubitkom paketa. Ovo može ući u začarani krug i nastaviti se povećavati.
Dakle, TCP ne može ignorisati šta se dešava na mreži. Kada je mreža preopterećena, TCP žrtvuje sebe smanjenjem količine podataka koje šalje.
Stoga se predlaže kontrola zagušenja, koja ima za cilj izbjegavanje popunjavanja cijele mreže podacima od pošiljatelja. Da bi se regulirala količina podataka koju pošiljatelj treba poslati, TCP definira koncept koji se naziva prozor zagušenja. Algoritam za kontrolu zagušenja će prilagoditi veličinu prozora zagušenja prema stupnju zagušenja mreže, kako bi kontrolirao količinu podataka koje šalje pošiljatelj.
Šta je prozor zagušenja? Kakve to veze ima sa prozorom za slanje?
Prozor zagušenja je varijabla stanja koju održava pošiljalac i koja određuje količinu podataka koju pošiljalac može poslati. Prozor zagušenja se dinamički mijenja u skladu sa nivoom zagušenja mreže.
Prozor slanja je dogovorena veličina prozora između pošiljaoca i primaoca koja označava količinu podataka koju primalac može primiti. Prozor zagušenja i prozor slanja su povezani; prozor slanja je obično jednak minimumu prozora zagušenja i prijema, tj. swnd = min(cwnd, rwnd).
Prozor zagušenja cwnd se mijenja na sljedeći način:
Ako nema zagušenja u mreži, tj. ako ne dođe do isteka vremena ponovnog slanja, prozor zagušenja se povećava.
Ako postoji zagušenje u mreži, prozor zagušenja se smanjuje.
Pošiljalac utvrđuje da li je mreža preopterećena posmatrajući da li je ACK paket potvrde primljen u određenom vremenu. Ako pošiljalac ne primi ACK paket potvrde u određenom vremenu, smatra se da je mreža preopterećena.
Pored prozora zagušenja, vrijeme je da razgovaramo o algoritmu za kontrolu zagušenja TCP-a. Algoritam za kontrolu zagušenja TCP-a sastoji se od tri glavna dijela:
Spori početak:U početku je prozor zagušenja cwnd-a relativno mali, a pošiljatelj eksponencijalno povećava prozor zagušenja kako bi se brzo prilagodio kapacitetu mreže.
Izbjegavanje zagušenja:Nakon što prozor zagušenja pređe određeni prag, pošiljatelj linearno povećava prozor zagušenja kako bi usporio stopu rasta prozora zagušenja i izbjegao preopterećenje mreže.
Brzi oporavak:Ako dođe do zagušenja, pošiljatelj prepolovi prozor zagušenja i ulazi u stanje brzog oporavka kako bi odredio lokaciju oporavka mreže putem primljenih dupliciranih potvrda, a zatim nastavlja povećavati prozor zagušenja.
Spori početak
Kada se uspostavi TCP veza, prozor zagušenja cwnd se inicijalno postavlja na minimalnu MSS (maksimalnu veličinu segmenta) vrijednost. Na ovaj način, početna brzina slanja je oko MSS/RTT bajtova/sekundi. Stvarni dostupni propusni opseg je obično mnogo veći od MSS/RTT, tako da TCP želi pronaći optimalnu brzinu slanja, što se može postići sporim pokretanjem.
U procesu sporog pokretanja, vrijednost prozora zagušenja cwnd će biti inicijalizirana na 1 MSS, i svaki put kada se potvrdi prijem poslanog segmenta paketa, vrijednost cwnd će se povećati za jedan MSS, odnosno vrijednost cwnd će postati 2 MSS. Nakon toga, vrijednost cwnd se udvostručuje za svaki uspješan prijenos segmenta paketa i tako dalje. Specifičan proces rasta prikazan je na sljedećoj slici.
Međutim, stopa slanja ne može uvijek rasti; rast se nekad mora završiti. Dakle, kada prestaje povećanje stope slanja? Sporo pokretanje obično prekida povećanje stope slanja na jedan od nekoliko načina:
Prvi način je slučaj gubitka paketa tokom procesa slanja sa sporim startom. Kada dođe do gubitka paketa, TCP postavlja prozor zagušenja pošiljaoca cwnd na 1 i ponovo pokreće proces sporog starta. U ovom trenutku se uvodi koncept praga sporog starta ssthresh, čija je početna vrijednost polovina vrijednosti cwnd koja generiše gubitak paketa. To jest, kada se otkrije zagušenje, vrijednost ssthresh je polovina vrijednosti prozora.
Drugi način je direktna korelacija s vrijednošću praga sporog pokretanja ssthresh. Budući da je vrijednost ssthresh polovina vrijednosti prozora kada se otkrije zagušenje, gubitak paketa može se dogoditi sa svakim udvostručenjem kada je cwnd veći od ssthresh. Stoga je najbolje postaviti cwnd na ssthresh, što će uzrokovati da TCP pređe u način rada kontrole zagušenja i prekine sporo pokretanje.
Posljednji način na koji se spori početak može završiti je ako se otkriju tri redundantna ack-a, TCP izvršava brzi retransmisiju i ulazi u stanje oporavka. (Ako nije jasno zašto postoje tri ACK paketa, to će biti objašnjeno odvojeno u mehanizmu retransmisije.)
Izbjegavanje zagušenja
Kada TCP uđe u stanje kontrole zagušenja, cwnd se postavlja na polovinu praga zagušenja ssthresh. To znači da se vrijednost cwnd ne može udvostručiti svaki put kada se primi segment paketa. Umjesto toga, usvaja se relativno konzervativan pristup u kojem se vrijednost cwnd povećava za samo jedan MSS (maksimalna dužina segmenta paketa) nakon što je svaki prijenos završen. Na primjer, čak i ako se potvrdi prijem 10 segmenata paketa, vrijednost cwnd će se povećati samo za jedan MSS. Ovo je linearni model rasta i također ima gornju granicu rasta. Kada dođe do gubitka paketa, vrijednost cwnd se mijenja u MSS, a vrijednost ssthresh se postavlja na polovinu cwnd. Ili će se također zaustaviti rast MSS-a kada se prime 3 redundantna ACK odgovora. Ako se i dalje prime tri redundantna ACK-a nakon prepolovljavanja vrijednosti cwnd, vrijednost ssthresh se bilježi kao polovina vrijednosti cwnd i ulazi se u stanje brzog oporavka.
Brzi oporavak
U stanju brzog oporavka, vrijednost prozora zagušenja cwnd se povećava za jedan MSS za svaki primljeni redundantni ACK, odnosno ACK koji ne stiže u sekvenci. Ovo se radi kako bi se iskoristili segmenti paketa koji su uspješno preneseni u mreži i što više poboljšala efikasnost prenosa.
Kada stigne ACK za izgubljeni segment paketa, TCP smanjuje vrijednost cwnd i zatim ulazi u stanje izbjegavanja zagušenja. Ovo služi za kontrolu veličine prozora zagušenja i izbjegavanje daljnjeg povećanja zagušenja mreže.
Ako dođe do isteka vremena nakon stanja kontrole zagušenja, stanje mreže postaje ozbiljnije i TCP prelazi iz stanja izbjegavanja zagušenja u stanje sporog pokretanja. U ovom slučaju, vrijednost prozora zagušenja cwnd postavljena je na 1 MSS, maksimalna dužina segmenta paketa, a vrijednost praga sporog pokretanja ssthresh postavljena je na polovinu cwnd. Svrha ovoga je postepeno povećanje veličine prozora zagušenja nakon što se mreža oporavi kako bi se uravnotežila brzina prijenosa i stepen zagušenja mreže.
Sažetak
Kao pouzdan transportni protokol, TCP implementira pouzdan transport putem sekvencijalnog broja, potvrde, kontrole ponovnog slanja, upravljanja vezom i kontrole prozora. Između ostalog, mehanizam kontrole protoka kontrolira količinu podataka koje šalje pošiljatelj u skladu sa stvarnim prijemnim kapacitetom prijemnika, što izbjegava probleme zagušenja mreže i degradacije performansi. Mehanizam kontrole zagušenja izbjegava pojavu zagušenja mreže podešavanjem količine podataka koje šalje pošiljatelj. Koncepti prozora zagušenja i prozora slanja su međusobno povezani, a količina podataka kod pošiljatelja kontrolira se dinamičkim podešavanjem veličine prozora zagušenja. Spor početak, izbjegavanje zagušenja i brzi oporavak su tri glavna dijela TCP algoritma kontrole zagušenja, koji prilagođavaju veličinu prozora zagušenja kroz različite strategije kako bi se prilagodili kapacitetu i stepenu zagušenja mreže.
U sljedećem odjeljku, detaljno ćemo ispitati TCP-ov mehanizam ponovnog slanja. Mehanizam ponovnog slanja je važan dio TCP-a za postizanje pouzdanog prijenosa. On osigurava pouzdan prijenos podataka ponovnim slanjem izgubljenih, oštećenih ili zakašnjelih podataka. Princip implementacije i strategija mehanizma ponovnog slanja bit će predstavljeni i detaljno analizirani u sljedećem odjeljku. Ostanite s nama!
Vrijeme objave: 24. februar 2025.