TCP 连接生命周期

标签 tcp

我期望客户端/服务器 TCP 连接在野外持续多长时间?

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

最佳答案

我同意 Zan Lynx 的观点。不能保证,但假设没有连接或带宽问题,您可以通过发送数据几乎无限期地保持连接。

一般来说,我已经采用了应用程序级别的保持事件方法,尽管这通常是因为它在客户端规范中,所以我不得不这样做。但只需每隔一两分钟发送一些短数据,您就可以期待某种确认。

是否将一次失败视为连接失败由您决定。通常这就是我过去所做的,尽管有一个案例我已经连续等待三个失败的响应来断开连接,因为连接另一端的应用程序在响应“你在那里吗? ?”请求。

如果连接失败(有时它可能会失败),即使是在同一网络上的机器,也可以尝试重新建立连接。如果失败了一定次数,那么你就有问题了。如果您的连接在连接一段时间后仍然失败,那么您就有问题了。在这两种情况下,很可能是一些网络问题,而不是您的代码,或者您机器上的 TCP/IP 堆栈有问题(已知:我在旧版本的 QNX 上遇到过这个问题——它会只是随机摔倒)。话虽如此,您可能遇到了软件问题,唯一可以确定的方法通常是附加调试器,或者在那里进行一些日志记录。例如。如果您始终可以成功连接,但过了一段时间后您不再收到 ACK,即使是在重新连接之后,那么您的服务器可能会死锁,或者陷入循环或其他问题。

真正有用的是在各种负载条件下设置一系列长时间运行的测试,从仅发送 keep alive are you there?/ack 请求和响应,到彻底攻击服务器。这通常会让您对您的软件组件更有信心,并且对于解决一些非常奇怪的问题非常有用,这些问题不一定会导致您的连接出现问题,尽管它们可能会导致交易发生问题。例如,我曾经写过一个电信应用程序服务器,提供诸如号码转换之类的服务,我们只是让它一次运行几天。问题是,当星期六到来时,一整天,它都会拒绝所有进来的调用请求,这总计有数百万个调用,我们不知道为什么。原来是因为某个日期转换代码中的一个拼写错误只在星期六引起了问题。

希望对您有所帮助。

关于TCP 连接生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/158674/

相关文章:

sockets - TCP连接会丢包吗?

networking - 无数据时TCP断开

delphi - 如何在 Delphi 中提高 TCP 数据包的优先级?

c# - C#套接字编程错误

java - 在 AsyncTask 中维护 TCP 连接

python - scapy 花费无限时间发送 TCP SYN 数据包而没有回复。

.net - 使用 .NET 在内存中通信

Java InputStream 自动拆分套接字消息

c - scapy 在已建立的连接上发送 tcp 数据包

c++ - 强制 recv (Windows C++) 函数阻塞,直到读取 N 个字节