从Websocket的RFC6455,控制帧可能与分段帧交错。
我不理解它的必要性,因为它使发送和接收部分的设计更加复杂。
目前,控制帧可以是"帧";关闭"Ping";以及";Pong";(其他都保留)。
如果控制帧是"0";关闭";,则接收分段结束是无用的,因此不需要交织(分段方可以只发送"关闭"操作码并停止发送任何更多的分段,因为在"关闭"之后不应该发送任何内容)。
如果控制帧是"0";Ping";或";Pong";,这没有任何意义。分段端正在向客户端发送数据,那么如果客户端处于活动状态(它在发送系统调用中已经有了这些信息),为什么它会要求对其进行ping呢?或者立即回复ping,因为它实际上是在向客户端发送数据?
那么,我们为什么需要这种(交错控制帧的)机制呢?
它用于检测半开放连接:http://blog.stephencleary.com/2009/05/detection-of-half-open-dropped.html
对方可能正在向您发送数据,但无法获取您的数据。因此,能够交错ping和pong,可以检查至少另一端是否能够理解您的消息并回复它们。
这并没有使它变得更加复杂。无论如何,您都必须读取分隔帧,当您找到控制帧时,请采取行动并继续读取更多帧。
http://www.whatwg.org/specs/web-apps/current-work/multipage/network.html#ping-和乒乓帧
.3.4乒乓帧
WebSocket协议规范定义了Ping和Pong帧可用于维持生命、心跳、网络状态探测,延迟检测等等。这些目前尚未公开API中。
用户代理可以根据需要发送ping和未经请求的pong帧,用于例如,在尝试维护本地网络NAT映射时检测失败的连接或向用户显示延迟度量。用户代理不得使用ping或未经请求的pong来帮助服务器;假设服务器将在适当的时候请求pong服务器的需求。