9. Extensions
The WebSocket Protocol provides an extension mechanism that allows adding additional functionality.
9.1 Negotiating Extensions
Extensions are negotiated through the Sec-WebSocket-Extensions header during the handshake.
Client Requests Extension
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
Server Response
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Extensions: permessage-deflate
Extension Format
extension = extension-token *( ";" extension-param )
extension-param = token [ "=" (token | quoted-string) ]
9.2 Known Extensions
permessage-deflate (RFC 7692)
The most commonly used extension, providing message compression functionality.
Advantages:
- Reduces bandwidth usage
- Suitable for text data
Disadvantages:
- Increases CPU overhead
- May increase latency
Usage Example (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
}
});
Other Extensions
- permessage-bzip2: Bzip2 compression
- multiplexing: Multiplexing (draft)
- Custom extensions
Extension Development
When developing custom extensions:
- Define extension name
- Define parameters
- Specify how to modify frame structure
- Implement handshake negotiation
- Register extension
Reference Links
- Previous Chapter: 8. Error Handling
- Next Chapter: 10. Security Considerations
- RFC 7692: WebSocket Compression Extensions