websocket是基于流的还是基于包的协议?

时间:2014-01-09 15:20:57

标签: tcp websocket packet

想象一下,我有服务器和客户端通过WebSocket进行通话。每个时间都发送另一个数据块。不同的块可能有不同的长度。

我保证,如果服务器在一次呼叫中发送chunk,那么客户端将在一个message回调中接收它,反之亦然?即,WebSocket是否嵌入了“打包”功能,所以我不必关心我的数据在传输过程中是否在几个回调之间被分割,或者它没有?

2 个答案:

答案 0 :(得分:8)

理论上,WebSocket协议提供了基于消息的协议。但请记住......

  • WebSocket消息由一个或多个帧组成。
  • 框架可以是完整框架或碎片框架。
  • 消息本身没有内置于协议中的任何长度指示,只有帧。
  • 帧的有效载荷长度最多为9,223,372,036,854,775,807字节(由于协议允许使用63位长度指示符)。
  • 碎片化的主要目的是允许在启动消息时发送大小未知的消息,而不必缓冲该消息。

因此...

单个WebSocket"消息"可以包含无限数量的9,223,372,036,854,775,807字节片段。

这可能会使实施难以通过其API始终向您发送完整的消息......

因此,在一般情况下,您的问题的答案是WebSocket协议是基于消息的协议,您不必手动构建消息。您用于使用协议的API可能具有适当的消息大小限制(以允许它保证将消息作为单个块传递),或者可以提供流式接口以允许无限大小的消息。

我在标准化过程here期间对此大肆渲染。

答案 1 :(得分:4)

WebSocket是一种基于消息的协议,因此如果您将一大块数据作为WebSocket消息的有效负载发送,则对等方将收到一条单独的WebSocket消息,其中包含与有效负载完全相同的数据块。