计算WebSocket连接的Ping?

小问题。 我怎样才能计算一个WebSocket连接的ping? 服务器是使用Node.js和node-websocket-server来设置的,如果这一点很重要的话。

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

有几种方法。 一个由雷诺斯提供的 – 是错误的。 因为客户端时间和服务器时间是不同的,你不能比较它们。

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

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

WebSockets还有一个叫做PING的特殊包操作码,但是上面的post中的例子并没有使用这个特性。 阅读这个描述这个特定操作码的官方文档,如果你在服务器端实现你自己的WebSocket协议可能会有所帮助: http : //tools.ietf.org/html/rfc6455#page-37

Websockets有一个pingtypes的消息,服务器可以用pongtypes的消息来响应。 看到这个更多关于websockets的信息。

你可以使用Date.now()作为数据通过Web套接字发送请求,并将其与服务器上的Date.now()进行比较。

这给你发送数据包和接收它之间的时间差,加上任何一端的处理时间。