WebSocket无统一最大传输长度,实际受限于协议层(RFC 6455仅强制支持128MB)、服务端框架(如Netty默认10MB、Tomcat默认8KB)、反向代理(nginx默认4KB缓冲、Cloudflare免费版限10MB)及浏览器实现(Chrome/Firefox虽支持≥100MB但受内存与API限制),任一层超限均会导致连接关闭或异常。
WebSocket 没有统一的“最大传输长度”,实际能发多大,取决于协议层、服务端框架、反向代理、浏览器实现这四层叠加限制,且任意一层卡住都会导致连接关闭或等错误。
WebSocket 协议本身只规定了编码能力,不保证可用性
RFC 6455 允许用 64 位字段表示 payload 长度,理论支持到 2⁶⁴−1 字节(≈1.8 × 10¹⁹ B),但协议明确声明:
实现只需保证至少支持 128 MB
,更高值不强制互操作。这意味着:
客户端和服务端各自宣称支持 1GB,并不代表它们能互相收发 1GB 消息
超长帧没有标准恢复机制;一旦失败,连接大概率被单方面关闭
分片(fragmentation)是协议原生支持的,但需由应用层显式控制(如发送
),浏览器 API 不暴露分片控制权
常见服务端框架的默认帧/消息长度限制
不同框架对
或
的默认值差异极大,且底层依赖可能覆盖上层配置:
:默认
的
是
(10 MB),不改就抛
:
可设到 64 MB,但若底层 Reactor Netty 未同步调大
,仍会截断
(Node.js):默认
(100 MB),但在高并发下易触发
(V8 堆碎片所致)
:需在
中配
和
,默认仅 8 KB
nginx、Cloudflare 等反向代理是隐形瓶颈
即便服务端和浏览器都放开限制,流量经过代理时仍会被二次拦截:
用Apache Spark进行大数据处理
本文档主要讲述的是用Apache Spark进行大数据处理——第一部分:入门介绍;Apache Spark是一个围绕速度、易用性和复杂分析构建的大数据处理框架。最初在2009年由加州大学伯克利分校的AMPLab开发,并于2010年成为Apache的开源项目之一。 在这个Apache Spark文章系列的第一部分中,我们将了解到什么是Spark,它与典型的MapReduce解决方案的比较以及它如何为大数据处理提供了一套完整的工具。希望本文档会给有需要的朋友带来帮助;感
下载
:
(默认 4 KB)、
(默认 8×4 KB)、
(影响 upgrade 请求头解析)三者共同决定 WebSocket 帧能否完整缓冲
:免费版硬性限制 WebSocket 单消息 ≤ 10 MB,且连接空闲超 100 秒即断;企业版可调,但需显式开启
功能开关
所有 TLS 终止点(如 ALB、CDN)若未启用 WebSocket 支持,会在 upgrade 阶段直接返回 400 或 426,根本进不到帧传输阶段
浏览器端限制虽宽松,但不可忽视
Chrome、Firefox 当前实际支持单帧 ≥ 100 MB,但存在隐性约束:
内存压力:发送 200 MB 的
或
会触发 V8 内存回收抖动,可能导致页面卡顿甚至崩溃
无流式写入 API:浏览器
是全量拷贝,无法像
那样分块推送
没有发送进度回调:无法感知大包是否真正发出,只能靠服务端回执确认
移动端 Safari 对 >64 MB 的二进制帧偶发静默丢弃(尤其 iOS 17+ WebKit 行为变更)
真正要传
大数据
,别指望一帧塞满——得在应用层做分块 + 序号 + 校验,再配合服务端按序组装。否则哪怕所有配置都调到了极限,也会在某次部署、某个 CDN 版本、某台 iOS 设备上突然失效。
TooLongFrameExceptionContinuationWebSocketFramemaxFramePayloadLengthmaxMessageSizeNettyWebSocketServerProtocolHandlermaxFramePayloadLength10 * 1024 * 1024TooLongFrameExceptionSpring WebFluxWebSocketSession.setMaxMessageSize(64 * 1024 * 1024)maxFramePayloadLengthwsmaxPayload: 100 * 1024 * 1024RangeError: invalid websocket frame lengthTomcatweb.xmlorg.apache.tomcat.websocket.textBufferSizeorg.apache.tomcat.websocket.binaryBufferSizenginxproxy_buffer_sizeproxy_buffersclient_max_body_sizeCloudflareWebSocketsBlobArrayBufferWebSocket.send()fetch().body.pipeTo()