Оставьте живыми подключенные к TCP / IP сокеты через Интернет - когда? как? И как много? - PullRequest
11 голосов
/ 11 октября 2010

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

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

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

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

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

Ответы [ 2 ]

14 голосов
/ 01 марта 2011

Когда

Когда вы хотите предотвратить разрыв соединения.

Как

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

Сколько

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

Причина разрыва соединения:

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

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

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

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

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

Но у вас был бы сбой, если бы вы все равно делали какие-то сообщения, так что вы должны справиться с этим, и я думаю, что эта проблема устарела, так как у вас нет временных отключений (они, скорее всего, будут постоянными - кабель отключен) с сегодняшними днями постоянные соединения (в отличие от изворотливого набора, скажем). В случае сбоя вы можете захотеть восстановить соединение (например, 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

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

10 голосов
/ 12 октября 2010

Соединения TCP / IP. KeepAlives задаются не чаще одного раза в два часа.

Это не то, что говорится.В нем говорится: «Этот интервал ДОЛЖЕН быть настраиваемым и ДОЛЖЕН по умолчанию составлять не менее двух часов».

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...