Сакрэтная зброя TCP: кантроль патоку ў сетцы і кантроль перагрузкі сеткі

Надзейнасць 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 выконвае хуткую паўторную перадачу і пераходзіць у стан аднаўлення. (Калі незразумела, чаму ёсць тры пакеты падцверджання, гэта будзе растлумачана асобна ў механізме паўторнай перадачы.)

Пазбяганне затораў
Калі TCP пераходзіць у стан кантролю перагрузкі, cwnd усталёўваецца на палову парога перагрузкі ssthresh. Гэта азначае, што значэнне cwnd нельга падвойваць кожны раз, калі атрымліваецца сегмент пакета. Замест гэтага выкарыстоўваецца адносна кансерватыўны падыход, пры якім значэнне cwnd павялічваецца толькі на адзін MSS (максімальная даўжыня сегмента пакета) пасля кожнай перадачы. Напрыклад, нават калі пацверджана 10 сегментаў пакета, значэнне cwnd павялічыцца толькі на адзін MSS. Гэта лінейная мадэль росту, і яна таксама мае верхнюю мяжу росту. Пры страце пакета значэнне cwnd змяняецца на MSS, а значэнне ssthresh усталёўваецца на палову cwnd. Або ж рост MSS спыняецца, калі атрыманы 3 лішнія адказы ACK. Калі пасля памяншэння значэння cwnd удвая ўсё яшчэ атрымліваюцца тры лішнія адказы ACK, значэнне ssthresh запісваецца як палова значэння cwnd, і пераходзіць у стан хуткага аднаўлення.

Хуткае аднаўленне
У стане хуткага аднаўлення значэнне акна перагрузкі cwnd павялічваецца на адзін MSS для кожнага атрыманага лішняга падпіскі ACK, гэта значыць падпіскі ACK, якая не паступае паслядоўна. Гэта робіцца для таго, каб выкарыстоўваць сегменты пакетаў, якія былі паспяхова перададзеныя па сетцы, і максімальна павысіць эфектыўнасць перадачы.

Калі прыходзіць пацверджанне страчанага сегмента пакета, TCP памяншае значэнне cwnd і пераходзіць у стан пазбягання перагрузкі. Гэта робіцца для кантролю памеру акна перагрузкі і прадухілення далейшага павелічэння перагрузкі сеткі.

Калі пасля стану кантролю перагрузкі адбываецца тайм-аўт, стан сеткі становіцца больш сур'ёзным, і TCP пераходзіць са стану пазбягання перагрузкі ў стан павольнага запуску. У гэтым выпадку значэнне акна перагрузкі cwnd усталёўваецца на 1 MSS, максімальная даўжыня сегмента пакета, а значэнне парога павольнага запуску ssthresh усталёўваецца на палову cwnd. Мэта гэтага - паступова павялічваць памер акна перагрузкі пасля аднаўлення сеткі, каб збалансаваць хуткасць перадачы дадзеных і ступень перагрузкі сеткі.

Кароткі змест
Як надзейны транспартны пратакол, TCP рэалізуе надзейную перадачу з дапамогай парадкавага нумара, пацверджання, кіравання паўторнай перадачай, кіравання злучэннямі і кіравання вокнамі. Сярод іх механізм кіравання патокам кантралюе аб'ём дадзеных, якія адпраўляюцца адпраўніком, у адпаведнасці з фактычнай прапускной здольнасцю атрымальніка, што дазваляе пазбегнуць праблем перагрузкі сеткі і зніжэння прадукцыйнасці. Механізм кіравання перагрузкай пазбягае ўзнікнення перагрузкі сеткі, рэгулюючы аб'ём дадзеных, якія адпраўляюцца адпраўніком. Паняцці акна перагрузкі і акна адпраўкі звязаны паміж сабой, і аб'ём дадзеных у адпраўніка кантралюецца шляхам дынамічнай карэкціроўкі памеру акна перагрузкі. Павольны старт, пазбяганне перагрузкі і хуткае аднаўленне - гэта тры асноўныя часткі алгарытму кіравання перагрузкай TCP, якія рэгулююць памер акна перагрузкі з дапамогай розных стратэгій, каб адаптавацца да прапускной здольнасці і ступені перагрузкі сеткі.

У наступным раздзеле мы падрабязна разгледзім механізм паўторнай перадачы TCP. Механізм паўторнай перадачы з'яўляецца важнай часткай TCP для дасягнення надзейнай перадачы. Ён забяспечвае надзейную перадачу дадзеных шляхам паўторнай перадачы страчаных, пашкоджаных або затрыманых дадзеных. Прынцып рэалізацыі і стратэгія механізму паўторнай перадачы будуць падрабязна прадстаўлены і прааналізаваны ў наступным раздзеле. Сачыце за навінамі!


Час публікацыі: 24 лютага 2025 г.