文本帧的操作码(Opcode)为0x1,载荷数据必须是合法的UTF-8编码字符串。接收方有义务验证UTF-8合法性,如果收到无效UTF-8数据,必须关闭连接并返回状态码1007。文本帧非常适合传输JSON、XML或其他基于文本的数据格式。大多数WebSocket API默认以文本帧发送数据,开发者可以直接发送JSON.stringify()后的字符串。
二进制帧的操作码为0x2,载荷数据可以是任意原始字节流,没有编码约束。应用层需要自行定义二进制数据的格式和解析方式。常见的二进制序列化格式包括Protocol Buffers、MessagePack、CBOR等。二进制帧的优势在于无转码开销,带宽利用率高,适合传输文件、图像、音频、视频或高频金融数据。在浏览器中,可以通过设置WebSocket 的binaryType属性("blob"或"arraybuffer")来控制二进制数据的接收方式。
除了数据帧(文本帧和二进制帧)外,WebSocket 协议还定义了多种控制帧:Close帧(0x8)用于发起连接关闭握手;Ping帧(0x9)用于心跳检测,接收方必须回复Pong帧;Pong帧(0xA)是Ping帧的响应,也可单独发送作为单向心跳。此外,还有Continuation帧(0x0)用于消息分片传输,当一条消息太大无法放入单个帧时,可以分片发送,第一个分片帧的FIN位为0且操作码为0x1或0x2,中间分片帧的操作码为0x0,最后一个分片帧的FIN位为1。