Node.js 计算WebSocket连接的Ping?

Node.js 计算WebSocket连接的Ping?,node.js,connection,websocket,ping,Node.js,Connection,Websocket,Ping,小问题。如何计算WebSocket连接的ping? 服务器是使用Node.js和Node websocket server设置的,如果这很重要的话。您可以通过web套接字发送一个请求,将Date.now()作为数据,并将其与服务器上的Date.now()进行比较 这将为您提供发送数据包和接收数据包之间的时间差,以及两端的任何处理时间。要计算延迟,您确实应该完成往返。您应该有一个带有时间戳的ping消息。当一方或另一方收到乒乓球时,应将其更改为乒乓球(或gnip或其他任何形式),但保留原始时间戳并

小问题。如何计算WebSocket连接的ping?
服务器是使用Node.js和Node websocket server设置的,如果这很重要的话。

您可以通过web套接字发送一个请求,将
Date.now()
作为数据,并将其与服务器上的
Date.now()
进行比较


这将为您提供发送数据包和接收数据包之间的时间差,以及两端的任何处理时间。

要计算延迟,您确实应该完成往返。您应该有一个带有时间戳的ping消息。当一方或另一方收到乒乓球时,应将其更改为乒乓球(或gnip或其他任何形式),但保留原始时间戳并将其发送回发送方。然后,原始发送方可以将时间戳与当前时间进行比较,以查看往返延迟是多少。如果需要单向延迟除以2。需要这样做的原因是,如果没有一些非常复杂的时间偏移算法,在这样的小时间差中,一台主机上的时间与另一台主机上的时间是不可比较的。

WebSocket有一个ping类型的消息,服务器可以用pong类型的消息响应。有关WebSocket的更多信息,请参阅。

方法不多。雷诺斯提供的一个是错误的。因为客户端时间和服务器时间不同,您无法对它们进行比较

带有发送时间戳的解决方案很好,但有一个问题。若服务器逻辑基于ping进行一些决策和计算,那个么发送时间戳会给客户机软件或MITM带来修改时间戳的风险,这样它会向服务器提供另一个结果

更好的方法是,使用唯一的ID将数据包发送到客户机,该ID不是递增数,而是随机的。然后服务器将从客户端收到带有此ID的“PONG”消息。 ID的大小应该相同,我建议使用32位(int)。 这样,服务器发送具有唯一ID的“PING”,并存储发送消息时的时间戳,然后等待直到从客户端接收到具有相同ID的响应“PONG”,并根据存储的时间戳和接收PONG消息时的新时间戳计算往返延迟。 别忘了用timeout实现case,以防止丢失的PING/PONG数据包停止检查延迟的过程


WebSockets也有一个特殊的包操作码,称为PING,但上面文章中的例子并没有使用这个特性。阅读描述此特定操作码的官方文档,如果您在服务器端实现自己的WebSockets协议,可能会有所帮助:

什么是“计算ping”这意味着?计算连接的延迟。有没有有效的方法使连接自动更新?@Alexander连续轮询或为每个web套接字请求附加时间戳。除了信息,您还需要延迟吗?它应该只用于记录,而不是更改应用程序的工作方式。它只是用于记录,查看连接的客户端之间的延迟变化,并显示在页面上。您无法比较通信另一端的日期。必须根据消息的来源对其进行比较。服务器和客户端可能不具有相同的时间。