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