Websocket - 客户端应该发送 ping 帧吗?

Websocket - Should client send ping frames?

正如标题所暗示的,Ping 帧应该只从服务器发送还是让两个端点都发送它们更好?如 Websocket RFC 中所述:

NOTE: A Ping frame may serve either as a keepalive...

因此,通过让一个端点发送 ping 请求,它应该保持连接打开,对吗?

上一行的第二部分是这样的:

or as a means to verify that the remote endpoint is still responsive.

我是 websockets 概念的新手,但如果从服务器关闭连接,客户端不会收到通知吗?

考虑服务器刚刚消失的情况,也许它崩溃了。谁或什么会通知客户这件事?或者说靠近服务器的网络 link 已经关闭了很长时间,以至于当它恢复时,服务器已经完全忘记了这个客户端。谁或什么会告诉客户?

三种可能:

  1. 客户端不需要检测连接丢失。在这种情况下,您无需执行任何特殊操作。

  2. 客户端已经有一些方法可以检测到连接丢失。例如,如果连接空闲一段时间,客户端可以发送应用程序级查询,如果没有响应或查询失败则超时。

  3. 客户端需要检测连接丢失但没有现成的方法来执行此操作。在这种情况下,使用 ping 是有意义的。

在典型的 query/response 协议中,客户端通常不需要 ping 服务器,因为它可以发送一些具有相同效果的查询。除非 websocket 之上的协议层支持服务器查询客户端的某种方式,否则服务器通常只有两个选择:使用 ping 检测丢失的连接或断开空闲客户端。

两种变体都有实现方式。例如,如果服务器向客户端发送 ping,则客户端可以通过具有截止时间计时器的循环获取服务器断开连接的信息,每次收到 ping 时该计时器都会重置。如果计时器到达dealine,则表示服务器已断开连接。