У меня есть два компонента, которые обмениваются данными через TCP / IP. Компонент A действует как сервер / слушатель, а компонент B - как клиент. Двое должны общаться как можно быстрее. В любой момент времени может быть только одно соединение (хотя это не относится к этому вопросу). Старший разработчик в моей компании сказал, что мне нужно использовать тактовые импульсы на уровне приложения между двумя компонентами, чтобы соединение оставалось открытым.
Я думал, что соединение с TCP / IP остается открытым, но я читал несколько блогов / сайтов, в которых говорится, что это довольно стандартная практика - тактика между этими приложениями.
Я знаю, что отчасти причина, по которой компонент A пульсирует, компонент B, так что он может сообщить службе поддержки, если есть проблемы со связью с компонентом B (либо канал не работает, либо компонент B не работает). Нужны ли сердцебиения по какой-либо другой причине? Например, чтобы убедиться, что «в трубе» часто есть что-то, что удерживает ее открытой?
Компонент A в настоящее время передает тактовый сигнал компоненту B каждые 20 секунд и закрывает соединение, если в течение 120 секунд от компонента B ничего не получено. Затем он возобновляет прослушивание соединений, предполагая, что компонент B будет периодически пытаться восстановить соединение, если связь разорвана. Это успешно работает.
Повторяю свой вопрос: необходимо ли сердцебиение для поддержания соединения TCP / IP?
Ответы:
Соединение должно оставаться открытым независимо от того, но да, часто можно увидеть, как протоколы реализуют контрольный сигнал, чтобы помочь обнаружить мертвые соединения, например IRC с командой PING .
источник
Как отмечали многие другие, TCP-соединение будет работать, если оно будет предоставлено его собственным устройствам. Однако, если у вас есть устройство в середине соединения, которое отслеживает его состояние (например, брандмауэр), вам могут потребоваться пакеты поддержки активности, чтобы не допустить истечения срока действия записи в таблице состояний.
источник
Если ваши компоненты:
тогда вам не нужно иметь сердцебиение.
Если любое из этих предположений неверно (я смотрю на вас, GPRS!), Сердцебиение становится необходимым довольно быстро.
источник
Вам не нужно самому отправлять сердцебиение. TCP-соединение останется открытым независимо от использования.
Обратите внимание, что TCP реализует дополнительный механизм поддержки активности , который можно использовать для своевременной идентификации закрытого соединения, вместо того, чтобы требовать, чтобы вы отправляли данные позже и только после этого обнаруживали, что соединение закрыто.
источник
Если вы используете окна, будьте осторожны с TCP Keep-alive. По умолчанию он отключен, если вы не включите его глобально с помощью реестра Windows или через setsockopt.
По умолчанию интервал сохранения активности составляет 2 часа.
http://msdn.microsoft.com/en-us/library/ms819735.aspx
Возможно, вам придется реализовать собственное сердцебиение и отключить поддержку TCP в окнах, если двухчасовое сохранение активности нежелательно.
источник
Они полезны для обнаружения разрыва соединения.
источник
TCP будет поддерживать соединение. Контрольные сообщения приложения предназначены для рассмотрения на уровне приложений, таких как переключение при отказе, балансировка нагрузки или предупреждение администраторов о потенциальных проблемах.
источник
Сердцебиение - хороший способ сообщить серверу, что вы живы, я имею в виду, что, если сервер использует системы предотвращения DoS-атак, он (сервер) может удалить все выделенные ресурсы для этого конкретного соединения после того, как он обнаружит бездействие в течение указанного периода.
У них нет полномочий на внедрение каких-либо механизмов сердцебиения.
Но это хорошо, если вы создаете приложение, где главный критерий - отзывчивость. Вам не захочется тратить время на настройку подключения, поиск DNS и поиск путей. Просто поддерживайте соединение все время, продолжайте посылать биения, и приложение знает, что соединение активно, и установка соединения не требуется. Просто отправьте и получите.
источник
TCP / IP как протокол определен как не закрываемый, пока вы не отправите закрывающий пакет. У меня розетки оставались открытыми даже после нестабильного беспроводного или интернет-соединения.
Однако все это очень зависит от реализации. Скорее всего, будет «тайм-аут», который означает максимальное время ожидания ответа, прежде чем считать соединение «мертвым». Иногда это основано на самом приложении, иногда на маршрутизаторах NAT.
Поэтому я настоятельно рекомендую вам следить за тем, чтобы обнаруживать плохие соединения и держать их открытыми.
источник
Обычно TCP-соединение создает состояния канала, хранящиеся в коммутаторах вместе с маршрутом. Чтобы обнаружить разорванные соединения (например, когда один из партнеров выходит из строя (без отправки надлежащего отключения)), эти состояния должны быть исключены после периода бездействия. И когда это происходит, ваше TCP-соединение закрывается. Хотя я не могу точно сказать, как долго эти таймауты, похоже, они зависят от производителей устройств и / или интернет-провайдеров. Я помню, что мои простаивающие сеансы терминала SSH были быстро (менее 15 минут простоя) закрыты моим бывшим интернет-провайдером 1 & 1, в то время как они оставались открытыми в течение нескольких часов при использовании соединения, предоставленного Kabel-BW ...
В заключение я хочу сказать своим предыдущим ораторам: сердцебиение - это хороший способ узнать, живо ли еще соединение и работает ли оно ...
источник
То, что вы называете сердцебиением, полезно при попытке установить тайм-ауты. Ваш сокет может показаться открытым, но человек на другом конце может страдать от BSOD. Один из самых простых способов обнаружить неработающие клиенты / серверы - установить тайм-аут и убедиться, что сообщения приходят время от времени.
Некоторые называют их NOOP (без операций).
Но нет, они не нужны для поддержания соединения, они полезны только для определения статуса.
источник
Я бы сказал, что если у вас нет пульса, не имеет значения, открыто ваше TCP / IP-соединение или нет.
источник
Heartbeat не является необходимостью для протоколов TCP. Его реализация предназначена для определения того, завершила ли другая сторона соединение нестандартным способом (т.е. не прошла ли процесс разрыва).
источник
Соединение останется открытым - нет необходимости реализовывать контрольный сигнал, и большинство приложений, использующих сокеты, этого не делают.
источник
Многие протоколы реализуют такие вещи, как сердцебиение или состояние здоровья, как сказал Ллойд. Просто чтобы вы знали, что соединение все еще открыто, и если вы что-то пропустили
источник