Skip to content

WebSocket Compression — Complete Guide to Reducing Bandwidth

DodaTech Updated 2026-06-28 4 min read

In this tutorial, you will learn about Websocket Compression. We cover key concepts, practical examples, and best practices to help you master this topic.

WebSocket compression reduces bandwidth usage by compressing message payloads using permessage-deflate extension, decreasing data transfer by 60-80% for text-based protocols like JSON.

What You'll Learn

  • How permessage-deflate compression works
  • Enabling compression on server and client
  • Performance tradeoffs of compression

Why It Matters

WebSocket connections often transmit large JSON payloads repeatedly. Compression reduces bandwidth costs, improves latency for slow connections, and decreases server egress.

Real-World Use

Durga Antivirus Pro threat feed WebSocket sends JSON payloads averaging 4KB. With permessage-deflate compression enabled, payloads shrink to 800 bytes (80% reduction), saving 200GB monthly bandwidth.

flowchart LR
    A["Server Message 4KB"] --> C["Compress (permessage-deflate)"]
    C --> N["Network: 800 bytes"]
    N --> D["Decompress"]
    D --> E["Client: 4KB"]
    style C fill:#dbeafe,stroke:#2563eb

Code Examples

// Server with compression enabled (ws library)
const WebSocket = require('ws');

const server = new WebSocket.Server({
  port: 8080,
  perMessageDeflate: {
    zlibDeflateOptions: {
      chunkSize: 1024,
      memLevel: 7,
      level: 6,         // Compression level 1-9
    },
    zlibInflateOptions: {
      chunkSize: 10 * 1024,
    },
    clientNoContextTakeover: true,   // Better compression per message
    serverNoContextTakeover: true,
    serverMaxWindowBits: 10,
    concurrencyLimit: 10,
    threshold: 1024,    // Only compress messages > 1KB
  },
});

server.on('connection', (ws) => {
  setInterval(() => {
    const payload = JSON.stringify({ type: 'threat_update', data: generateLargePayload() });
    ws.send(payload);
  }, 1000);
});

Expected output: Server negotiates compression with client; large messages are compressed before transmission.

// Client with compression
const WebSocket = require('ws');

const ws = new WebSocket('ws://localhost:8080', {
  perMessageDeflate: true,
});

ws.on('open', () => {
  console.log('Compression negotiated:', ws.protocol);
});

ws.on('message', (data) => {
  // Data is automatically decompressed by the ws library
  const parsed = JSON.parse(data.toString());
  console.log('Received:', parsed.type);
});

Expected output: Client connects with compression enabled; messages are automatically decompressed.

# Python WebSocket server with compression (websockets library)
import asyncio
import json
import websockets

async def handler(websocket):
    async for message in websocket:
        # Message is already decompressed
        data = json.loads(message)
        response = json.dumps({'status': 'ok', 'size': len(data)})
        await websocket.send(response)

async def main():
    async with websockets.serve(
        handler,
        'localhost',
        8765,
        compression='deflate',     # Enable permessage-deflate
        compression_threshold=512, # Compress messages > 512 bytes
    ):
        await asyncio.Future()

asyncio.run(main())

Expected output: Python server enables permessage-deflate compression; messages above threshold are compressed.

Common Mistakes

1. Compressing Small Messages

Messages under 512 bytes may become larger after compression due to overhead. Set a minimum size threshold.

2. High Compression Level

Level 9 compression uses significant CPU. Level 3-6 gives 90% of the benefit at a fraction of the CPU cost.

3. Not Testing Without Compression

Some clients and proxies do not support compression. Fall back gracefully when compression negotiation fails.

4. Ignoring Context Takeover

Without context takeover, every message compresses independently, missing cross-message pattern savings.

5. No Monitoring of Compression Ratio

Without monitoring, you cannot tell if compression is effective. Track bytes before/after compression.

Practice Questions

  1. What is permessage-deflate compression?
  2. Why should small messages not be compressed?
  3. What is the recommended compression level?
  4. What is context takeover in WebSocket compression?
  5. How do you verify compression is working?

Answers:

  1. An extension that compresses WebSocket message payloads using zlib deflate algorithm.
  2. Compression overhead can make tiny messages larger. Set a minimum size threshold (512-1024 bytes).
  3. Level 3-6 balances compression ratio and CPU usage. Level 9 provides marginal gains at high CPU cost.
  4. Context takeover maintains compression state across messages for better ratios; disable for memory-constrained clients.
  5. Compare payload size before and after compression using browser DevTools or server-side logging.

Challenge: Set up a WebSocket server with compression, connect a client, send messages of varying sizes (100 bytes to 100KB), measure compression ratio, CPU usage, and determine the optimal compression level and threshold.

FAQ

Does permessage-deflate work in all browsers?

: Most modern browsers support it. Chrome, Firefox, and Safari include permessage-deflate support.

How much bandwidth can compression save?

: 60-80% for text (JSON), less for binary data (10-30%) depending on compressibility.

Does compression add latency?

: Yes, 1-10ms per message depending on size and compression level. Usually worth the bandwidth savings.

Is compression supported in all WebSocket libraries?

: Most server libraries support it (ws, websockets, nginx). Enable explicitly as it is not always default.

Can compression be used with binary WebSocket messages?

: Yes, but binary data (images, protobuf) may already be compressed. Test before enabling.

Mini Project

Build a WebSocket chat application with permessage-deflate compression enabled. Compare bandwidth usage with and without compression for: text messages, JSON payloads with threat data, and periodic large data syncs. Log compression ratios.

What's Next

Learn about WebSocket rate limiting for controlling message flow, or explore WebSocket authentication for securing connections.

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro