Содержите Alive TCP/IP подключенные сокеты через Интернет - когда? как? И как много?

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

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

1) Не обращайте внимания ( EDIT:, как было указано мне, это не игнорирует спецификацию, это просто изменение значения по умолчанию) спецификация и изменение вашего системного интервала KeepAlive до менее чем 2 часов, или 2) реализовать свою собственную систему KeepAlive, периодически опросив сверстников.

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

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

Ответ 1

Когда

Если вы хотите предотвратить сброс соединения.

Как

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

Сколько

Как долго длится строка? Сначала вы должны понять, почему соединение отключено:

Причина, по которой удаляется соединение, следующая:

Домашние/коммерческие "маршрутизаторы" и брандмауэры, которые являются "stateful" и осведомлены о соединении, как правило, теряют внешние TCP-соединения после некоторого периода бездействия

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

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

Или отправьте KeepAlives (или ваш эквивалент) через короткие промежутки времени (бездействия) для размещения всех случаев (хотя ненужный трафик - это плохая вещь, когда дополнительный пакет каждые несколько секунд бездействия - это падение океан, за исключением мобильных сетей). Но будьте осторожны в соответствии со спецификацией TCP/IP, которая, как предполагается, переживает временные отключения, поэтому ее слишком низкая может привести к нежелательному влиянию на то, что вы не пережили временный перерыв, от http://aplawrence.com/Bofcusm/2426.html:

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

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

Некоторые исследования, которые используют общие приложения:

App    |    KeepAlive sent after    |    configurable    | ref
--------------------------------------------------------------
Telnet |    600 seconds             |          Y         | http://www-01.ibm.com/support/docview.wss?uid=nas14adccb91a24d9ed28625694900513857
MS RDP |    ?

И некоторые исследования того, какие устройства/программное обеспечение отказывают в неактивных соединениях и когда:

Device/SW                |    dropped after    |    configurable    | ref
--------------------------------------------------------------
Windows 2003 Firewall    |    24 hours         |          ?         | http://technet.microsoft.com/en-us/library/cc755604(WS.10).aspx
SonicWall TZ100/200      |     5 mins          |          Y         |  http://www.sonicwall.com/downloads/SonicWALL_TZ_100_200_Series_Getting_Started_Guide.pdf
Netgear FR114P           |     5 mins          |          N         | http://www.broadbandreports.com/forum/remark,4182300
Cisco ASA                |     1 hour          |          Y         | http://www.cisco.com/c/en/us/td/docs/security/asa/asa91/configuration/firewall/asa_91_firewall_config/conns_connlimits.html

Пожалуйста, отредактируйте/уточните эти списки в интересах всех.

Ответ 2

Соединения TCP/IP KeepAlives: указано не чаще одного раза в два ч.

Это не то, что он говорит. Он говорит: "Этот интервал ДОЛЖЕН быть настраиваемым и НЕ ДОЛЖЕН иметь значение не менее двух часов".

Проблема заключается в том, что это было написано в 1989 г. и обеспокоен стоимостью отправки дополнительного пакета KeepAlive!

Настоящая причина для продолжения использования keep-alive и двухчасового значения по умолчанию, если в этом списке указано # (2). Предполагается, что TCP/IP выживет при временном отключении промежуточного оборудования, повторной маршрутизации и т.д. Это полезный механизм, например Серверы Telnet для обнаружения потерянных клиентов.

Не обращайте внимания на спецификацию и системный интервал KeepAlive менее 2 часов.

Это не "игнорирование спецификации". Это просто изменение значения по умолчанию.

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