Чи потрібно мені бити серцебиття, щоб тримати зв’язок TCP відкритим?


94

У мене є два компоненти, які взаємодіють через TCP / IP. Компонент А діє як сервер / прослуховувач, а Компонент Б - клієнт. Їм слід спілкуватися якомога швидше. Будь-коли може бути лише один зв’язок у будь-який час (хоча це питання осторонь цього питання). Старший розробник моєї компанії сказав, що мені потрібно використовувати серцебиття на рівні додатків між двома компонентами, щоб забезпечити відкрите з’єднання.

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

Я знаю частину причини компонента A серцебиття компонента B, тому він може інформувати службу підтримки, якщо виникають проблеми з комунікацією з компонентом B (або посилання не працює, або компонент B не працює). Чи потрібні серцебиття з інших причин? Такі, щоб переконатися, що часто є щось "у трубі", щоб тримати її відкритою?

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

Ще раз повторю своє запитання: чи необхідні серцебиття, щоб підтримувати зв’язок TCP / IP?


1
Чи може ця поведінка також залежати від реалізації? Це щось зазначено у стандарті TCP, або це залишається як деталь реалізації? Сподіваємось, хтось інший може відповісти і на це.
dss539

1
Це деталь реалізації, я б сказав, оскільки не всі протоколи, засновані на TCP / IP, реалізують таке, що залишається повністю за вами.
Ллойд,

5
Так - не becuase з TCP / IP - але з - за іншого обладнання або програмного забезпечення ви з'єднання може пройти через такі як брандмауери і домашніх «маршрутизаторах» , які , як правило, падіння неактивні сполуки TCP, пов'язані: stackoverflow.com/questions/3907537 / ...
markmnl

Відповіді:


54

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


34
Ще однією поширеною причиною збереження програми є підтримка відкритого зв’язку через шлюзи nat. Хоча самому TCP для роботи не потрібні програми збереження, загальноприйнятим для шлюзів nat є "скидання" з'єднання tcp після заданого тайм-ауту.
nos

4
Що таке звичайний тайм-аут? секунди, хвилини, години?
MiniGod

@Lloyd Я "думаю", що MiniGod мав на увазі: "Скільки часу було б нормальним тайм-аутом?" (відповідь дана в секундах, хвилинах, годинах…)
jeromej

@JeromeJ Хто знає, минуло кілька років;)
Ллойд,

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

49

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


З’єднання TCP скаже живим назавжди?
user7817808

22

Якщо ваші компоненти:

  • перебувають у звичайній дротовій мережі
  • між ними немає брандмауерів або маршрутизаторів NAT
  • жоден з них не розбивається

тоді вам не потрібно відчувати серцебиття.

Якщо будь-яке з цих припущень хибне (я дивлюсь на вас, GPRS!), Серцебиття стає досить швидким.


1
Однак це взагалі мережа. Розглянемо помилки розподілених обчислень Пітера Дойча; ми знаємо, що мережі за своєю суттю ненадійні, і тому їх слід розглядати як майже певну точку відмови у вашому додатку. У цьому контексті, звичайна дротова мережа чи ні, припустимо, що в якийсь момент у вас виникне збій і спроектуйте свою програму для обробки цього сценарію.
Стівен Бахтіарі,

11

Вам не потрібно самостійно надсилати серцебиття. TCP-з'єднання залишатиметься відкритим незалежно від використання.

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


1
Як передбачається працювати на Linux? це насправді працює? Чи можу я запланувати час очікування менше 2 годин? наприклад 30 секунд?
Itay Levin

Щоб це працювало, програма повинна підтримувати підтримку keepalive. Просто включити його в Linux буде недостатньо.
Mike Vella

9

Якщо ви використовуєте Windows, будьте обережні щодо TCP Keep-alive. За замовчуванням його вимкнено, якщо ви не ввімкнули його глобально за допомогою реєстру Windows або через setsockopt.

Інтервал підтримки за умовчанням - 2 години.

http://msdn.microsoft.com/en-us/library/ms819735.aspx

Можливо, вам доведеться застосувати власний серцебиття та вимкнути TCP підтримку на Windows, якщо 2 години підтримання життя не бажане.


3

Чи необхідні серцебиття, щоб підтримувати зв’язок TCP / IP?

Вони корисні для виявлення, коли зв’язок припинився.


3

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


3

Серцебиття - це хороший спосіб повідомити серверу, що ти живий, при цьому я маю на увазі, що якщо сервер використовує системи запобігання атакам DoS, він (сервер) може видалити всі виділені ресурси для цього конкретного підключення, після виявлення бездіяльність протягом певного періоду.
Вони не мають повноважень застосовувати будь-які механізми серцебиття.

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


2

TCP / IP як протокол визначається як не закритий, поки ви не надішлете закритий пакет. У мене розетки залишаються відкритими навіть після плямистих бездротових або Інтернет-з’єднань.

Однак все це дуже залежить від реалізацій. Швидше за все, буде "тайм-аут", що означає максимальну кількість часу на очікування відповіді, перш ніж вважати з'єднання "мертвим". Іноді це базується на самому додатку, іноді на маршрутизаторах NAT.

Тому я настійно рекомендую вам тримати «серцебиття», щоб виявити погані зв’язки та тримати їх відкритими.


2

В основному TCP-з'єднання створює стан зв'язку, що зберігається в комутаторах на маршруті. Для того, щоб виявити розірвані з'єднання (наприклад, коли один аналог аварійно завершує роботу (без надсилання належного роз'єднання)), ці стани повинні бути виселені після періоду бездіяльності. І коли це трапляється, ваше з’єднання TCP було закрито. Хоча я точно не можу сказати, скільки тривають ці очікування, вони, схоже, залежать від виробників пристроїв та / або від інтернет-провайдерів. Я пам’ятаю, що мої незайняті сеанси терміналу SSH були швидко (менше 15 хв простою) закриті моїм колишнім провайдером Інтернету 1 і 1, поки вони залишалися відкритими протягом декількох годин, використовуючи підключення Kabel-BW ...

Нарешті, я закінчую своїми попередніми доповідачами: серцебиття - це хороший спосіб визначити, чи зв’язок все ще живий і гострий ...


1

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

Деякі люди називають їх NOOP (No Ops).

Ні, вони не потрібні, щоб підтримувати зв’язок, лише корисно знати, який статус.


1

Я б сказав, що якщо у вас немає серцебиття, неважливо, відкрите ваше з'єднання TCP / IP чи ні.


1

Серцебиття не є необхідністю для протоколів TCP. Його реалізація полягає в тому, щоб виявити, чи інша сторона розірвала з'єднання нестандартним способом (тобто не пройшла процес зриву).


0

З’єднання залишатиметься відкритим - немає необхідності реалізовувати серцебиття, і більшість програм, які використовують сокети, цього не роблять.


-2

Багато протоколів реалізують серцебиття або стан здоров’я, як сказав Ллойд. Тільки для того, щоб ви знали, що зв’язок все ще відкритий, і якщо ви, можливо, щось пропустили

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.