TCP հուսալիության փոխադրում
Մենք բոլորս ծանոթ ենք TCP արձանագրությանը որպես հուսալի տրանսպորտային արձանագրություն, բայց ինչպե՞ս է այն ապահովում տրանսպորտային հուսալիությունը։
Հուսալի փոխանցման հասնելու համար անհրաժեշտ է հաշվի առնել բազմաթիվ գործոններ, ինչպիսիք են տվյալների վնասումը, կորուստը, կրկնօրինակումը և անկարգ շարդերը։ Եթե այս խնդիրները չեն կարող լուծվել, հուսալի փոխանցման հասնել հնարավոր չէ։
Հետևաբար, TCP-ն օգտագործում է այնպիսի մեխանիզմներ, ինչպիսիք են հաջորդական համարը, հաստատման պատասխանը, վերուղարկման կառավարումը, կապի կառավարումը և պատուհանների կառավարումը՝ հուսալի փոխանցում ապահովելու համար։
Այս աշխատանքում մենք կկենտրոնանանք TCP-ի սահող պատուհանի, հոսքի կառավարման և գերբեռնվածության կառավարման վրա: Հաջորդ բաժնում առանձին կանդրադառնանք վերափոխման մեխանիզմին:
Ցանցի հոսքի կառավարում
Ցանցային հոսքի կառավարումը կամ ցանցային երթևեկության կառավարումը իրականում արտադրողների և սպառողների միջև նուրբ հարաբերության դրսևորում է: Դուք, հավանաբար, հաճախ եք բախվել այս սցենարին աշխատանքի վայրում կամ հարցազրույցների ժամանակ: Եթե արտադրողի արտադրելու կարողությունը զգալիորեն գերազանցում է սպառողի սպառելու կարողությունը, դա կհանգեցնի հերթի անորոշ աճի: Ավելի լուրջ դեպքում, դուք կարող եք իմանալ, որ երբ RabbitMQ հաղորդագրությունները չափազանց շատ են կուտակվում, դա կարող է հանգեցնել ամբողջ MQ սերվերի աշխատանքի վատթարացման: Նույնը վերաբերում է TCP-ին. եթե այն չստուգվի, ցանց կտեղադրվեն չափազանց շատ հաղորդագրություններ, և սպառողները կգերազանցեն իրենց կարողությունը, մինչդեռ արտադրողները կշարունակեն ուղարկել կրկնօրինակ հաղորդագրություններ, ինչը մեծապես կազդի ցանցի աշխատանքի վրա:
Այս երևույթը լուծելու համար TCP-ն ուղարկողին տրամադրում է մեխանիզմ՝ վերահսկելու ուղարկվող տվյալների քանակը՝ հիմնվելով ստացողի իրական ընդունման հզորության վրա, որը հայտնի է որպես հոսքի կառավարում: Ստացողը պահպանում է ընդունման պատուհան, մինչդեռ ուղարկողը պահպանում է ուղարկման պատուհան: Պետք է նշել, որ այս պատուհանները նախատեսված են միայն մեկ TCP կապի համար, և ոչ բոլոր կապերն ունեն ընդհանուր պատուհան:
TCP-ն ապահովում է հոսքի կառավարում՝ օգտագործելով ընդունման պատուհանի համար փոփոխական։ Ընդունման պատուհանը ուղարկողին ցույց է տալիս, թե որքան քեշային տարածք է դեռ ազատ։ Ուղարկողը կառավարում է ուղարկվող տվյալների քանակը՝ համաձայն ընդունողի իրական ընդունման հզորության։
Ստացող հոսթը տեղեկացնում է ուղարկողին այն տվյալների չափի մասին, որը կարող է ստանալ, և ուղարկողը ուղարկում է մինչև այդ սահմանը։ Այս սահմանը պատուհանի չափն է, հիշո՞ւմ եք TCP վերնագիրը։ Կա «ընդունող պատուհան» դաշտ, որն օգտագործվում է ստացողի կողմից ստացվող բայթերի քանակը նշելու համար։
Ուղարկող հոսթը պարբերաբար կուղարկի պատուհանի զոնդային փաթեթ, որն օգտագործվում է տվյալներ ընդունելու ընդունակությունը հայտնաբերելու համար։ Երբ ընդունիչի բուֆերը լցվելու վտանգի տակ է, պատուհանի չափը սահմանվում է ավելի փոքր արժեքի՝ ուղարկողին հրահանգելու վերահսկել ուղարկվող տվյալների քանակը։
Ահա ցանցային հոսքի կառավարման դիագրամը.
Ցանցի գերբեռնվածության վերահսկում
Մինչև գերբեռնվածության կառավարումը ներդնելը, մենք պետք է հասկանանք, որ ընդունման և ուղարկման պատուհաններից բացի, կա նաև գերբեռնվածության պատուհան, որը հիմնականում օգտագործվում է այն խնդիրը լուծելու համար, թե ինչ արագությամբ է ուղարկողը սկսում տվյալներ ուղարկել ընդունման պատուհանին: Հետևաբար, գերբեռնվածության պատուհանը նույնպես պահպանվում է TCP ուղարկողի կողմից: Մեզ անհրաժեշտ է ալգորիթմ՝ որոշելու համար, թե որքան տվյալ է նպատակահարմար ուղարկել, քանի որ չափազանց քիչ կամ չափազանց շատ տվյալներ ուղարկելը իդեալական չէ, այստեղից էլ՝ գերբեռնվածության պատուհանի հասկացությունը:
Նախորդ ցանցային հոսքի կառավարման դեպքում մենք խուսափում էինք ուղարկողի կողմից ստացողի քեշը տվյալներով լցնելուց, բայց չգիտեինք, թե ինչ է կատարվում ցանցում: Սովորաբար համակարգչային ցանցերը գտնվում են համատեղ օգտագործվող միջավայրում: Արդյունքում, կարող է ցանցային գերբեռնվածություն լինել այլ հոսթերի միջև հաղորդակցության պատճառով:
Երբ ցանցը գերբեռնված է, եթե մեծ թվով փաթեթներ շարունակաբար ուղարկվում են, դա կարող է խնդիրներ առաջացնել, ինչպիսիք են փաթեթների ուշացումը և կորուստը: Այս պահին TCP-ն կվերաուղարկի տվյալները, բայց վերաուղարկումը կմեծացնի ցանցի բեռը, ինչը կհանգեցնի ավելի մեծ ուշացումների և փաթեթների ավելի շատ կորստի: Սա կարող է հանգեցնել արատավոր շրջանի և շարունակել մեծանալ:
Այսպիսով, TCP-ն չի կարող անտեսել ցանցում տեղի ունեցողը։ Երբ ցանցը գերբեռնված է, TCP-ն զոհաբերում է իրեն՝ նվազեցնելով ուղարկվող տվյալների քանակը։
Հետևաբար, առաջարկվում է գերբեռնվածության վերահսկում, որի նպատակն է խուսափել ամբողջ ցանցը ուղարկողից եկող տվյալներով լցնելուց: Ուղարկողի կողմից ուղարկվող տվյալների քանակը կարգավորելու համար TCP-ն սահմանում է մի հասկացություն, որը կոչվում է գերբեռնվածության պատուհան: Գերբեռնվածության վերահսկման ալգորիթմը կկարգավորի գերբեռնվածության պատուհանի չափը՝ համաձայն ցանցի գերբեռնվածության աստիճանի, որպեսզի վերահսկի ուղարկողի կողմից ուղարկվող տվյալների քանակը:
Ի՞նչ է գերբեռնվածության պատուհանը։ Ի՞նչ կապ ունի սա ուղարկման պատուհանի հետ։
Գերբեռնվածության պատուհանը ուղարկողի կողմից պահպանվող վիճակի փոփոխական է, որը որոշում է ուղարկողի կողմից ուղարկվող տվյալների քանակը: Գերբեռնվածության պատուհանը դինամիկ կերպով փոխվում է՝ կախված ցանցի գերբեռնվածության մակարդակից:
Ուղարկող պատուհանը ուղարկողի և ստացողի միջև համաձայնեցված պատուհանի չափ է, որը ցույց է տալիս ստացողի կողմից ստացվող տվյալների քանակը: Գերբեռնվածության և ուղարկող պատուհանները փոխկապակցված են. ուղարկող պատուհանը սովորաբար հավասար է գերբեռնվածության և ստացող պատուհանների նվազագույնին, այսինքն՝ swnd = min(cwnd, rwnd):
Գերբեռնվածության պատուհանի cwnd-ը փոխվում է հետևյալ կերպ.
Եթե ցանցում գերբեռնվածություն չկա, այսինքն՝ վերահաղորդման ժամկետը չի ավարտվում, գերբեռնվածության պատուհանը մեծանում է։
Եթե ցանցում գերբեռնվածություն կա, գերբեռնվածության պատուհանը նվազում է։
Ուղարկողը որոշում է, թե արդյոք ցանցը գերբեռնված է՝ դիտարկելով, թե արդյոք ACK հաստատման փաթեթը ստացվել է նշված ժամանակահատվածում: Եթե ուղարկողը չի ստանում ACK հաստատման փաթեթը նշված ժամանակահատվածում, համարվում է, որ ցանցը գերբեռնված է:
Բացի գերբեռնվածության պատուհանից, ժամանակն է քննարկել TCP գերբեռնվածության կառավարման ալգորիթմը: TCP գերբեռնվածության կառավարման ալգորիթմը բաղկացած է երեք հիմնական մասից.
Դանդաղ մեկնարկ.Սկզբում cwnd գերբեռնվածության պատուհանը համեմատաբար փոքր է, և ուղարկողը էքսպոնենցիալ կերպով մեծացնում է այն՝ ցանցի թողունակությանը արագ հարմարվելու համար։
Խցանումներից խուսափելը.Երբ գերբեռնվածության պատուհանը գերազանցում է որոշակի շեմը, ուղարկողը գծային եղանակով մեծացնում է այն՝ գերբեռնվածության պատուհանի աճի տեմպը դանդաղեցնելու և ցանցի գերբեռնվածությունից խուսափելու համար։
Արագ վերականգնում.Եթե գերբեռնվածություն է առաջանում, ուղարկողը կիսով չափ կրճատում է գերբեռնվածության պատուհանը և մտնում է արագ վերականգնման վիճակ՝ ստացված կրկնօրինակների միջոցով ցանցի վերականգնման տեղը որոշելու համար, ապա շարունակում է մեծացնել գերբեռնվածության պատուհանը։
Դանդաղ մեկնարկ
Երբ TCP կապ է հաստատվում, գերբեռնվածության պատուհանի cwnd-ը սկզբում սահմանվում է MSS (հատվածի առավելագույն չափ) նվազագույն արժեքի։ Այսպիսով, սկզբնական ուղարկման արագությունը մոտավորապես MSS/RTT բայթ/վայրկյան է։ Իրականում հասանելի թողունակությունը սովորաբար շատ ավելի մեծ է, քան MSS/RTT-ն, ուստի TCP-ն ցանկանում է գտնել ուղարկման օպտիմալ արագությունը, որը կարելի է հասնել դանդաղ մեկնարկի միջոցով։
Դանդաղ մեկնարկի գործընթացում գերբեռնվածության պատուհանի cwnd-ի արժեքը կսկսվի 1 MSS-ի, և ամեն անգամ, երբ փոխանցված փաթեթի հատվածը հաստատվում է, cwnd-ի արժեքը կավելանա մեկ MSS-ով, այսինքն՝ cwnd-ի արժեքը կդառնա 2 MSS: Դրանից հետո, փաթեթի հատվածի յուրաքանչյուր հաջող փոխանցման համար cwnd-ի արժեքը կրկնապատկվում է և այլն: Աճի կոնկրետ գործընթացը ցույց է տրված հետևյալ նկարում:
Սակայն, ուղարկման արագությունը միշտ չէ, որ կարող է աճել. աճը պետք է երբևէ ավարտվի: Այսպիսով, ե՞րբ է ավարտվում ուղարկման արագության աճը: Դանդաղ մեկնարկը սովորաբար ավարտում է ուղարկման արագության աճը մի քանի եղանակներից մեկով.
Առաջին ճանապարհը դանդաղ մեկնարկի ուղարկման գործընթացի ընթացքում փաթեթի կորստի դեպքն է: Երբ տեղի է ունենում փաթեթի կորուստ, TCP-ն ուղարկողի գերբեռնվածության պատուհանի cwnd-ը սահմանում է 1-ի և վերսկսում է դանդաղ մեկնարկի գործընթացը: Այս պահին ներկայացվում է դանդաղ մեկնարկի շեմի ssthresh հասկացությունը, որի սկզբնական արժեքը փաթեթի կորուստ առաջացնող cwnd-ի արժեքի կեսն է: Այսինքն, երբ գերբեռնվածություն է հայտնաբերվում, ssthresh-ի արժեքը պատուհանի արժեքի կեսն է:
Երկրորդ եղանակը դանդաղ մեկնարկի շեմի ssthresh արժեքի հետ ուղղակիորեն կապելն է: Քանի որ գերբեռնվածության հայտնաբերման ժամանակ ssthresh-ի արժեքը պատուհանի արժեքի կեսն է, փաթեթների կորուստը կարող է տեղի ունենալ յուրաքանչյուր կրկնապատկման հետ, երբ cwnd-ը մեծ է ssthresh-ից: Հետևաբար, լավագույնն է cwnd-ը սահմանել ssthresh, ինչը կհանգեցնի TCP-ի անցմանը գերբեռնվածության կառավարման ռեժիմի և դանդաղ մեկնարկի ավարտին:
Դանդաղ մեկնարկի ավարտի վերջին եղանակը երեք ավելորդ հաստատումների հայտնաբերումն է, TCP-ն կատարում է արագ վերահաղորդում և մտնում է վերականգնման վիճակ: (Եթե պարզ չէ, թե ինչու կան երեք ACK փաթեթներ, դա առանձին կբացատրվի վերահաղորդման մեխանիզմում):
Խցանումներից խուսափելը
Երբ TCP-ն մտնում է գերբեռնվածության կառավարման վիճակի, cwnd-ը սահմանվում է ssthresh գերբեռնվածության շեմի կեսի վրա։ Սա նշանակում է, որ cwnd-ի արժեքը չի կարող կրկնապատկվել ամեն անգամ, երբ ստացվում է փաթեթի հատված։ Դրա փոխարեն ընդունվում է համեմատաբար պահպանողական մոտեցում, որի դեպքում cwnd-ի արժեքը մեծանում է միայն մեկ MSS-ով (փաթեթի հատվածի առավելագույն երկարություն) յուրաքանչյուր փոխանցման ավարտից հետո։ Օրինակ, նույնիսկ եթե հաստատվում է 10 փաթեթի հատված, cwnd-ի արժեքը կաճի միայն մեկ MSS-ով։ Սա գծային աճի մոդել է և այն նաև ունի աճի վերին սահման։ Երբ տեղի է ունենում փաթեթի կորուստ, cwnd-ի արժեքը փոխվում է MSS-ի, և ssthresh-ի արժեքը սահմանվում է cwnd-ի կեսի վրա։ Կամ այն նաև կկանգնեցնի MSS-ի աճը, երբ ստացվում են 3 ավելորդ ACK պատասխաններ։ Եթե cwnd-ի արժեքը կիսով չափ կրճատելուց հետո դեռևս ստացվում են երեք ավելորդ ack-եր, ssthresh-ի արժեքը գրանցվում է որպես cwnd-ի արժեքի կես, և մուտքագրվում է արագ վերականգնման վիճակ։
Արագ վերականգնում
Արագ վերականգնման վիճակում, յուրաքանչյուր ստացված ավելորդ ACK-ի համար, այսինքն՝ այն ACK-ի համար, որը հաջորդականությամբ չի ժամանում, գերբեռնվածության պատուհանի cwnd-ի արժեքը մեծանում է մեկ MSS-ով։ Սա արվում է ցանցում հաջողությամբ փոխանցված փաթեթային հատվածներն օգտագործելու և փոխանցման արդյունավետությունը հնարավորինս բարելավելու համար։
Երբ կորցրած փաթեթի հատվածի ACK-ը հասնում է, TCP-ն նվազեցնում է cwnd-ի արժեքը և այնուհետև անցնում գերբեռնվածությունից խուսափելու վիճակի։ Սա արվում է գերբեռնվածության պատուհանի չափը վերահսկելու և ցանցի գերբեռնվածության հետագա մեծացումը կանխելու համար։
Եթե գերբեռնվածության կառավարման վիճակից հետո տեղի է ունենում ժամանակի ավարտ, ցանցի վիճակը դառնում է ավելի լուրջ, և TCP-ն գերբեռնվածությունից խուսափելու վիճակից անցնում է դանդաղ մեկնարկի վիճակի: Այս դեպքում գերբեռնվածության պատուհանի cwnd արժեքը սահմանվում է 1 MSS, փաթեթի հատվածի առավելագույն երկարությունը, իսկ դանդաղ մեկնարկի շեմի ssthresh արժեքը սահմանվում է cwnd-ի կեսի: Սրա նպատակն է աստիճանաբար մեծացնել գերբեռնվածության պատուհանի չափը ցանցի վերականգնումից հետո՝ փոխանցման արագությունը և ցանցի գերբեռնվածության աստիճանը հավասարակշռելու համար:
Ամփոփում
Որպես հուսալի փոխադրման արձանագրություն, TCP-ն իրականացնում է հուսալի փոխադրում՝ հաջորդական համարի, հաստատման, վերահաղորդման կառավարման, կապի կառավարման և պատուհանների կառավարման միջոցով: Դրանց թվում են հոսքի կառավարման մեխանիզմը, որը կարգավորում է ուղարկողի կողմից ուղարկված տվյալների քանակը՝ համաձայն ստացողի իրական ընդունման հզորության, որը խուսափում է ցանցի գերբեռնվածության և կատարողականի վատթարացման խնդիրներից: Գերբեռնվածության կառավարման մեխանիզմը խուսափում է ցանցային գերբեռնվածության առաջացումից՝ կարգավորելով ուղարկողի կողմից ուղարկված տվյալների քանակը: Գերբեռնվածության պատուհանի և ուղարկման պատուհանի հասկացությունները կապված են միմյանց հետ, և ուղարկողի մոտ տվյալների քանակը կառավարվում է գերբեռնվածության պատուհանի չափը դինամիկ կերպով կարգավորելով: Դանդաղ մեկնարկը, գերբեռնվածության խուսափումը և արագ վերականգնումը TCP գերբեռնվածության կառավարման ալգորիթմի երեք հիմնական մասերն են, որոնք կարգավորում են գերբեռնվածության պատուհանի չափը տարբեր ռազմավարությունների միջոցով՝ հարմարվելու ցանցի հզորությանը և գերբեռնվածության աստիճանին:
Հաջորդ բաժնում մենք մանրամասն կքննարկենք TCP-ի վերափոխման մեխանիզմը: Վերափոխման մեխանիզմը TCP-ի կարևոր մասն է՝ հուսալի փոխանցման հասնելու համար: Այն ապահովում է տվյալների հուսալի փոխանցումը՝ վերափոխելով կորած, վնասված կամ ուշացած տվյալները: Վերափոխման մեխանիզմի իրականացման սկզբունքը և ռազմավարությունը մանրամասն կներկայացվեն և կվերլուծվեն հաջորդ բաժնում: Մնացեք կապի մեջ:
Հրապարակման ժամանակը. Փետրվարի 24-2025