小问题。如何计算WebSocket连接的ping ?服务器是使用Node.js和node-websocket-server设置的,如果这很重要的话。
有几种方法。一个是雷诺斯提出的,是错误的。因为客户端时间和服务器时间是不同的,你不能比较它们
发送时间戳的解决方案是好的,但它有一个问题。如果服务器逻辑基于ping做一些决策和计算,那么发送时间戳,就会给客户端软件或MITM修改时间戳的风险,这样它就会给服务器另一个结果。
更好的方法是用唯一的ID发送数据包给客户端,这个ID不是增量数,而是随机的。然后服务器会期待客户端发出"pong"的信号;使用此ID发送消息。ID的大小应该是相同的,我建议32位(int)。这样服务器就会发送"ping";用唯一的ID和存储时间戳发送的瞬间消息,然后等待,直到它收到响应"PONG"从客户端获取相同的ID,并根据存储的时间戳计算往返延迟,在收到PONG消息的时刻计算新的时间戳。不要忘记实现case与timeout,以防止丢失PING/PONG包停止检查延迟的过程。
WebSockets也有特殊的数据包操作码,叫做PING,但是上面的例子并没有使用这个特性。阅读这个描述这个特定操作码的官方文档,如果你在服务器端实现自己的WebSockets协议,它可能会有所帮助:https://www.rfc-editor.org/rfc/rfc6455#page-37要计算延迟,您确实应该完成往返。您应该有一个包含时间戳的ping消息。当一方或另一方接收到ping时,它应该将其更改为pong(或gnip或其他),但保留原始时间戳并将其发送回发送方。然后,原始发送方可以将时间戳与当前时间进行比较,以查看往返延迟是多少。如果需要单向延迟,则除以2。你需要这样做的原因是,如果没有一些非常复杂的时间倾斜算法,一台主机与另一台主机的时间在像这样的小时间delta上是无法比较的。
Websockets有一个ping类型的消息,服务器可以用一个pong类型的消息来响应。
您可以通过web套接字发送请求,将Date.now()
作为数据,并将其与服务器上的Date.now()
进行比较。
这给出了发送数据包和接收数据包之间的时间差以及两端的任何处理时间。