Нужно ли сердцебиение, чтобы сохранить соединение TCP открытым? - PullRequest
89 голосов
/ 15 мая 2009

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

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

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

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

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

Ответы [ 15 ]

51 голосов
/ 15 мая 2009

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

47 голосов
/ 15 мая 2009

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

21 голосов
/ 27 августа 2012

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

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

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

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

10 голосов
/ 15 мая 2009

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

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

9 голосов
/ 27 января 2010

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

Интервал поддержания активности по умолчанию составляет 2 часа.

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

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

3 голосов
/ 21 июля 2009

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

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

3 голосов
/ 15 мая 2009

Требуется ли пульс для поддержания соединения TCP / IP?

Они полезны для определения момента разрыва соединения.

2 голосов
/ 22 декабря 2010

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

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

2 голосов
/ 15 мая 2009

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

1 голос
/ 15 мая 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...