Page 271 - Web性能权威指南
P. 271
这个扩展通过封装帧并加上信道 ID,可以让一个 TCP 连接支持多个虚
拟 WebSocket 连接……这个多路复用扩展维护独立的逻辑信道,每个逻
辑信道与独立的 WebSocket 连接没有差别,包括独立的握手首部。
——WebSocket Multiplexing(Draft 10)
有了这个扩展后,多个 WebSocket 连接(信道)就可能在同一个 TCP 连接上得到
复用。可是,每个信道依旧容易产生队首阻塞问题!可能的解决方案是使用不同
的信道,或者专用 TCP 连接,多路并行发送消息。
最后,注意前面的扩展仅对 HTTP 1.x 连接是必要的。虽然通过 HTTP 2.0 传输
WebSocket 帧的官方规范尚未发布,但相对来说就容易多了。因为 HTTP 2.0 内
置了流的多路复用,只要通过 HTTP 2.0 的分帧机制来封装 WebSocket 帧,多个
WebSocket 连接就可以在一个会话中传输。
17.2.2 协议扩展
WebSocket 规范允许对协议进行扩展:数据格式和 WebSocket 协议的语义可以通过
新的操作码和数据字段扩展。虽然有些不同寻常,但这却是一个非常强大的特性,
因为它允许客户端和服务器在基本的 WebSocket 分帧层之上实现更多功能,又不需
要应用代码介入或协作。
WebSocket 协议扩展有哪些例子?负责制定 WebSocket 规范的 HyBi Working Group
就进行了两项扩展。
• 多路复用扩展(A Multiplexing Extension for WebSockets)
这个扩展可以将 WebSocket 的逻辑连接独立出来,实现共享底层的 TCP 连接。
• 压缩扩展(Compression Extensions for WebSocket)
给 WebSocket 协议增加了压缩功能。
如前所述,每个 WebSocket 连接都需要一个专门的 TCP 连接,这样效率很低。多
路复用扩展解决了这个问题。它使用“信道 ID”扩展每个 WebSocket 帧,从而实现
多个虚拟的 WebSocket 信道共享一个 TCP 连接。
类似地,基本的 WebSocket 规范没有压缩数据的机制或建议,每个帧中的净荷就是
应用提供的净荷。虽然这对优化的二进制数据结构不是问题,但除非应用实现自己
的压缩和解压缩逻辑,否则很多情况下都会造成传输载荷过大的问题。实际上,压
缩扩展就相当于 HTTP 的传输编码协商。
要使用扩展,客户端必须在第一次的 Upgrade 握手中通知服务器,服务器必须选择
260 | 第 17 章