由于我更经常使用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,可能发送大量数据的需求不存在,您应该在发送之前逻辑地自己拆分任何数据。