Налаштування підключення TCP
Коли ми переглядаємо веб-сторінки, надсилаємо електронний лист або граємо в онлайн-ігри, ми часто не замислюємося про складне мережеве з’єднання, яке стоїть за цим. Однак саме ці, здавалося б, маленькі кроки забезпечують стабільний зв’язок між нами та сервером. Одним із найважливіших кроків є налаштування TCP-з’єднання, а основою цього є тристороннє рукостискання.
У цій статті буде детально розглянуто принцип, процес і важливість тристороннього рукостискання. Крок за кроком ми пояснимо, навіщо потрібне тристороннє рукостискання, як воно забезпечує стабільність і надійність з'єднання і наскільки воно важливо для передачі даних. Завдяки глибшому розумінню тристороннього рукостискання ми отримаємо краще розуміння базових механізмів мережевого зв’язку та більш чітке уявлення про надійність TCP-з’єднань.
Процес тристороннього рукостискання TCP і зміни станів
TCP — це транспортний протокол, орієнтований на з’єднання, який вимагає встановлення з’єднання перед передачею даних. Цей процес встановлення з’єднання здійснюється шляхом тристороннього рукостискання.
Давайте детальніше розглянемо TCP-пакети, які надсилаються в кожному з’єднанні.
Спочатку і клієнт, і сервер ЗАКРИТІ. По-перше, сервер активно прослуховує порт і перебуває в стані LISTEN, що означає, що сервер потрібно запустити. Далі клієнт готовий почати доступ до веб-сторінки. Йому потрібно встановити з’єднання з сервером. Формат першого пакета підключення такий:
Коли клієнт ініціює з’єднання, він генерує випадковий початковий порядковий номер (client_isn) і розміщує його в полі «Номер послідовності» заголовка TCP. У той же час клієнт встановлює позицію прапора SYN на 1, щоб вказати, що вихідний пакет є пакетом SYN. Клієнт вказує, що він бажає встановити з’єднання з сервером, надіславши на сервер перший пакет SYN. Цей пакет не містить даних прикладного рівня (тобто надісланих даних). На цьому етапі статус клієнта позначено як SYN-SENT.
Коли сервер отримує пакет SYN від клієнта, він випадковим чином ініціалізує власний серійний номер (server_isn), а потім поміщає цей номер у поле «Серійний номер» заголовка TCP. Далі сервер вводить client_isn + 1 у полі «Acknowledgement number» і встановлює для бітів SYN і ACK значення 1. Нарешті сервер надсилає пакет клієнту, який не містить даних прикладного рівня (і даних для сервера). відправити). У цей час сервер перебуває в стані SYN-RCVD.
Після того, як клієнт отримує пакет від сервера, йому необхідно виконати такі оптимізації, щоб відповісти на остаточний пакет відповіді: спочатку клієнт встановлює біт ACK заголовка TCP пакета відповіді на 1; По-друге, клієнт вводить значення server_isn + 1 у полі «Номер підтвердження відповіді»; Нарешті, клієнт надсилає пакет на сервер. Цей пакет може передавати дані від клієнта до сервера. Після завершення цих операцій клієнт перейде в стан ESTABLISHED.
Як тільки сервер отримує пакет відповіді від клієнта, він також переходить у стан ESTABLISHED.
Як ви можете бачити з наведеного вище процесу, під час виконання тристороннього рукостискання третє рукостискання дозволяє переносити дані, але перші два рукостискання – ні. Це питання часто задають на співбесідах. Після завершення тристороннього рукостискання обидві сторони переходять у стан ESTABLISHED, що вказує на те, що з’єднання успішно встановлено, після чого клієнт і сервер можуть почати надсилати дані один одному.
Чому три рукостискання? Не двічі, чотири рази?
Загальна відповідь: «Тому що тристороннє рукостискання гарантує можливість отримувати та надсилати». Ця відповідь правильна, але це лише поверхнева причина, яка не висуває головної причини. Далі я проаналізую причини потрійного рукостискання з трьох аспектів, щоб поглибити наше розуміння цього питання.
Тристороннє рукостискання може ефективно уникнути ініціалізації історично повторюваних з'єднань (основна причина)
Тристороннє рукостискання гарантує, що обидві сторони отримали надійний початковий порядковий номер.
Тристороннє рукостискання дозволяє уникнути марної витрати ресурсів.
Причина 1: уникайте історичних повторюваних об’єднань
У двох словах, основна причина тристороннього рукостискання полягає в тому, щоб уникнути плутанини, спричиненої ініціалізацією старого дублюючого з’єднання. У складному мережевому середовищі передача пакетів даних не завжди надсилається на хост-адресат відповідно до зазначеного часу, і старі пакети даних можуть надійти на хост-адресат першими через перевантаження мережі та з інших причин. Щоб уникнути цього, TCP використовує тристороннє рукостискання для встановлення з’єднання.
Коли клієнт послідовно надсилає кілька пакетів встановлення з’єднання SYN, у таких ситуаціях, як перевантаження мережі, може статися таке:
1- Старі пакети SYN надходять на сервер раніше останніх пакетів SYN.
2- Сервер відповість клієнту на пакет SYN + ACK після отримання старого пакету SYN.
3- Коли клієнт отримує пакет SYN + ACK, він визначає, що з’єднання є історичним (термін дії порядкового номера закінчився або час очікування) відповідно до його власного контексту, а потім надсилає пакет RST на сервер для переривання з’єднання.
При з’єднанні з двома рукостисканнями неможливо визначити, чи є поточне з’єднання історичним. Тристороннє рукостискання дозволяє клієнту визначити, чи є поточне підключення історичним підключенням на основі контексту, коли він готовий надіслати третій пакет:
1- Якщо це історичне з’єднання (термін дії порядкового номера закінчився або час очікування), пакет, надісланий третім рукостисканням, є пакетом RST для розірвання історичного з’єднання.
2- Якщо це не історичне з’єднання, пакет, надісланий втретє, є пакетом ACK, і дві сторони, що спілкуються, успішно встановлюють з’єднання.
Таким чином, основна причина того, що TCP використовує тристороннє рукостискання, полягає в тому, що він ініціалізує з’єднання, щоб запобігти історичним з’єднанням.
Причина 2: Для синхронізації початкових порядкових номерів обох сторін
Обидві сторони протоколу TCP повинні підтримувати порядковий номер, який є ключовим фактором для забезпечення надійної передачі. Порядкові номери відіграють важливу роль у з’єднаннях TCP. Вони виконують такі дії:
Приймач може усунути повторювані дані та забезпечити точність даних.
Одержувач може отримувати пакети в порядку порядкового номера, щоб забезпечити цілісність даних.
● Порядковий номер може ідентифікувати пакет даних, отриманий іншою стороною, що забезпечує надійну передачу даних.
Таким чином, після встановлення TCP-з’єднання клієнт надсилає пакети SYN з початковим порядковим номером і вимагає від сервера відповісти пакетом ACK, що вказує на успішне отримання пакета SYN клієнта. Потім сервер надсилає клієнту пакет SYN із початковим порядковим номером і чекає, поки клієнт відповість раз і назавжди, щоб переконатися, що початкові порядкові номери надійно синхронізовані.
Хоча чотиристороннє рукостискання також можливе для надійної синхронізації початкових порядкових номерів обох сторін, другий і третій кроки можна об’єднати в один крок, що призводить до тристороннього рукостискання. Однак два рукостискання можуть лише гарантувати, що початковий порядковий номер однієї сторони успішно отримано іншою стороною, але немає гарантії, що початковий порядковий номер обох сторін може бути підтверджено. Таким чином, тристороннє рукостискання є найкращим вибором для забезпечення стабільності та надійності TCP-з’єднань.
Причина 3: уникайте марнування ресурсів
Якщо є лише «двостороннє рукостискання», коли запит SYN клієнта заблоковано в мережі, клієнт не може отримати пакет ACK, надісланий сервером, тому SYN буде надіслано повторно. Однак, оскільки третього рукостискання немає, сервер не може визначити, чи отримав клієнт підтвердження ACK для встановлення з’єднання. Таким чином, сервер може проактивно встановити з’єднання лише після отримання кожного запиту SYN. Це призводить до наступного:
Марна витрата ресурсів: якщо SYN-запит клієнта заблоковано, що призводить до повторної передачі кількох SYN-пакетів, сервер встановить кілька надлишкових недійсних з’єднань після отримання запиту. Це призводить до непотрібної витрати ресурсів сервера.
Зберігання повідомлення: через відсутність третього рукостискання сервер не може дізнатися, чи правильно клієнт отримав підтвердження ACK для встановлення з’єднання. У результаті, якщо повідомлення застрягають у мережі, клієнт надсилатиме запити SYN знову і знову, змушуючи сервер постійно встановлювати нові з’єднання. Це збільшить перевантаженість мережі та затримки та негативно вплине на загальну продуктивність мережі.
Тому, щоб забезпечити стабільність і надійність мережевого з'єднання, TCP використовує тристороннє рукостискання для встановлення з'єднання, щоб уникнути виникнення цих проблем.
Резюме
TheБрокер мережевих пакетівВстановлення з’єднання TCP здійснюється за допомогою тристороннього рукостискання. Під час тристороннього рукостискання клієнт спочатку надсилає серверу пакет із прапором SYN, вказуючи, що він хоче встановити з’єднання. Отримавши запит від клієнта, сервер відповідає клієнту пакетом з прапорцями SYN і ACK, що вказує на те, що запит на підключення прийнято, і надсилає свій початковий порядковий номер. Нарешті, клієнт відповідає прапором ACK серверу, щоб вказати, що з’єднання успішно встановлено. Таким чином, дві сторони перебувають у стані ESTABLISHED і можуть почати надсилати дані одна одній.
Загалом процес тристороннього рукостискання для встановлення TCP-з’єднання призначений для забезпечення стабільності та надійності з’єднання, уникнення плутанини та марної витрати ресурсів через історичні з’єднання та забезпечення того, що обидві сторони можуть отримувати та надсилати дані.
Час публікації: 08 січня 2025 р