Working with WebSocket Extensions
1. Understanding WebSocket Extensions
Extensions modify framing behavior (compression, multiplexing) via Sec-WebSocket-Extensions. permessage-deflate (RFC 7692) is the only widely deployed extension.
| Extension | Status |
|---|---|
permessage-deflate | Standard, widely supported |
x-webkit-deflate-frame | Legacy WebKit DEPRECATED |
| Multiplexing | Never standardized |
2. Negotiating Extensions
| Header | Detail |
|---|---|
| Client offer | Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits |
| Server accept | Returns subset with chosen params |
| Multiple offers | Comma-separated; server picks one |
3. Enabling Compression
Example: Browser-default
// Browsers auto-offer permessage-deflate; you cannot configure it client-side.
const ws = new WebSocket("wss://x/");
ws.addEventListener("open", () => console.log(ws.extensions));
| Side | Control |
|---|---|
| Browser | Auto-on (cannot disable) |
Node ws | perMessageDeflate: true/options/false |
| Server | Negotiates; can refuse |
4. Configuring Compression Parameters
| Parameter | Range | Effect |
|---|---|---|
server_max_window_bits | 8-15 | Larger → better ratio, more memory |
client_max_window_bits | 8-15 | Same on client |
server_no_context_takeover | flag | Reset state per message |
level (zlib) | 1-9 | CPU vs ratio |
threshold | bytes | Skip small frames |
5. Checking Active Extensions
Example: Inspect
console.log(ws.extensions);
// e.g. "permessage-deflate; client_max_window_bits=15"
| Property | Type |
|---|---|
ws.extensions | string (header value) |
| Empty | None negotiated |
6. Disabling Extensions
| Reason | Detail |
|---|---|
| Memory pressure | Each connection: zlib state ~256KB |
| Latency-sensitive | Compression adds CPU latency |
| Already-compressed payload | Binary protobuf/msgpack |
7. Understanding Extension Overhead
| Cost | Detail |
|---|---|
| CPU | zlib deflate per message |
| Memory | zlib state per direction per connection |
| Latency | Small messages may worsen |
| Throughput | Higher for repetitive text |
8. Testing Extension Support
| Tool | Detail |
|---|---|
| Autobahn TestSuite | Full RFC 6455 + 7692 compliance |
wscat -H | Manual header tweak |
| DevTools Network | Inspect extension header |
9. Implementing Per-Message Compression
| Option | Detail |
|---|---|
compress: false | Skip compression for this frame |
binary: true | Force binary opcode |
10. Handling Extension Negotiation
| Outcome | Action |
|---|---|
| Server accepts | Use; check ws.extensions |
| Server omits | Continue without |
| Mandatory not granted | Server should close 1010 |