跳到主要内容

9. 扩展

WebSocket 协议提供了扩展 (extension) 机制, 用于添加额外功能.

9.1 协商扩展

扩展在握手期间通过 Sec-WebSocket-Extensions 头部协商.

客户端请求扩展

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

服务器响应

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Extensions: permessage-deflate

扩展格式

extension = extension-token *( ";" extension-param )
extension-param = token [ "=" (token | quoted-string) ]

9.2 已知扩展

permessage-deflate (RFC 7692)

这是最常用的扩展, 提供消息压缩功能.

优点:

  • 降低带宽使用量
  • 适用于文本数据

缺点:

  • 增加 CPU 开销
  • 可能增加延迟

使用示例 (Node.js):

const WebSocket = require('ws');

const wss = new WebSocket.Server({
port: 8080,
perMessageDeflate: {
zlibDeflateOptions: {
chunkSize: 1024,
memLevel: 7,
level: 3
},
zlibInflateOptions: {
chunkSize: 10 * 1024
},
clientNoContextTakeover: true,
serverNoContextTakeover: true,
serverMaxWindowBits: 10,
concurrencyLimit: 10,
threshold: 1024 // Only compress messages larger than 1KB
}
});

其他扩展

  • permessage-bzip2: Bzip2 压缩
  • multiplexing: 多路复用 (草案)
  • 自定义扩展

扩展开发

开发自定义扩展时:

  1. 定义扩展名称
  2. 定义参数
  3. 指明如何修改帧结构
  4. 实现握手协商
  5. 注册扩展

参考链接