从浏览器发送Websocket ping / pong框架


130

我一直在阅读有关Websocket中的ping / pong消息的信息,以使连接保持活动状态,但是我不确定它们是什么。它是独特的帧类型吗?(我看不到Chrome中与乒乓球有关的javascript WebSocket对象上的任何方法)。还是仅仅是一种设计模式(例如,我从字面上发送“ ping”或任何其他字符串到服务器并让它响应)。乒乓球是否与连续帧有关?

我问的原因是我正在使用在Mongrel2后面运行的python框架,所以我想知道是否有一种方法可以向Mongrel2发送特定的ping / pong消息,该消息会告诉它使连接保持活动状态而无需我的python应用程序担心它。我猜想就像有一个单独的HTTP方法。而且我想象一个专用的ping / pong消息帧可能比字符串“ ping”更简单(服务器和网络上的负载更少),尽管那可能并不重要。

编辑:我只是看了RFC 6455,看起来Ping和Pong绝对是带有自己的操作码的控制帧类型。那么,如何从Chrome中的javascript发送Ping框架?


只需从服务器ping。每个人都知道非标准端口上的网络问题,因此它们开始定期定期进行ping操作。我猜您可以ping一个写得不好的服务器,但是对它们执行任何敏感的操作可能并不聪明。


首先从服务器@ user1382306 ping将使用移动设备的电池使用非常快。从客户端ping可节省设备电池电量。
青铜人

@ user1382306并非所有人!非标准端口上的网络问题是什么?
HappyDog

Answers:


121

没有Javascript API发送ping帧或接收pong帧。您的浏览器是否支持此功能。也没有用于启用,配置或检测浏览器是否支持并正在使用ping / pong框架的API。有关于创建一个Javascript平/乒乓API讨论这一点。将来可能会配置/检测到ping,但是Javascript不太可能直接发送和接收ping / pong帧。

但是,如果您同时控制客户端和服务器代码,则可以轻松地在更高级别添加ping / pong支持。如果您还没有的话,您将需要某种消息类型的标头/元数据,但这很简单。除非您打算每秒发送ping数百次或有数千个并发客户端,否则您自己要做的开销将非常小。


1
@bigmugcup链接死
乔先生

19

Ping只能从服务器发送到客户端,浏览器应尽快使用Pong OpCode进行自动应答。因此,您不必担心更高的级别。

尽管并非所有浏览器都支持它们所期望的标准,但是它们在实现这种机制上可能会有一些差异,甚至可能意味着没有Pong响应功能。但是我个人使用的是Ping / Pong,却从未见过没有在底层客户端实现中未实现这种OpCode和自动响应的客户端。


73
您在哪里读到ping仅从服务器到客户端?RFC说:“端点可以在建立连接之后且关闭连接之前的任何时间发送Ping帧。”
xryl669

7
如果希望客户端自动检测到断开连接状态(未收到RST / FIN数据包,但网络已断开连接),则还需要让客户端启动ping数据包。
pschwamb

13
当未收到RST / FIN数据包时,TCP不会通知断开连接。当发件人尝试发送断开的连接时,TCP仅检测断开的连接。Ping在许多应用程序中用作心跳,这是有效的用法。断开的连接将一直保持永久断开状态,直到客户端尝试发送。因此,对于浏览器上的WebSocket,必须使用自定义ping(或心跳)消息来检测客户端上的客户端断开连接。服务器可能正在尝试ping,并检测到客户端断开连接,但是未通知客户端。客户ping也可以。
DDS

15
在RFC 6455 WebSocket协议中,它明确指出:“注意:Ping帧既可以用作保持活动状态,也可以用作验证远程端点仍在响应的手段。”
DDS

4
当频繁刷新用户代理时,建议仅使用服务器的ping是一种做法。但是现在许多网站被设计为SPA。在这种环境下,对于客户端应用程序定期ping服务器以确保连接不会丢失非常重要。
诺埃尔·亚伯拉罕斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.