通过Internet保持活动的TCP / IP连接套接字 - 什么时候?怎么样?多少钱?

时间:2010-10-11 15:16:58

标签: c# sockets tcp

更新:如果您想为自己保留冗长的序言,请跳至答案。

TCP / IP连接KeepAlives指定为每两个小时至少一次:http://tools.ietf.org/html/rfc1122#page-101。问题是这是写于1989年,并担心发送额外的KeepAlive数据包的成本!然而,仍然是默认时间,大多数操作系统根据规范在一段时间不活动后将KeepAlives发送到连接的套接字!当然,现在大多数连接超时之前的方式如果不活动,如果通过Internet连接连接到对等设备之前没有你的知识方式(尽管设置的超时高于那个 - 我怀疑因为中间的路由器表不打扰保持它还活着 - 我总是想知道泄漏的最后一条消息在哪里...... 更新:原因是可能在您或远程主机端的'路由器'是'有状态'并且连接感知和在一段时间不活动后丢弃连接 - 你通过互联网的路由器不能丢弃你的连接 - 他们不关心 - 数据包只是发送它必须去的地方)。所以我看到了两种常见的解决方案,可以通过互联网保持连接的存在:

1)忽略(编辑:,因为已经向我指出这不是无视规范它只是更改默认值)规范并将系统范围的KeepAlive间隔更改为低于2小时或者2)实现自己的'KeepAlive'系统定期轮询对等体。

无论哪种方式;什么是合适的时间段(发送KeepAlive的不活动时间)?我已经看到从1秒到默认2小时的所有内容。似乎这个数字是从拇指中吸出的......如果我有一个客户端应用程序从世界上任何地方连接什么是安全合理的时期(我想要一个持久的连接)?通过互联网连接到世界另一端的同伴很多跳,连接在301秒后死亡(尽管你在尝试发送东西时只知道它)所以将时间设置为300秒似乎是神奇的数字 - 我在死亡前获得了KeepAlive 1秒钟 - 这段时间从来没有让我失望过..但是它安全吗?

编辑:这个特殊的连接即将在C#3.0中实现,因此欢迎使用代码。

2 个答案:

答案 0 :(得分:14)

:当

如果您想阻止连接被删除。

如何

通过发送TCP / IP KeepAlives或自己发送内容(通过设置发送TCP / IP KeepAlives的时间段后建议将在系统级别应用于所有连接的套接字而不是在应用程序级别。)

多少

一根绳子有多长?首先,您必须了解连接被删除的原因:

连接断开的原因是:

家庭/商业“路由器”和“有状态”和连接感知的防火墙在一段时间不活动后往往会丢弃外部TCP连接

因此它与您的应用程序或TCP / IP本身没有没有,但是与硬件或软件有关,您的连接会通过。您可以对典型的不活动时段进行一些研究,在此期间,您可能通过连接的家庭/商业设备/软件断开连接(参见下面的列表)。但是,如果对等方可能是因特网上的任何用户:

最终如果你不知道他们经历了什么设备/软件:允许客户设置他们自己的不活动时间(发送一些东西以保持连接活着)。

以短暂的间隔(不活动)发送KeepAlives(或等效的)以适应所有情况(尽管不必要的流量是一件坏事,现在每隔几秒钟就会有一个额外的数据包丢失海洋,除了移动网络仍然)。但是根据TCP / IP的规范警告它应该能够在暂时中断后继续存在,因此将其设置得太低可能会导致不能幸免于暂时中断,http://aplawrence.com/Bofcusm/2426.html

  

收紧keepalive参数的不利方面也是你   在面对电缆中断时,TCP严重限制了其弹性。一个会话   它的两端都是活着的,准备好正常运行,即使是   中间电缆或路由器断开几分钟。如果   你已经告诉服务器疯狂地发送Keepalive,它会注意到   电缆断开和断开会话本来可以幸存   很好。

但是,如果你正在做一些通信,那么你会有一个中断,所以你必须处理这个问题,我认为这个问题已经过时,因为没有临时中断(它们更可能是永久性的 - 电缆不插电)与今天持久连接(与狡猾的拨号相反)。如果您有中断,您可能想要重新建立连接(例如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

为了所有人的利益,请编辑/优化这些列表。

答案 1 :(得分:10)

  

TCP / IP连接KeepAlives是   指定每两次最多一次   小时。

这不是它所说的。它说'这个间隔必须是可配置的,必须默认不少于两个小时。'

  

问题是这是写的   1989年并关注成本   发送额外的KeepAlive数据包!

保持活动可选和2小时默认(如果提供)的真正原因是#(2)在该原因列表中 - TCP / IP应该能够在中间设备的临时中断,重新路由等中存活。它是一种有用的机制,例如Telnet服务器以检测丢失的客户端。

  

忽略规范并更改您的规范   系统范围的KeepAlive间隔为   不到2个小时。

这不是'无视规范'。这只是改变了默认值。

大多数需要长期连接的应用程序要么在自己的应用程序协议中提供ping,要么使用连接失败后的连接池。