2011-05-01 44 views
5

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

+0

什么是“计算ping”应该是什么意思? – 2011-05-01 18:31:41

+0

计算连接的延迟时间。 – Alexander 2011-05-01 18:46:15

回答

5

要计算你真的应该完成往返的延迟。你应该有一个有时间戳的ping消息。当一方或另一方接收到ping时,应将其更改为pong(或gnip或其他),但保留原始时间戳并将其发送回发件人。然后,原始发件人可以将时间戳与当前时间进行比较,以查看往返延迟是多少。如果你需要将单向延迟除以2.这样做的理由是,如果没有一些非常复杂的时间偏移算法,一台主机相对于另一台主机的时间在这样的小时间偏差下是不可比的。

-3

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

这会给你发送数据包和接收数据包加上任何处理时间的时间差。

+0

有没有任何有效的方法来做到这一点,所以它会自动更新? – Alexander 2011-05-01 19:08:13

+0

@亚历山大连续轮询或附加时间戳到每个网络套接字请求。除了信息,你需要延迟吗?它只能用于日志记录,不能改变你的应用程序的工作方式 – Raynos 2011-05-01 19:10:47

+0

这只是为了记录日志,看看连接的客户端的延迟和显示在页面本身之间的差异。 – Alexander 2011-05-01 19:19:39

1

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

5

有几种方法。 Raynos提供的是错误的。由于客户端时间和服务器时间不同,并且您无法比较它们。

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

更好的方法是将数据包发送到具有唯一ID的客户端,即不是增量编号,而是随机化的。然后服务器会用这个ID从客户端预期“PONG”消息。 ID的大小应该相同,我推荐32位(int)。 这样服务器发送带有唯一ID的“PING”并存储发送时刻消息的时间戳,然后等待,直到它将从客户端接收到具有相同ID的响应“PONG”,并且将基于存储的时间戳计算往返延迟并且在收到PONG消息的那一刻。 不要忘记执行超时的情况下,以防止丢失的PING/PONG包停止检查延迟的过程。

以及WebSockets有特殊的数据包操作码称为PING,但来自上面的帖子的例子是不使用此功能。阅读这个描述这个特定操作码的官方文档,如果你在服务器端实现你自己的WebSocket协议可能会有所帮助:http://tools.ietf.org/html/rfc6455#page-37

+0

为什么downvote,对此有何评论? – moka 2012-04-20 11:47:25