Ключові таємниці брокера мережевого пакету TCP Connections: DemyStified необхідність потрійного рукостискання

Налаштування підключення TCP
Коли ми переглядаємо Інтернет, надсилаємо електронний лист або граємо в онлайн -гру, ми часто не думаємо про складне мережеве з'єднання за нею. Однак саме ці, здавалося б, невеликі кроки забезпечують стабільне спілкування між нами та сервером. Одним з найважливіших кроків є налаштування з'єднання TCP, а ядром цього-тристороннє рукостискання.

У цій статті детально обговорить принцип, процес та важливість тристороннього рукостискання. Крок за кроком ми пояснимо, чому потрібно тристороннє рукостискання, як він забезпечує стабільність та надійність з'єднання та наскільки це важливо для передачі даних. З глибшим розумінням тристороннього рукостискання ми зможемо краще зрозуміти основні механізми мережевого спілкування та чіткіший погляд на надійність з'єднань TCP.

Тристоронній процес рукостискання TCP та переходи стану
TCP-це протокол транспорту, орієнтований на з'єднання, який вимагає встановлення з'єднання перед передачею даних. Цей процес встановлення з'єднання здійснюється тристороннім рукостисканням.

 Тристороннє рукостискання TCP

Давайте детальніше розглянемо пакети TCP, які надсилаються в кожному з'єднанні.

Спочатку і клієнт, і сервер закриті. По -перше, сервер активно слухає порт і знаходиться в стані прослуховування, а це означає, що сервер повинен бути запущений. Далі клієнт готовий розпочати доступ до веб -сторінки. Потрібно встановити з'єднання з сервером. Формат першого пакету з'єднань такий:

 Syn Packet

Коли клієнт ініціює з'єднання, він генерує випадковий номер початкової послідовності (client_isn) і розміщує його в полі "Номер послідовності" заголовка TCP. У той же час клієнт встановлює положення прапора SYN на 1, щоб вказати, що вихідний пакет - це пакет SYN. Клієнт вказує, що він бажає встановити з'єднання з сервером, надсилаючи перший пакет SYN на сервер. Цей пакет не містить даних рівня додатків (тобто надсилається дані). На даний момент статус клієнта позначений як Syn-Sent.

Syn+Packet

Коли сервер отримує пакет SYN від клієнта, він випадковим чином ініціалізує власний серійний номер (Server_ISN), а потім розміщує цей номер у поле "Серійний номер" заголовка TCP. Далі, сервер вводить client_isn + 1 у поле "Підтвердження" і встановлює біт SYN та ACK до 1. Нарешті, сервер надсилає пакет клієнту, який не містить даних про шар (і немає даних для надсилання сервера). У цей час сервер знаходиться у стані SYN-RCVD.

Пакет ACK

Після того, як клієнт отримає пакет з сервера, йому потрібно виконати такі оптимізації, щоб відповісти на остаточний пакет відповідей: По -перше, клієнт встановлює біт ACK заголовка TCP пакету відповідей на 1; По -друге, клієнт вводить Server Server_ISN + 1 у полі "Підтвердити номер відповіді"; Нарешті, клієнт надсилає пакет на сервер. Цей пакет може переносити дані від клієнта на сервер. Після завершення цих операцій клієнт увійде у встановлений стан.

Після того, як сервер отримає пакет відповідей від клієнта, він також переходить у встановлений стан.

Як ви бачите з наведеного вище процесу, під час виконання тристороннього рукостискання третім рукостисканням дозволяється переносити дані, але перші два рукостискання не є. Це питання, яке часто задають в інтерв'ю. Після завершення тристороннього рукостискання обидві сторони вступають у встановлений стан, що вказує на те, що з'єднання було успішно встановлено, і в цей момент клієнт та сервер можуть почати надсилати дані один одному.

Чому три рукостискання? Не двічі, чотири рази?
Поширена відповідь: "Тому що тристороннє рукостискання гарантує можливість отримувати та відправляти". Ця відповідь є правильною, але це лише поверхнева причина, не висуне основну причину. Далі я проаналізую причини потрійного рукостискання з трьох аспектів, щоб поглибити наше розуміння цього питання.

Тристороннє рукостискання може ефективно уникнути ініціалізації історично повторних з'єднань (основна причина)
Тристороннє рукостискання гарантує, що обидві сторони отримали надійний номер початкової послідовності.
Тристороннє рукостискання уникає витрачання ресурсів.

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

Тристороннє рукостискання уникає історичних дублюючих з'єднань

Коли клієнт надсилає кілька пакетів установи SYN -з'єднання, в таких ситуаціях, як затори мережі, може виникнути наступне:

1- Старі пакети SYN надходять на сервер до останніх пакетів SYN.
2- Сервер відповість клієнту Syn + ACK пакет після отримання старого пакету SYN.
3- Коли клієнт отримує пакет SYN + ACK, він визначає, що з'єднання- це історичне з'єднання (номер послідовності закінчився або час очікування) відповідно до власного контексту, а потім надсилає RST-пакет на сервер, щоб перервати з'єднання.

З з'єднанням з двома руками немає способу визначити, чи є поточне з'єднання історичним з'єднанням. Тристороннє рукостискання дозволяє клієнту визначити, чи є поточне з'єднання історичним з'єднанням на основі контексту, коли він готовий надіслати третій пакет:

1- Якщо це історичне з'єднання (номер послідовності закінчився або час очікування), пакет, надісланий третім рукостисканням, є першим пакетом для припинення історичного з'єднання.
2- Якщо це не історичний зв’язок, пакет, надісланий втретє,- це пакет ACK, і дві комунікаційні сторони успішно встановлюють зв’язок.

Тому основною причиною того, що TCP використовує тристороннє рукостискання, є те, що він ініціалізує з'єднання для запобігання історичних з'єднань.

Причина 2: синхронізувати початкові числа послідовностей обох сторін
Обидві сторони протоколу TCP повинні підтримувати номер послідовності, що є ключовим фактором для забезпечення надійної передачі. Номери послідовностей відіграють важливу роль у зв'язках з TCP. Вони виконують наступне:

Приймач може усунути дублюючі дані та забезпечити точність даних.

Приймач може приймати пакети в порядку послідовності, щоб забезпечити цілісність даних.

● Номер послідовності може ідентифікувати пакет даних, який отримав інша сторона, що дозволяє надійною передачею даних.

Тому, встановлюючи з'єднання TCP, клієнт надсилає пакети SYN з початковим номером послідовності і вимагає від сервера відповісти пакет ACK, що вказує на успішний прийом пакету SYN клієнта. Потім сервер надсилає клієнту пакет SYN з початковим номером послідовності та чекає, коли клієнт відповість раз і назавжди, щоб переконатися, що початкові номери послідовностей надійно синхронізовані.

Синхронізувати початкові серійні номери обох сторін

Незважаючи на те, що чотиристороннє рукостискання також можливе для надійного синхронізації початкових чисел послідовностей обох сторін, другий та третій кроки можуть бути об'єднані в один крок, що призводить до тристороннього рукостискання. Однак два рукостискання можуть лише гарантувати, що початкова послідовність однієї сторони успішно сприймається іншою стороною, але немає гарантії, що початковий номер послідовності обох сторін може бути підтверджений. Тому тристороннє рукостискання-найкращий вибір для того, щоб забезпечити стабільність та надійність з'єднань TCP.

Причина 3: Уникайте витрачати ресурси
Якщо є лише "два рукоятки", коли в мережі заблокований запит клієнта SYN, клієнт не може отримати пакет ACK, надісланий сервером, тому SYN буде обурюватися. Однак, оскільки немає третього рукостискання, сервер не може визначити, чи клієнт отримав підтвердження ACK для встановлення з'єднання. Тому сервер може проактивно встановлювати з'єднання лише після отримання кожного запиту SYN. Це призводить до наступного:

Витрата ресурсів: Якщо запит клієнта SYN заблокований, що призведе до повторної передачі декількох пакетів SYN, сервер встановить кілька надмірних недійсних з'єднань після отримання запиту. Це призводить до непотрібної трата серверних ресурсів.

Збереження повідомлень: Через відсутність третього рукостискання сервер не має можливості знати, чи правильно клієнт отримав підтвердження ACK для встановлення з'єднання. Як результат, якщо повідомлення застрягають у мережі, клієнт буде продовжувати надсилати запити SYN знову і знову, внаслідок чого сервер постійно встановлює нові з'єднання. Це збільшить затори та затримку мережі та негативно вплине на загальну продуктивність мережі.

Уникайте витрачати ресурси

Тому, щоб забезпечити стабільність та надійність мережевого з'єднання, TCP використовує тристороннє рукостискання для встановлення з'єднання, щоб уникнути виникнення цих проблем.

Резюме
ЗБрокер мережевого пакетуУстанова підключення TCP здійснюється з тристороннім рукостисканням. Під час тристороннього рукостискання клієнт спочатку надсилає пакет із прапором SYN на сервер, що вказує на те, що він хоче встановити з'єднання. Отримавши запит від клієнта, сервер відповідає клієнту пакет із прапорами SYN та ACK, вказуючи на те, що запит на з'єднання прийнято, і надсилає власний номер початкової послідовності. Нарешті, клієнт відповідає на сервер з прапором ACK, щоб вказати, що з'єднання було успішно встановлено. Таким чином, дві сторони знаходяться у встановленому стані і можуть почати надсилати дані один одному.

Загалом, тристоронній процес рукостискання для встановлення з'єднання TCP розроблений для забезпечення стабільності та надійності з'єднання, уникнення плутанини та марнотратних ресурсів на історичні зв’язки та забезпечення того, щоб обидві сторони могли отримувати та надсилати дані.


Час посади: 08-2025 січня