2017-08-15 116 views
1

我正在和一位同事讨论Websocket开销,我们都不确定Websocket是如何检测客户端连接的状态的。在低级别,Websocket协议如何检测连接的状态?

  1. 是否有定期发送到客户端/服务器的“状态”数据包?
  2. 与低层API中的pingpong有什么关系?
  3. frames怎么样?
  4. Websocket如何检测到它在客户端断开连接?服务器?

我很惊讶,我找不到这个SO回答,但可能是我的错误。我发现this answer解决了可扩展性问题,但这不是我在这里问的。 This answer涉及实施,但不是我在这里追求的深度。

+0

Websocket使用TCP,它建立和维护对等主机之间的连接。 –

+0

没有ping。它以与任何TCP应用程序相同的方式检测连接失败。 – EJP

+0

从技术上讲,TCP如何与WebSocket相关? – toszter

回答

2

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

webSocket协议本身不需要心跳包,它可以定期测试连接是否仍在工作。 TCP套接字可能仍然是活着的,但连接可能实际上不起作用。另一端可能已经消失或者在两者之间中断,并且一个或两个端点可能在任何给定时间都不知道。

构建在webSocket之上的Socket.io使用ping和pong数据包实现定期测试连接的心跳,事实上,它将检测客户端的非功能连接,关闭套接字并然后自动重新连接。

是否有定期发送到客户端/服务器的“状态”数据包?

默认情况下不是常规webSocket连接。

与低级API中的ping或pong有什么关系?

如果他们想发送ping或pong包来实现某种连接验证检测,则由客户端或服务器决定。

怎么样?

webSocket帧是通过webSocket发送数据的数据格式。他们与这个问题没有任何关系。

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

如上所述。除非客户端/服务器使用他们自己的ping/pong系统来检测连接何时发生错误,否则他们仅仅依靠TCP信令来知道连接何时被另一端关闭。如果没有客户端或服务器知道它,直到他们尝试发送,则webSocket连接可能不起作用。


当一个浏览器窗口/选项卡中打开的窗口/标签被重新定向到一个新的URL WebSocket连接,然后,浏览器将关闭与该窗口/标签包括任何WebSocket连接相关的所有资源。如果客户端和服务器之间的链接在此时起作用,那么服务器将被告知底层的TCP连接(因此webSocket)已关闭。如果网络链路断开,然后用户将该窗口/标签移动到新的URL,则服务器不必知道该连接是不起作用的,而不依赖ping/pong类型信令来定期测试连接。

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

如果计算机/操作系统崩溃,套接字可能不会正常关闭(尽管这可能有些取决于操作系统,也可能与系统崩溃有关)。

+0

这是很好的信息。我正在寻找有关TCP连接协议的详细信息,用于断开连接或断开连接(半开连接?),因为它们与Websockets源中的低级实现有关。 RFC或源代码链接将有助于我深入调查。感谢您迄今为止提供的内容,@ jfriend00! – toszter

+0

@toszter - 谷歌有很多东西可以找到。这里有一些:[当我删除以太网电缆时TCP连接会发生什么](https://superuser.com/questions/911808/what-happens-to-tcp-connections-when-i-remove-the-ethernet-电缆/ 911829)和[检测半开放(丢弃)连接](https://blog.stephencleary.com/2009/05/detection-of-half-open-dropped.html)和[TCP如何终止机器死亡](https://stackoverflow.com/questions/9449209/how-does-tcp-connection-terminate-if-one-of-the-machine-dies)。另外,如果这是有用的信息,你是否至少喜欢我的答案? – jfriend00

+2

@toszter - TCP本身不会知道连接已经死亡,直到它从另一端收到一个关闭数据包,或者直到它尝试发送数据并且出现错误并且所有重试尝试失败。需要某种保持活动的数据包和响应来可靠地检测已经死亡的连接。这就是为什么socket.io实现这样一个功能。 – jfriend00