You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS WebSocket服务端处理大消息异常:Firefox帧不符合RFC标准?

WebSocket大消息分片处理异常排查

我用NodeJS开发了一个支持文本和图片发送的简易WebSocket聊天服务端,遇到了一个问题:当Firefox客户端发送的消息payload超过65536字节时,服务端的帧处理逻辑就失效了。

按照WebSocket标准,分片消息的第一帧FIN位应该设为0,opcode需为0000(续帧),同时要包含必要的掩码和初始负载数据。但实际测试时,Firefox会把超过65536字节的消息拆成3帧发送:

  • 第一帧:FIN位设为1(表示这是最后一帧),opcode标识为普通文本或二进制帧(非续帧),掩码位已设置、负载大小指示正确,包含完整消息的实际负载大小、掩码键,但没有负载数据
  • 第2、3帧:为字节数组,总字节数与预期负载长度一致

客户端发送数据的代码如下:

webSocket.send([超过65536字符的字符串])

服务端相关代码及输出:

socket.on('readable', (req, socket, head) => {
    const { data } = socket.read().toJSON()
    console.log(data)
})

输出:

[ 129, 255, 0, 0, 0, 0, 0, 1, 17, 112, 116, 104, 111, 235 ]
[ 2, 28,  0, 142,  4, 14, 28, 133, 30, 13, 14, ... ]
[ 22, 5, 2, 153, 31, 29, 31, 129, 1, 28,  2, ... ]

可以看到,第一帧的首字节二进制为10000001,FIN位已设置且opcode表示为标准文本帧。

我怀疑自己可能误解了WebSocket标准,但不认为标准文档或Firefox存在问题,可就是无法在服务端得到可预测的结果,请问我哪里出错了?


内容的提问来源于stack exchange,提问作者Avvy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 06:27:27