1009 communication protocol_error ai_generated true

WebSocket close frame received with status code 1009 (message too large)

ID: communication/websocket-close-frame-1009-message-too-large

Also available as: JSON · Markdown · 中文
82%Fix Rate
88%Confidence
1Evidence
2023-11-20First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
ws 8.16.0 active
nginx 1.24.0 active
AWS ALB 2.0 active

Root Cause

The WebSocket message payload exceeds the maximum allowed frame size (default 65535 bytes) on the server or proxy.

generic

中文

WebSocket 消息负载超出服务器或代理允许的最大帧大小(默认 65535 字节)。

Official Documentation

https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent

Workarounds

  1. 90% success Fragment the large message into smaller chunks on the client and reassemble on the server: In JavaScript, split payload into 32KB chunks and send each with a sequence number; on the server (Node.js), buffer chunks until all received.
    Fragment the large message into smaller chunks on the client and reassemble on the server: In JavaScript, split payload into 32KB chunks and send each with a sequence number; on the server (Node.js), buffer chunks until all received.
  2. 85% success Increase the server's max frame size: In nginx, set `proxy_read_timeout 300s;` and `proxy_buffers 8 32k;` but more importantly configure `proxy_http_version 1.1;` and ensure the WebSocket library (e.g., ws in Node.js) sets `maxPayload: 256 * 1024`.
    Increase the server's max frame size: In nginx, set `proxy_read_timeout 300s;` and `proxy_buffers 8 32k;` but more importantly configure `proxy_http_version 1.1;` and ensure the WebSocket library (e.g., ws in Node.js) sets `maxPayload: 256 * 1024`.
  3. 80% success Use a message queue (e.g., Redis Pub/Sub) to offload large payloads and send only references via WebSocket.
    Use a message queue (e.g., Redis Pub/Sub) to offload large payloads and send only references via WebSocket.

中文步骤

  1. Fragment the large message into smaller chunks on the client and reassemble on the server: In JavaScript, split payload into 32KB chunks and send each with a sequence number; on the server (Node.js), buffer chunks until all received.
  2. Increase the server's max frame size: In nginx, set `proxy_read_timeout 300s;` and `proxy_buffers 8 32k;` but more importantly configure `proxy_http_version 1.1;` and ensure the WebSocket library (e.g., ws in Node.js) sets `maxPayload: 256 * 1024`.
  3. Use a message queue (e.g., Redis Pub/Sub) to offload large payloads and send only references via WebSocket.

Dead Ends

Common approaches that don't work:

  1. Increase the WebSocket frame size limit on the client side only 85% fail

    The limit is enforced by the server or intermediate proxy; client changes alone don't override it.

  2. Compress the payload with gzip before sending 75% fail

    WebSocket frames are already binary-safe; compression must be negotiated via extensions (permessage-deflate) at connection setup.

  3. Switch to long-polling with HTTP POST to avoid frame limits 65% fail

    Long-polling introduces latency and doesn't solve the underlying payload size issue; the same data may still hit HTTP body limits.