Networking 在低级别,Websocket协议如何检测连接的状态?

Networking 在低级别,Websocket协议如何检测连接的状态?,networking,tcp,websocket,network-protocols,Networking,Tcp,Websocket,Network Protocols,我和一位工程师同事讨论了Websocket开销,我们都不确定Websocket如何实际检测客户端连接的状态 是否定期向客户机/服务器发送“状态”数据包 它是否与低级API有关 那怎么办 Websocket如何检测到它在客户端上已断开连接?服务器 我很惊讶我没有找到答案,但这可能是我的错误。我发现了地址的可伸缩性,但这不是我要问的。涉及实现,但不是我在这里所追求的深度。webSocket连接是使用webSocket协议的TCP连接。默认情况下,只有当底层TCP意识到连接已关闭,并且webSocke

我和一位工程师同事讨论了Websocket开销,我们都不确定Websocket如何实际检测客户端连接的状态

  • 是否定期向客户机/服务器发送“状态”数据包
  • 它是否与低级API有关
  • 那怎么办
  • Websocket如何检测到它在客户端上已断开连接?服务器

  • 我很惊讶我没有找到答案,但这可能是我的错误。我发现了地址的可伸缩性,但这不是我要问的。涉及实现,但不是我在这里所追求的深度。

    webSocket连接是使用webSocket协议的TCP连接。默认情况下,只有当底层TCP意识到连接已关闭,并且webSocket层正在侦听连接上的关闭事件时,服务器或客户端才知道连接何时消失,从而以这种方式通知它

    webSocket协议本身并不需要能够定期测试连接是否仍在工作的心跳数据包。TCP套接字可能看起来仍然处于活动状态,但连接可能实际上无法工作。另一端可能已经消失或在两者之间被中断,并且一个或两个端点可能在任何给定时间都不知道这一点

    Socket.io构建在webSocket之上,它使用乒乓数据包来实现心跳,心跳会定期测试连接,事实上,它会在客户端检测到不正常的连接,关闭套接字,然后自动重新连接

    是否定期向客户机/服务器发送“状态”数据包

    对于常规webSocket连接,默认情况下不是这样

    它是否与低级API中的乒乓球或乒乓球有关

    如果客户机或服务器想要自己发送ping或pong数据包来实现某种连接验证检测,这取决于它们

    相框呢

    webSocket帧是通过webSocket发送数据的数据格式。他们与这个问题无关

    Websocket如何检测到它在客户端上已断开连接?服务器

    如上所述。除非客户机/服务器实现自己的ping/pong系统来检测连接何时出错,否则它们只依赖TCP信令来知道另一端何时关闭了连接。在客户端或服务器尝试发送之前,webSocket连接可能在客户端或服务器不知道的情况下无法正常工作


    当浏览器窗口/选项卡打开webSocket连接,然后该窗口/选项卡重定目标为新URL时,浏览器将关闭与该窗口/选项卡关联的所有资源,包括所有webSocket连接。如果此时客户端和服务器之间的链接正常,则服务器将被告知底层TCP连接(因此webSocket)已关闭。如果网络链接断开,然后用户将该窗口/选项卡移动到一个新的URL,服务器不一定知道连接不起作用,而不依赖乒乓类型的信令来定期测试连接

    如果浏览器崩溃,操作系统应关闭该进程打开的所有套接字


    如果计算机/操作系统崩溃,套接字可能无法正常关闭(尽管这可能与操作系统有关,也可能与崩溃有关)。

    Websocket使用TCP,它在对等主机之间建立和维护连接。无ping。它检测连接故障的方式与任何TCP应用程序相同。从技术上讲,TCP是如何检测连接故障的,因为它与websocket相关。这是一个很好的信息。我正在寻找有关断开连接或断开连接(半开放连接?)的TCP连接协议的详细信息,因为它们与Websockets源中的低级实现有关。RFC或源链接将有助于我更深入的调查。感谢您迄今为止所提供的一切,@jfriend00@toszter-谷歌有很多东西可以找到。这里有一些:和。此外,如果这是有用的信息,您是否愿意至少对我的答案进行投票?@toszter-TCP本身不会知道连接已断开,除非它从另一端接收到关闭的数据包,或者它尝试发送数据并收到错误,并且所有重试尝试都失败。需要某种保持活动状态的数据包和响应来可靠地检测已断开的连接。这就是socket.io实现这种特性的原因。