1. WebSocket 二进制帧 vs 文本帧在协议设计的工程取舍
WebSocket 的二进制帧与文本帧在协议设计上有何工程取舍?
- 文本帧(UTF-8)与二进制帧的语义差异
- 编码开销与数据效率
- 按数据形态选帧类型
WebSocket 帧的 opcode 区分文本帧(0x1,载荷按 UTF-8 解码)与二进制帧(0x2,原始字节):文本帧自带"这是文本"的语义且浏览器会做 UTF-8 合法性校验(非法序列触发错误),二进制帧零解释、按字节透传。工程取舍:第一,数据形态——JSON/XML 类协议用文本帧可读性好、调试直观(DevTools 直接展示),但要承受 JSON.stringify/parse 与 UTF-8 编码开销(大消息下明显);二进制帧适合协议化数据(protobuf、MessagePack、二进制布局的坐标/像素/音频流),体积小、解析快,且与 TypedArray 直接互操作;第二,性能——高频消息(游戏状态、行情 tick)应走二进制(如 MessagePack/自定义紧凑编码),省序列化与带宽;低频业务消息文本即可;第三,协议设计——混用两种帧是常见模式(控制消息文本、数据消息二进制),客户端按 opcode 分流;注意二进制帧与文本帧在同一连接上可共存,按消息类型切换,无需重连。工程建议:先定义消息类型表(文本控制 + 二进制数据),用 schema 约束二进制布局,配套编解码库(protobufjs、@msgpack/msgpack)与版本字段。
考察对 WebSocket 帧语义的工程把握:帧类型决定校验与开销,取舍依据是数据形态与频率,回答需落到"文本控流 + 二进制数据"的协议设计建议。