Нужно ли мне бить сердце, чтобы открыть TCP-соединение?

У меня есть два компонента, которые обмениваются данными через TCP/IP. Компонент A действует как сервер/слушатель, а компонент B - клиент. Эти два должны общаться как можно быстрее. В любой момент может быть только одна связь (хотя это не относится к этому вопросу). Старший разработчик в моей компании сказал, что мне нужно использовать биения уровня приложения между этими двумя компонентами, чтобы убедиться, что соединение остается открытым.

Я думал, что соединение остается открытым с TCP/IP, но я прочитал несколько блогов/сайтов, говорящих, что это довольно стандартная практика для биения между этими приложениями.

Я знаю часть компонента причины. Компонент B сердечных сокращений - это то, что он может информировать о поддержке, если есть проблемы с связью с компонентом B (либо ссылка не работает, либо компонент B не работает). Нужно ли сердцебиение по любой другой причине? Например, чтобы обеспечить, чтобы что-то "в трубе" не открывалось?

Компонент A в настоящее время активирует бит B каждые 20 секунд и закрывает соединение, если ничего не получено обратно из компонента B через 120 секунд. Затем он возобновляет прослушивание соединений в предположении, что компонент B будет периодически пытаться повторно подключиться, если связь нарушена. Это работает успешно.

Повторить мой вопрос: нужны ли сердечные сокращения для поддержания соединения TCP/IP?

Ответ 1

Соединение должно оставаться открытым независимо, но да, часто бывает так, что протоколы выполняют биение, чтобы помочь обнаружить мертвые соединения, IRC с PING например.

Ответ 2

Как и многие другие, TCP-соединение будет оставаться включенным, если оставить его на своих устройствах. Однако, если у вас есть устройство в середине соединения, которое отслеживает его состояние (например, брандмауэр), вам может потребоваться keepalives, чтобы не допустить истечения срока действия записи таблицы состояния.

Ответ 3

Если ваши компоненты:

  • находятся в обычной проводной сети.
  • между ними нет брандмауэров или маршрутизаторов NAT.
  • ни один из них не сбой

тогда вам не нужно биение сердца.

Если какое-либо из этих предположений ложно (я смотрю на вас, GPRS!), биение становится необходимым довольно быстро.

Ответ 4

Вам не нужно посылать heartbeats самостоятельно. TCP-соединение останется открытым независимо от использования.

Обратите внимание, что TCP реализует необязательный механизм keepalive, который может использоваться для своевременного определения закрытого соединения, а не для требования вы можете отправить данные позже, и только затем убедитесь, что соединение закрыто.

Ответ 5

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

Интервал сохранения по умолчанию - 2 часа.

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

Возможно, вам понадобится реализовать свой собственный сердечный ритм и отключить поддержку TCP на окнах, если 2-х часовая живая жизнь не нужна.

Ответ 6

Являются ли сердечные сокращения необходимым для поддержания соединения TCP/IP?

Они полезны для обнаружения, когда соединение умерло.

Ответ 7

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

Но это хорошо, если вы разрабатываете приложение, где основными критериями являются отзывчивость. Вам не понравится тратить время на настройки подключения, поиск DNS и открытия путей. Там постоянно держите соединение все время, продолжайте посылать пульс, и приложение знает, что соединение живое, а настройка соединения не требуется. Просто отправьте и получите.

Ответ 8

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

Ответ 9

В основном TCP-соединение создает состояния канала, сохраненные в коммутаторах, для маршрутизации. Чтобы обнаружить неисправные соединения (например, когда одна копия сбой (без отправки надлежащего отключения)), эти состояния должны быть выселены после периода бездействия. И когда это произойдет, ваше TCP-соединение было закрыто. Хотя я не могу точно сказать, как долго эти таймауты, они, похоже, зависят от производителей устройств и/или от интернет-провайдеров. Я помню, что мои незанятые сеансы SSH-терминалов были быстрыми (менее 15 минут бездействия), закрытыми моим бывшим интернет-провайдером 1 & 1, в то время как они оставались открытыми в течение нескольких часов при использовании подключенной Kabel-BW связи...

Наконец, я заканчиваю своими предыдущими ораторами: сердечный ритм - это хороший способ узнать, жива ли связь и пинать...

Ответ 10

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

Некоторые люди называют их NOOP (No Ops).

Но нет, они не нужны, чтобы поддерживать связь живым, полезно только знать, что такое статус.

Ответ 11

Я бы сказал, что если у вас нет пульса, не имеет значения, открыто ли ваше соединение TCP/IP или нет.

Ответ 12

Сердцебиение не является необходимостью для протоколов TCP. Реализация заключается в том, чтобы определить, завершила ли другая сторона соединение нестандартным способом (т.е. Не прошла процесс срыва).

Ответ 13

TCP/IP в качестве протокола указывается как не закрывающийся, пока вы не отправите закрытый пакет. У меня есть розетки, которые остаются открытыми даже после пятнистых беспроводных или интернет-соединений.

Однако это все очень зависит от реализаций. Скорее всего, будет "тайм-аут", что означает максимальное время ожидания ответа, прежде чем считать соединение "мертвым". Иногда это основано на самом приложении, иногда на NAT-маршрутизаторах.

Поэтому я настоятельно рекомендую вам сохранить "сердцебиение", чтобы обнаружить плохие соединения и оставить их открытыми.

Ответ 14

Соединение останется открытым - нет необходимости внедрять биение, и большинство приложений, использующих сокеты, этого не делают.

Ответ 15

Многие протоколы реализуют биение сердца или тип состояния здоровья, как сказал Ллойд. Просто чтобы вы знали, что соединение все еще открыто, и если вы что-то пропустили