Требуется ли сердцебиение, чтобы TCP-соединение оставалось открытым?

95

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

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

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

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

Повторяю свой вопрос: необходимо ли сердцебиение для поддержания соединения TCP / IP?

Роб Грей
источник
1
Может ли такое поведение зависеть от реализации? Это что-то определено в стандарте TCP или остается как деталь реализации? Надеюсь, кто-нибудь еще сможет ответить на этот вопрос.
dss539
1
Я бы сказал, что это деталь реализации, поскольку не все протоколы на основе TCP / IP реализуют ее, поэтому это полностью зависит от вас.
Ллойд
5
Да - не из-за TCP / IP - но из-за другого оборудования или программного обеспечения, через которое вы подключаетесь, например, брандмауэры и домашние «маршрутизаторы», которые, как правило, сбрасывают неактивные TCP-соединения, связанные: stackoverflow.com/questions/3907537/…
markmnl

Ответы:

55

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

Ллойд
источник
34
Другой распространенной причиной сообщений поддержки активности является сохранение соединения через шлюзы nat. Хотя TCP сам по себе не нуждается в сообщениях keepalive для работы, шлюзы nat обычно "разрывают" TCP-соединение по истечении заданного времени ожидания.
4
Что такое обычный тайм-аут? секунды, минуты, часы?
MiniGod
@Lloyd Я "думаю" MiniGod имел в виду: "Как долго будет обычный тайм-аут?" (ответ дан в секундах, минутах, часах,…)
jeromej
@JeromeJ Кто знает, прошло уже несколько лет;)
Ллойд
Кроме того, если ваше соединение проходит через прокси, вы можете ожидать, что ваше соединение будет разорвано, если оно считается устаревшим. Я не думаю, что в этом случае поможет keep alive, потому что этот аспект tcp не распространяется на приложение.
Гита
50

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

Джеральд Комбс
источник
TCP-соединение скажет живым вечно?
user7817808
23

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

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

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

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

Ээро Аалтонен
источник
1
Хотя в целом это сеть. Рассмотрим «Ошибки распределенных вычислений» Питера Дойча; мы знаем, что сети по своей природе ненадежны, и поэтому их следует рассматривать как почти верную точку отказа в вашем приложении. В этом контексте, обычная проводная сеть или нет, предположим, что в какой-то момент вы столкнетесь с ошибкой, и разработайте свое приложение для обработки этого сценария.
Стивен Бахтиари
11

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

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

Брайан Агнью
источник
1
Как он должен работать в Linux? действительно ли это работает? Могу ли я установить время ожидания меньше 2 часов? например 30 секунд?
Итай Левин
Для этого приложение должно поддерживать keepalive. Просто включить его в Linux будет недостаточно.
Майк Велла,
9

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

По умолчанию интервал сохранения активности составляет 2 часа.

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

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

Эндрю Кейт
источник
3

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

Они полезны для обнаружения разрыва соединения.

ChrisW
источник
3

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

Утка
источник
3

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

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

Вивек Шарма
источник
2

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

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

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

Неизвестно
источник
2

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

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

Первое мая
источник
1

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

Некоторые называют их NOOP (без операций).

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

Кекоа
источник
1

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

Д. Патрик
источник
1

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

Темная звезда1
источник
0

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


источник
-2

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

ist_lion
источник