我希望客户端/服务器TCP连接可以持续多长时间?

我希望它保持永久连接,但事情发生了,所以客户端必须重新连接。在什么时候我说代码中存在问题而不是某些外部设备出现问题?

有帮助吗?

解决方案

我同意Zan Lynx。我们无法保证,但假设没有连接或带宽问题,您可以通过在其上发送数据几乎无限期地保持连接活动。

一般来说,我已经采用了应用程序级别的keep-alive方法,虽然这通常是因为它已经在客户端规范中,所以我必须这样做。但是每隔一两分钟就发送一些简短的数据,你期望得到一些确认。

您是否因为连接失败而无法确认是否由您决定。通常这是我过去所做的,虽然有一个案例我连续等待三个连接失败的连接放弃连接,因为连接另一端的应用程序非常不稳定地响应“你是不是?那里"请求。

如果连接失败,即使机器在同一网络上,它可能会在某些时候失败,然后尝试重新建立它。如果失败了一定次数则会出现问题。如果您的连接在连接一段时间后再次出现故障,则会出现问题。最有可能在两种情况下,它可能是一些网络问题,而不是您的代码,或者您的计算机上的TCP / IP堆栈可能存在问题(已知:我在旧版本的QNX上遇到此问题 - 它只是随机摔倒)。说过你可能遇到了软件问题,唯一可以确定的方法就是附加一个调试器,或者在那里进行一些登录。例如。如果你总是可以成功连接,但是一段时间后你就会停止获取ACK,即使重新连接之后,也许你的服务器就会陷入僵局,或者陷入循环或其他什么状态。

真正有用的是在各种负载条件下设置一系列长时间运行的测试,从发送保持活动开始你是否存在?/ ack请求和响应,以及绝对殴打服务器。这通常会让您对软件组件更有信心,并且可以非常有用地解决一些非常奇怪的问题,这些问题不一定会导致连接出现问题,尽管它们可能会导致交易发生问题。例如,我曾经写过一个提供数字翻译等服务的电信应用服务器,我们只是让它一次运行几天。事情是,当星期六到来时,整整一天,它会拒绝所有进来的呼叫请求,这相当于数百万次呼叫,我们不知道为什么。原来是因为某些日期转换代码中的单个拼写错误只会在星期六造成问题。

希望有所帮助。

其他提示

我认为这里最重要的想法是理论与实践。

原始理论认为,这种联系没有生命。如果你有连接,它会永远保持打开状态,即使没有流量,直到一个事件导致它关闭。

新理论认为,大多数操作系统版本都已启用了保持活动计时器。这意味着只要另一端的系统响应偶尔的TCP级交换,连接将永远持续下去。

实际上,许多连接将在一段时间后终止,具有各种标准和情况。

两个非常好的例子是:远程客户端使用DHCP,租约到期,IP地址发生变化。

另一个例子是防火墙,它似乎越来越智能,可以识别保持活动流量与实际数据,并根据任何高级别标准,特别是空闲时间关闭连接。

您希望如何实现重新连接逻辑在很大程度上取决于您的体系结构,工作环境和性能目标。

这应该不重要,您应该将代码设计为自动重新连接,如果这是所需的行为。

真的没有办法说出来。 TCP固有的任何东西都不会导致连接在一定时间后丢失。有可靠连接的人可能有多年的正常运行时间,而另一个连接的人可能需要每5分钟重新连接一次。没有办法告诉甚至猜测。

您需要定期通过连接传输一些数据以使其保持活动状态 - 许多操作系统或防火墙将丢弃非活动连接。

选择一个值。每小时一滴可能就好了。 5分钟内出现10次意外连接可能表示存在问题。

TCP连接通常持续约两个小时,没有任何流量。任何一端都可以发送保持活动数据包,我认为这只是最后一个接收数据包的ACK。这通常可以在每个套接字上设置,也可以在每个TCP连接上默认设置。

应用程序级别keep-alive也是可能的。对于FTP,SMTP,POP或IMAP等telnet样式协议,例如发送返回,换行和返回命令提示符。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top