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


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

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

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

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

чтобы повторить мой вопрос: необходимо ли сердцебиение, чтобы поддерживать соединение TCP/IP?

15 80

15 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

несколько ударов сердца необходимо поддерживать протокол TCP/IP-соединения в живых?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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