跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

WebSocket最大传输长度是多少 WebSocket大数据包拆分发送【指南】

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

相关文章