Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过Internet保持TCP/IP连接套接字的活动状态-何时?怎样?多少钱?_C#_Sockets_Tcp - Fatal编程技术网

C# 通过Internet保持TCP/IP连接套接字的活动状态-何时?怎样?多少钱?

C# 通过Internet保持TCP/IP连接套接字的活动状态-何时?怎样?多少钱?,c#,sockets,tcp,C#,Sockets,Tcp,更新:如果您想保存冗长的序言,请跳到答案 TCP/IP连接保持有效期指定为至少每两小时一次:。问题是这本书写于1989年,关注的是发送额外KeepAlive数据包的成本!然而,在一段时间的不活动之后,大多数操作系统按照规范发送KeepAlives到连接的套接字的默认时间仍然是这样!当然,现在大多数连接超时的方式早于此,如果处于非活动状态,并且如果通过Internet连接到对等连接,则在您不知情的情况下死亡(尽管设置的超时值高于此值-我怀疑是因为中间的路由器表不想让它保持活动状态-我一直想知道泄漏

更新:如果您想保存冗长的序言,请跳到答案

TCP/IP连接保持有效期指定为至少每两小时一次:。问题是这本书写于1989年,关注的是发送额外KeepAlive数据包的成本!然而,在一段时间的不活动之后,大多数操作系统按照规范发送KeepAlives到连接的套接字的默认时间仍然是这样!当然,现在大多数连接超时的方式早于此,如果处于非活动状态,并且如果通过Internet连接到对等连接,则在您不知情的情况下死亡(尽管设置的超时值高于此值-我怀疑是因为中间的路由器表不想让它保持活动状态-我一直想知道泄漏的最后一条消息去了哪里…更新:原因是可能位于您或远程主机端的“路由器”是“有状态”的,并且连接感知,并且在有一段时间不活动-你在互联网上通过的路由器不能断开你的连接-他们不关心-数据包只是发送到它必须去的地方)。因此,我看到了两种在互联网上保持连接活动的常见解决方案:

1) 忽略(编辑:正如我所指出的,这不是忽略规范,只是更改默认值)规范,并将系统范围内的KeepAlive间隔更改为小于2小时,或者2)实施自己的“KeepAlive”系统定期轮询对等方

不管怎样;什么是发送KeepAlive的合适时间(不活动的时间)?从1秒到默认的2小时,我都看过了。似乎这个数字被大拇指吸走了。。。如果我有一个客户端应用程序从世界任何地方连接,那么什么是安全和合理的周期(我想要一个单一的持久连接)?通过互联网连接到世界另一端的一个多跳的对等点连接在301秒时断开(尽管你只有在尝试发送内容时才知道这一点),因此将时间设置为300秒似乎是一个神奇的数字-我在死前1秒获得了保留时间-这一间隔从未让我失望。。但它安全吗

编辑:我在C#3.0中实现了这个特殊的连接,所以在欢迎中编写代码

TCP/IP连接保持有效 指定最多每两周一次 时间

它不是这么说的。它说,“这个时间间隔必须是可配置的,并且必须默认不少于两个小时。”

问题是这是用英文写的 1989年,他担心成本问题 发送额外的KeepAlive数据包

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

忽略规格,更改您的 到的系统范围保持间隔 少于2小时

这不是“忽略规范”,而是更改默认值

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

当您想防止连接断开时

如何

通过在一段不活动的时间后发送某些内容,可以发送TCP/IP保持活动,也可以自己发送某些内容(由于设置发送TCP/IP保持活动的时间段将在系统级别应用于所有连接的套接字,而不是在应用程序级别应用,因此建议这样做)

多少钱

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

断开连接的原因是:

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

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

最终,如果您不知道他们使用的是什么设备/软件:允许客户端设置他们自己的非活动期(在此期间发送内容以保持连接处于活动状态)。

以短时间间隔(不活动)发送KeepAlives(或您的等效物),以适应所有情况(尽管不必要的流量是件坏事,但现在每隔几秒钟不活动的额外数据包是沧海一粟,移动网络除外)。但请注意,根据TCP/IP规范,它应该能够经受住临时停机,因此将其设置得过低可能会产生无法经受住临时停机的不良影响,原因如下:

收紧keepalive参数的缺点是 大幅限制TCP在电缆中断情况下的恢复能力。会议 其两端都处于活动状态并准备正常运行,即使 中间电缆或路由器断开连接几分钟。如果 您已经告诉服务器疯狂地发送keepalives,它将注意到 电缆断开和断开连接会话,否则会幸存下来 很好

但是,如果您的计算机正在进行一些通信,那么您将有一个中断,因此您必须处理这个问题,我认为这个问题已经过时了,因为今天的持续连接不会出现临时中断(它们更可能是永久性的,即断开电缆)(而不是不可靠的拨号连接)。你应该有一个ou吗
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