因为我在更常规的基础上使用 WebSocket 连接,所以我对事情如何在幕后工作很感兴趣。因此,我研究了无休止的规范文档一段时间,但到目前为止,我真的找不到任何关于分块传输流本身的信息。
WebSocket 协议称其为数据帧(描述的是纯数据流,因此也称为非控制帧)。据我了解规范,没有定义的最大长度和没有定义的 MTU(最大传输单元)值,这反过来意味着单个 WebSocket 数据帧可能包含,通过规范(!),无限量的数据(如果我在这里错了,请纠正我,我仍然是这方面的学生)。
读完之后,我立即设置了我的小型Node WebSocket 服务器。由于我拥有丰富的Ajax历史(也在流媒体和 Comet 方面),我最初的期望是,“在传输数据时必须有某种交互模式来读取数据”。但我错了,不是吗?
我一开始很小,只有4kb的数据。
服务器
testSocket.emit( 'data', new Array( 4096 ).join( 'X' ) );
就像预期的那样,这作为一个数据块到达客户端
客户
wsInstance.onmessage = function( data ) {
console.log( data.length ); // 4095
};
所以我增加了有效负载,实际上我再次期待,在某些时候,客户端onmessage
处理程序将重复触发,有效地分块传输。但令我震惊的是,它从未发生过(node-server,在firefox、chrome和safari客户端测试)。我最大的有效载荷是80 MB
testSocket.emit( 'data', new Array( 1024*1024*80 ).join( 'X' ) );
它仍然到达客户端的一个大数据块中。当然,即使您的连接非常好,这也需要一段时间。这里的问题是
- 是否有可能将这些流分块,类似于 XHR readyState3 模式?
- 单个 ws 数据框是否有大小限制?
- websockets不应该传输如此大的有效载荷吗?(这让我再次想知道为什么没有定义的最大尺寸)
我可能仍然从错误的角度看待 WebSockets,可能不需要发送大量数据,您应该在发送之前自己逻辑地分块/拆分任何数据?