Я намагаюся зрозуміти, у чому різниця між напіввідкритим підключенням TCP та напівзахисним TCP, чи може хтось сказати, що саме вони?
Я намагаюся зрозуміти, у чому різниця між напіввідкритим підключенням TCP та напівзахисним TCP, чи може хтось сказати, що саме вони?
Відповіді:
Ця публікація розширюється на половину закритих зв’язків. Для напіввідкритих з'єднань див. Правильний опис KContreau.
Кожне TCP-з'єднання складається з двох напівз'єднань, які закриті незалежно один від одного. Отже, якщо один кінець посилає FIN, то інший кінець вільний лише ACK, що FIN (замість FIN + ACK-ing), що сигналізує про кінець відправки FIN, що він ще має дані для надсилання. Таким чином, обидва кінці закінчуються в стабільному стані передачі даних, відмінному від ВИСТАВЛЕНОГО - а саме FIN_WAIT_2 (для кінця отримання) та CLOSE_WAIT (для кінця надсилання). Кажуть, що таке з'єднання є напівзакритим, а TCP насправді призначений для підтримки цих сценаріїв, тому напівзакрите з'єднання є функцією TCP.
Хоча RFC 793 описує лише необроблений механізм, навіть не згадуючи термін "напівзакритий", RFC 1122 детально розглядає це питання в розділі 4.2.2.13. Ви можете задуматися, кому, чорт, потрібна ця особливість. Дизайнери TCP також застосували TCP / IP для системи Unix і, як і кожен користувач Unix, любили перенаправлення вводу / виводу. За словами У. Стівенса (проілюстровано TCP / IP, Розділ 18.5), бажанням перенаправлення потоків TCP перенаправлення вводу / виводу було мотивацією до впровадження функції. Це дозволяє FIN-ack приймати роль або перекладати як EOF. Таким чином, це в основному функція, яка дозволяє випадково створити взаємодію в стилі імпровізований запит / відповідь на рівні програми, де FIN сигналізує про "кінець запиту".
Інші хлопці зробили досить гідну роботу, описуючи, що насправді є напіввідкриті та напівзакриті з'єднання , але ідею напіввідкритих з'єднань також часто шукають у контексті того, що вони є ПРОБЛЕМОЮ.
В Інтернеті є аргументи щодо того, що повинна представляти терміналогія «напіввідкрита» або «напівзакрита», але, наскільки я переживаю, термінологія є просто семантичною. Деякі кажуть, що "напіввідкриті" з’єднання - це "проблема", а "напівзакриті" - це конструктивна функція, яка дозволяє закрити поштовий потік, закривши потік відправлення до завершення завантаження файлу у напівзакритому стані ( як описали інші користувачі).
Однак, щодо іншої ... "проблеми": для відкриття TCP-з'єднання потрібно тристоронній рукостискання та 4-х напрямне рукостискання.
TCP має вразливість у тому, що остаточний пакет FIN, надісланий клієнтові, може бути потенційно скинутий маршрутизаторами / мережами, що призводить до напіввідкритого з'єднання, коли фактичним наміром було повністю закрити з'єднання. Цей та подібні підходи були популярними типами атак відмови в сервісі, оскільки вони не потребують великої пропускної здатності, але, можливо, з'їдають цінні ручки, розетки та нитки залежно від реалізації сервера, але вони можуть траплятися і в реальному світі із збільшенням частоти завдяки нашим безтурботним бездротовим операторам.
Операційні системи зробили спробу протистояти напіввідкритим атакам DDoS, обмеживши кількість напіввідкритих / закритих з'єднань, які можуть бути присутніми в операційній системі в даний момент часу, і вводячи максимальну тривалість часу, що з'єднання можуть залишатися в напіввідкритий / закритий стан. Востаннє я особисто перевіряв, проте, обмеження часу в Windows було досить великим (2 дні, якщо я пам'ятаю).
Ця умова ще більше посилюється необов'язковим характером збереження TCP, які, якщо повністю реалізовані, були призначені як рішення рівня протоколу (на відміну від рівня програми) для виявлення мертвих / зомбі-з'єднань. Але, коли був розроблений TCP, пропускна здатність була значно дорогоціннішою, ніж зараз, і виникали занепокоєння, що таймери для збереження живих мандадорів для TCP будуть занадто "балаканими". Таким чином, зберігання не є обов'язковим, зазвичай не використовується і не гарантується, що їх передаватимуть маршрутизатори відповідно до RFC1122. Отже ... навіть якщо ви включите функцію зберігання на рівні TCP в спробі виявити / обробити сценарій, ви можете виявити, що коли ваш трафік подорожує по всьому світу, деякі маршрутизатори скидають пакети, що залишаються в живих ... створюючи потенційно БІЛЬШЕ рідкісний сценарій тестування.
Напіввідкриті підключення представляють певну інженерну проблему для кодерів, які пишуть сервери на базі TCP, особливо тому, що вони можуть ненавмисно з’являтися випадково, під час великих навантажень ... і, як правило, на виробничих серверах ... і можуть бути важко помітити на етапах тестування Alpha / Beta. Згідно з моїм досвідом, я виявив, що вони відбуваються, можливо, 1 на 40 000 з'єднань на серверах, що працюють 2,5 мільйона підключень на день, але ці цифри залежать від ваших умов трафіку та умов трафіку кожної частини Інтернету між вашим сервером та клієнтом. .
Як інженер, може бути важко відслідковувати проблеми, які виникають нечасто і лише на живих, розгорнутих серверах, тому важливо спробувати моделювати цей рідкісний стан з'єднання під час написання коду сервера TCP, щоб проаналізувати, як ваш сервер буде реагувати, коли зіткнувся з цією ситуацією. Якщо ваш TCP-сервер використовує, наприклад, статичну кількість робочих потоків, ви можете виявити, що вони споживаються зомбі-з'єднань, наприклад, під час розгортання у виробництво. Якщо для підключення потрібна велика кількість робочої пам’яті, то кінцевий результат може виявитися схожим на витік пам’яті. тощо.
Без 100% життєздатного постійного рішення TCP залишає його на рівні користувача, щоб визначити, як обробляються напіввідкриті / закриті з'єднання, тому ваш код повинен мати план / механізм для виявлення, вимкнення та очищення- збільшити ресурси, коли ця умова виникає ... тобто припускаючи, що це винайдений протокол, а не один із багатьох (поганих) відкритих стандартів, якими користуються програмісти. Звичайно, я маю на увазі протоколи, такі як HTTP, які працюють виключно через TCP. Ці протоколи надзвичайно завищені на думку цього програміста.
Визнаючи слабкі сторони TCP та його прикрою популярності для передачі HTTP / веб-трафіку, розумні компанії прагнули шукати заміну. Наприклад, Google експериментував з протоколом під назвою QUIC, який передає HTTP через UDP. Існує також відкритий протокол під назвою TSCP. Проте жоден із цих протоколів не сприйняв широкого прийняття.
Як правило, я будую всі власні сервери для розмови виключно за власним протоколом на основі UDP. Однак UDP складніше, ніж ви можете подумати, і я відчуваю, що я завжди налаштовую його на швидше, розумніше, затримка, менша затора ... але принаймні мені більше не доводиться мати справу з напіввідкритими з'єднаннями; )
Коли TCP встановлює з'єднання, це вважається гарантованим, оскільки відбувається рукостискання:
У цей момент зв’язок встановлюється, і дані починають надходити. На відміну від цього, пакет UDP не гарантується, і він просто надсилається у надії, що він потрапить.
http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment
Офіційно, за даними RFC, напіввідкрите TCP-з'єднання - це коли одна сторона встановленого з'єднання вийшла з ладу, і не надіслала повідомлення про те, що з'єднання закінчується. Сьогодні це не звичайне використання.
Неофіційно, якщо можна посилатися на ембріональне з'єднання, яке є з'єднанням у процесі встановлення.
Напівзакрите - протилежне цьому неофіційному визначенню. Це стан десь посередині, де комп’ютери розривають встановлений зв’язок.
Найкраще пояснення припинення з'єднання TCP
У процесі трехстороннього рукостискання TCP ми вивчали, як встановити зв'язок між клієнтом і сервером в протоколі управління передачею (TCP), використовуючи бітові сегменти SYN. У цій статті ми вивчимо, як TCP тісно зв’язує клієнт та сервер. Тут нам також потрібно буде відправити бітові сегменти на сервер, для якого FIN-біт встановлено 1.
Як працює механізм у TCP:
Step 1 (FIN From Client) – Suppose that the client application decides it wants to close the connection. (Note that the server could also choose to close the connection). This causes the client send a TCP segment with the FIN bit set to 1 to server and to enter the FIN_WAIT_1 state. While in the FIN_WAIT_1 state, the client waits for a TCP segment from the server with an acknowledgment (ACK).
Step 2 (ACK From Server) – When Server received FIN bit segment from Sender (Client), Server Immediately send acknowledgement (ACK) segment to the Sender (Client).
Step 3 (Client waiting) – While in the FIN_WAIT_1 state, the client waits for a TCP segment from the server with an acknowledgment. When it receives this segment, the client enters the FIN_WAIT_2 state. While in the FIN_WAIT_2 state, the client waits for another segment from the server with the FIN bit set to 1.
Step 4 (FIN from Server) – Server sends FIN bit segment to the Sender(Client) after some time when Server send the ACK segment (because of some closing process in the Server).
Step 5 (ACK from Client) – When Client receive FIN bit segment from the Server, the client acknowledges the server’s segment and enters the TIME_WAIT state. The TIME_WAIT state lets the client resend the final acknowledgment in case the ACK is lost.The time spent by client in the TIME_WAIT state is depend on their implementation, but their typical values are 30 seconds, 1 minute, and 2 minutes. After the wait, the connection formally closes and all resources on the client side (including port numbers and buffer data) are released.
докладніше про: https://www.geeksforgeeks.org/tcp-connection-terination/
Напівзакрите з'єднання - це процес, який встановлюється, коли одним кінцем сервера і Клієнт мають намір припинити з'єднання. TCP - це процес, орієнтований на з'єднання, тому кожен сокет відкривається для певної програми. У TCP немає тиску для припинення роботи програми. Таким чином, орієнтований на з'єднання процес подовжує припинення сигналами очікування. це називається напівзакритим у TCP (з'єднання)