我已经检查了TCP协议Wiki,但是没有找到,如果在长时间内没有数据传输,套接字连接会超时。我的意思是......没有任何物理问题,但是两台计算机在一段时间内没有数据可以相互发送。连接如何仍然存在?会不会有一些低级别的数据传输来帮助它理解它没有被破坏?
谢谢!对不起,如果问题是愚蠢..
答案 0 :(得分:4)
没有数据通过网络发送以维持TCP连接。您可以简单地通过发送()来自对等方的零字节数据包或启用套接字选项来发送网络层保持活动,以让操作系统定期为您发送它们。在我看来,应用程序层保持活动(您的应用程序协议管理它)提供比传输层机制更好的设计/可靠性。
当设计在TCP之上的应用程序协议以获得最大可靠性时,通常需要在协议设计中包含某种非操作(NOOP),ping,心跳。
这非常重要,因为例如,如果您的服务器在建立连接后关闭来自客户端和客户端的请求,则TCP会话基本上是孤立的,您的服务器可能会永远收听。如果没有发送或接收数据,则无法检测到连接中断!!
如果服务器至少定期发送noop / ping / heartbeats,则传出请求将触发TCP层重新/超时机制,然后服务器将能够检测到死连接。相反,如果您的应用程序发送应用程序层“ping”或“嗨,你好吗?”消息,您可以进一步使用它来查询您的同行的状态,而不仅仅是基础连接。
例如,如果对等体陷入无限循环或其磁盘驱动器处于激活状态,那么单独的TCP Keepalive无法帮助您理解并解决潜在问题。
答案 1 :(得分:2)
TCP连接将保持打开状态,直到两端关闭它。
虽然请注意防火墙,特别是NAT网关通常会超时其TCP连接条目,这意味着如果您的连接经过一个连接,如果网关已删除该TCP连接的映射,则发送数据可能会出错。除非您的应用程序协议中有某种心跳或启用tcp keepalive,否则不会检测到网关超时的TCP连接读取。
答案 2 :(得分:0)
通常使用keepalives保持打开连接。
答案 3 :(得分:0)
不,不会。如果你需要任何一方断开连接,没有数据被传输,你需要自己实现它,使用某种“保持活跃”机制。