首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

WebSocket 协议(11)

WebSocket 协议(11)

5.5 控制帧控制帧是通过它的 opcode 的最高有效位是 1 去确定的。当前已经定义了的控制帧包括 0x8 (close),0x9 (Ping),0xA (Pong)。操作码 0xB-0xF 是为将来的控制帧保留的,目前尚未定义。
控制帧是为了在 WebSocket 中通信连接状态。控制帧可以夹杂在消息帧之间发送。
所有的控制帧的负载长度都必须是 125 字节,并且不能被碎片化。
关闭帧关闭帧的操作码 opcode 是 0x8。
关闭帧可以包含消息体(通过帧的 “应用数据” 部分)去表示关闭的原因,比如一端正在关闭服务,一端接收到的帧过大,或者一端接收到了不遵循格式的帧。如果有消息体的话,消息体的前两个字节必须是无符号的整型数(采用网络字节序),以此整型数去表示状态码 /code/ 定义在第 7.4 节。在两个字节的无符号整型数之后,可以跟上以 UTF-8 编码的数据表示 /reason/,/reason/ 数据的具体解释方式此文档并没有定义。并且 /reason/ 的内容不一定是人类可读的数据,只要是有利于发起连接的脚本进行调试就可以。因为 /reason/ 并不一定就是人类可读的,所以客户端必须不将此内容展示给最终用户。
客户端发送的每一个帧都必须按照第 5.3 节中的内容进行掩码。
应用程序在发送了关闭帧之后就不可以再发送其他数据帧了。
如果接收到关闭帧的一端之前没有发送过关闭帧的话,那么它必须发送一个关闭帧作为响应。(当发送一个关闭帧作为响应的时候,发送端通常在作为响应的关闭帧中采用和其接收到的关闭帧相同的状态码)。并且响应必须尽快的发送。一端可以延迟关闭帧的发送,比如一个重要的消息已经发送了一半,那么可以在消息的剩余部分发送完之后再发送关闭帧。但是作为首先发送了关闭帧,并在等待另一端进行关闭响应的那一端来说,并不一定保证其会继续处理数据内容。
在发送和接收到了关闭帧之后,一端就可以认为 WebSocket 连接已经关闭,并且必须关闭底层相关的 TCP 连接。如果是服务端首先发送了关闭帧,那么在接收到客户端返回的关闭帧之后,服务端必须立即关闭底层相关的 TCP 连接;但是如果是客户端首先发送了关闭帧,并接收到了服务端返回的关闭帧之后,可以选择其认为合适的时间关闭连接,比如,在一段时间内没有接收到服务端的 TCP 关闭握手。
如果客户端和服务端同时发送了关闭消息,那么它们两端都将会接收到来自对方的关闭消息,那么它们就可以认为 WebSocket 连接已经关闭,并且关闭底层相关的 TCP 连接。
5.5.2 PingPing 帧的操作码是 0x9
Ping 帧也可以有 “应用数据”
一旦接收到了 Ping 帧,接收到的一端必须发送一个 Pong 帧作为响应,除非它已经接收到了关闭帧。响应的一端必须尽快的做出响应。Pong 帧定义在第 5.5.3 节。
一端可以在连接建立之后,到连接关闭之前的任意时间点发送 Ping 帧。
注意:Ping 帧的目的可以是保持连接(keepalive)或者是验证服务端是否还是有响应的。
5.5.3 PongPong 帧的操作码是 0xA
第 5.5.2 节的要求同时适用于 Ping 帧和 Pong 帧。
Pong 帧的 “应用数据” 中的内容必须和其响应的 Ping 帧中的 “应用数据” 的内容相同。
如果一端接收到了 Ping 帧并且在没有来得及响应的时候又接收到了新的 Ping 帧,那么响应端可以选择最近的 Ping 帧作为响应的对象。
Pong 帧可以在未被主动请求的情况下发送给对方。这被认为是单向的心跳包。单向心跳包是得不到响应的。
5.6 数据帧数据帧(比如,非控制帧)是通过操作码的最高有效位是 0 来确定的。当前已经定义的数据帧包括 0x1 (文本),0x2 (二进制)。操作码 0x3-0x7 是为了将来的非控制帧的使用而保留的。
数据帧承载了 “应用层 application-layer” 或者 “扩展层 extension-layer” 的数据。操作码决定了数据的表现形式。
  • 文本 Text
    “有效负载数据 Payload data” 是以 UTF-8 编码的文本。注意,作为整个文本消息的一部分的部分文本帧可能包含了部分的 UTF-8 序列;但是整个的消息的内容必须是一个有效的 UTF-8 序列。对于无效的 UTF-8 消息的处理在第 8.1 节中描述。
  • 二进制 Binary
    “有效负荷数据 Payload data” 是仅由应用层来决定的任意二进制内容。
返回列表