Секретна зброя 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 вдвічі все ще отримуються три надлишкові підтвердження, значення ssthresh записується як половина значення cwnd, і переходить у стан швидкого відновлення.

Швидке відновлення
У стані швидкого відновлення значення вікна перевантаження cwnd збільшується на один MSS для кожного отриманого надлишкового ACK, тобто ACK, який не надходить послідовно. Це робиться для того, щоб використовувати сегменти пакетів, які були успішно передані в мережі, для максимального підвищення ефективності передачі.

Коли надходить підтвердження (ACK) втраченого сегмента пакета, TCP зменшує значення cwnd, а потім переходить у стан запобігання перевантаженню. Це робиться для контролю розміру вікна перевантаження та запобігання подальшому збільшенню перевантаження мережі.

Якщо після стану контролю перевантаження виникає тайм-аут, стан мережі стає серйознішим, і TCP переходить зі стану уникнення перевантаження до стану повільного запуску. У цьому випадку значення вікна перевантаження cwnd встановлюється на 1 MSS, максимальна довжина сегмента пакета, а значення порогу повільного запуску ssthresh встановлюється на половину cwnd. Мета цього полягає в поступовому збільшенні розміру вікна перевантаження після відновлення мережі, щоб збалансувати швидкість передачі та ступінь перевантаження мережі.

Короткий зміст
Як надійний транспортний протокол, TCP реалізує надійний транспорт за порядковим номером, підтвердженням, керуванням повторною передачею, керуванням з'єднаннями та керуванням вікном. Серед них механізм керування потоком контролює обсяг даних, що надсилаються відправником, відповідно до фактичної пропускної здатності одержувача, що дозволяє уникнути проблем перевантаження мережі та зниження продуктивності. Механізм керування перевантаженням запобігає виникненню перевантаження мережі, регулюючи обсяг даних, що надсилаються відправником. Поняття вікна перевантаження та вікна відправлення пов'язані між собою, а обсяг даних у відправника контролюється шляхом динамічного регулювання розміру вікна перевантаження. Повільний старт, уникнення перевантаження та швидке відновлення – це три основні частини алгоритму керування перевантаженням TCP, які регулюють розмір вікна перевантаження за допомогою різних стратегій для адаптації до пропускної здатності та ступеня перевантаження мережі.

У наступному розділі ми детально розглянемо механізм ретрансляції TCP. Механізм ретрансляції є важливою частиною TCP для досягнення надійної передачі. Він забезпечує надійну передачу даних шляхом ретрансляції втрачених, пошкоджених або затриманих даних. Принцип реалізації та стратегія механізму ретрансляції будуть представлені та детально проаналізовані в наступному розділі. Слідкуйте за оновленнями!


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