【问题标题】:TCP disconnection if no data如果没有数据,TCP 断开连接
【发布时间】:2010-01-09 18:15:55
【问题描述】:

我查看了TCP协议Wiki,但没有发现,如果长时间没有数据传输,socket连接是否会超时。我的意思是..不会有物理问题,但是两台计算机在一段时间内没有数据可以相互发送。如何连接仍然存在?会不会有一些低级的数据传输来帮助它理解它没有被破坏?

谢谢!对不起,如果问题很愚蠢..

【问题讨论】:

  • 你需要它来完成一些编程任务吗?否则它更适合 serverfault.com
  • m..和c++有关,具体来说是boost::asio

标签: networking tcp disconnect


【解决方案1】:

没有数据通过网络发送来维持 TCP 连接。您可以简单地通过从任一对等方发送()一个零字节数据包来发送网络层保持活动状态,或者启用套接字选项以让操作系统定期为您发送它们。在我看来,应用程序层保持活动(您的应用程序协议对其进行管理)提供比传输层机制更好的设计/可靠性。

在设计基于 TCP 的应用协议以实现最大可靠性时,通常需要在协议设计中加入某种非操作 (NOOP)、ping 和心跳。

这非常重要,因为例如,如果您的服务器正在侦听来自客户端的请求,并且在建立连接后客户端关闭,则 TCP 会话本质上是孤立的,并且您的服务器最终可能会永远侦听。如果没有发送或接收数据,则无法检测到连接中断!

如果服务器至少定期发送 noop/ping/heartbeats,则传出请求将触发 TCP 层重新传输/超时机制,然后服务器将能够检测到死连接。相反,如果您的应用程序发送应用程序层“ping”或“嗨,你好吗?”消息,您可以更进一步并使用它来查询对等方的状态,而不仅仅是底层连接。

例如,如果对等点陷入无限循环或其磁盘驱动器着火,仅 TCP keepalive 无法帮助您理解和应对潜在问题。

【讨论】:

    【解决方案2】:

    TCP 连接将保持打开状态,直到两端都关闭它。

    请注意,防火墙,尤其是 NAT 网关经常会超时其 TCP 连接条目,这意味着如果您的连接通过一个,如果网关已删除该 TCP 连接的映射,则发送数据可能会出错。只有从 TCP 连接读取网关超时才会被检测到,除非您的应用程序协议中有某种心跳或启用 tcp keepalive。

    【讨论】:

    • 我想这清楚地回答了我的问题:) 谢谢。据我了解,当防火墙关闭连接时,我会在尝试发送数据时收到套接字错误?
    • 是的,您会遇到某种错误。它可能需要一段时间。已经对 NAT 和防火墙的行为进行了一些研究,得出的结论是,每 30 秒一个数据包将使您的映射对基本上所有工作的连接保持打开状态。
    【解决方案3】:

    连接通常使用keepalives 保持打开状态。

    【讨论】:

    • 连接将始终保持打开状态。给定标准 TCP 协议,保持活动不会阻止连接关闭。
    • 易卜拉欣,感谢您的链接!所以,连接会在一段时间后关闭,对吧? (因为默认情况下保持活动机制是关闭的)
    • 据我所知没有。只是TCP实现可以选择实现keepalive机制。你不能指望它在那里。
    【解决方案4】:

    不,不会的。如果您需要任何一方断开没有数据传输,您需要自己实现它,使用某种“保持活动”机制。

    【讨论】:

    • 抱歉,我不明白.. keep-alives 会帮助我保持连接打开,反之亦然?谢谢你的回答。
    猜你喜欢
    • 1970-01-01
    • 2013-06-23
    • 2014-09-06
    • 1970-01-01
    • 2011-05-20
    • 2013-02-10
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    相关资源
    最近更新 更多