Сохранение активности сокетов, подключенных по TCP / IP через Интернет - когда? как? и сколько?

ОБНОВЛЕНИЕ: Если хотите, перейдите к ответу. чтобы избавить себя от длинной преамбулы.

TCP / IP-соединения KeepAlive указываются как минимум один раз в два часа: http://tools.ietf.org/html/rfc1122#page-101 .Проблема в том, что это было написано в 1989 году и касается стоимости отправки дополнительного пакета KeepAlive! Тем не менее, это по-прежнему время по умолчанию, в которое большинство ОС в соответствии со спецификацией отправляют KeepAlives через подключенный сокет после периода бездействия! Конечно, в настоящее время время ожидания большинства подключений задолго до этого, если они неактивны, и при подключении к одноранговому узлу через Интернет-соединения умирают без вашего ведома задолго до этого (несмотря на то, что тайм-аут для них установлен выше, чем это - я подозреваю, что таблицы маршрутизаторов между ними не заботятся о сохранении он жив - мне всегда было интересно, куда пропало последнее сообщение ... ОБНОВЛЕНИЕ: Причина в том, что «маршрутизаторы», которые могут быть на вашем или удаленном узле, «отслеживают состояние», а соединение известно и сбрасывается соединение после некоторого периода бездействия - маршрутизаторы, через которые вы проходите через Интернет, не могут разорвать ваше соединение - им все равно - пакет просто отправляется туда, куда он должен идти). Итак, я видел 2 распространенных решения для поддержания соединения через Интернет:

1) Игнорировать ( РЕДАКТИРОВАТЬ: , как было указано мне, это не игнорирование спецификации, это просто изменение значения по умолчанию ) спецификации и измените интервал KeepAlive для всей системы на менее 2 часов, или 2) внедрите свою собственную систему KeepAlive, периодически опрашивающую однорангового узла.

В любом случае; каков подходящий период (бездействия для отправки KeepAlive)? Я видел все от 1 секунды до 2 часов по умолчанию. Вроде цифра высосана из-под большого пальца ...Если у меня есть клиентское приложение, которое подключается потенциально из любой точки мира, каков безопасный и разумный период (мне нужно одно постоянное соединение)? При подключении к одноранговому узлу, находящемуся на другом конце света через Интернет, соединение прерывается через 301 секунду (хотя вы знаете об этом только тогда, когда пытаетесь отправить что-то), поэтому установка периода на 300 секунд кажется волшебным числом - Я получаю KeepAlive за 1 секунду до смерти - этот интервал меня никогда не подводил ... но насколько это безопасно?

РЕДАКТИРОВАТЬ: Это конкретное соединение, которое я реализую в C # 3.0, так что код в этом приветствии.

11
задан Andrew Medico 13 January 2017 в 23:23
поделиться