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