Тайното оръжие на 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 да превключи в режим на контрол на претоварването и да прекрати бавното стартиране.

Последният начин, по който бавният старт може да приключи, е ако бъдат открити три излишни потвърждения (ACK), TCP извършва бързо повторно предаване и влиза в състояние на възстановяване. (Ако не е ясно защо има три ACK пакета, това ще бъде обяснено отделно в механизма за повторно предаване.)

Избягване на задръствания
Когато TCP влезе в състояние на контрол на претоварването, cwnd се задава на половината от прага на претоварване ssthresh. Това означава, че стойността на cwnd не може да се удвоява всеки път, когато се получи пакетен сегмент. Вместо това се възприема относително консервативен подход, при който стойността на cwnd се увеличава само с един MSS (максимална дължина на пакетния сегмент) след всяко завършване на предаването. Например, дори ако 10 пакетни сегмента бъдат потвърдени, стойността на cwnd ще се увеличи само с един MSS. Това е линеен модел на растеж и той също има горна граница на растежа. Когато възникне загуба на пакет, стойността на cwnd се променя на MSS, а стойността на ssthresh се задава на половината от cwnd. Или пък растежът на MSS ще спре, когато бъдат получени 3 излишни ACK отговора. Ако все още се получават три излишни ACK-а след намаляване наполовина на стойността на cwnd, стойността на ssthresh се записва като половината от стойността на cwnd и се влиза в състояние на бързо възстановяване.

Бързо възстановяване
В състояние на бързо възстановяване, стойността на прозореца за претоварване cwnd се увеличава с една MSS за всяко получено излишно ACK, т.е. ACK, което не пристига последователно. Това се прави, за да се използват успешно предадените в мрежата пакетни сегменти, за да се подобри максимално ефективността на предаване.

Когато пристигне потвърждение за изгубен сегмент от пакет, TCP намалява стойността на cwnd и след това влиза в състояние на избягване на претоварване. Това се прави, за да се контролира размерът на прозореца за претоварване и да се избегне по-нататъшно увеличаване на мрежовото претоварване.

Ако след състоянието на контрол на претоварването възникне изтичане на времето за изчакване, състоянието на мрежата става по-сериозно и TCP мигрира от състояние на избягване на претоварване към състояние на бавен старт. В този случай стойността на прозореца за претоварване cwnd е зададена на 1 MSS, максималната дължина на пакетния сегмент и стойността на прага за бавно стартиране ssthresh са зададени на половината от cwnd. Целта на това е постепенно да се увеличи размерът на прозореца за претоварване, след като мрежата се възстанови, за да се балансират скоростта на предаване и степента на претоварване на мрежата.

Обобщение
Като надежден транспортен протокол, TCP реализира надежден транспорт чрез пореден номер, потвърждение, контрол на повторното предаване, управление на връзките и контрол на прозореца. Сред тях, механизмът за контрол на потока контролира количеството данни, изпратени от подателя, според действителния капацитет на приемане на получателя, което избягва проблемите с претоварването на мрежата и влошаването на производителността. Механизмът за контрол на претоварването избягва появата на претоварване на мрежата чрез регулиране на количеството данни, изпратени от подателя. Концепциите за прозорец на претоварване и прозорец на изпращане са свързани помежду си и количеството данни при подателя се контролира чрез динамично регулиране на размера на прозореца на претоварване. Бавният старт, избягването на претоварване и бързото възстановяване са трите основни части на алгоритъма за контрол на претоварването на TCP, които регулират размера на прозореца на претоварване чрез различни стратегии, за да се адаптират към капацитета и степента на претоварване на мрежата.

В следващия раздел ще разгледаме подробно механизма за ретранслация на TCP. Механизмът за ретранслация е важна част от TCP за постигане на надеждно предаване. Той осигурява надеждно предаване на данни чрез ретранслация на загубени, повредени или забавени данни. Принципът на внедряване и стратегията на механизма за ретранслация ще бъдат представени и анализирани подробно в следващия раздел. Очаквайте скоро!


Време на публикуване: 24 февруари 2025 г.