9. Extensions (扩展)
WebSocket协议提供了扩展机制,允许添加额外功能。
9.1 Negotiating Extensions (协商扩展)
扩展通过握手时的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 Known Extensions (已知扩展)
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 // 只压缩大于1KB的消息
}
});
其他扩展
- permessage-bzip2: Bzip2压缩
- multiplexing: 多路复用(草案)
- 自定义扩展
扩展开发
开发自定义扩展时:
- 定义扩展名称
- 定义参数
- 指定如何修改帧结构
- 实现握手协商
- 注册扩展
参考链接
- 上一章: 8. Error Handling
- 下一章: 10. Security Considerations
- RFC 7692: WebSocket压缩扩展