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

Tcp websocket是基于流还是基于包的协议?,tcp,websocket,packet,Tcp,Websocket,Packet,假设服务器和客户端通过WebSocket进行对话。每次都会发送另一个数据块。不同的块可能有不同的长度 我是否可以保证,若服务器在一次调用中发送块,那个么客户端将在一次消息回调中接收块,反之亦然?也就是说,WebSocket是否具有嵌入的“打包”功能,因此我不必关心我的数据在传输过程中是否在几个回调中被分割?WebSocket是一种基于消息的协议,因此如果您发送一块数据作为WebSocket消息的有效负载,对等方将收到一条单独的WebSocket消息,该消息正好包含作为有效负载的数据块。理论上,W

假设服务器和客户端通过WebSocket进行对话。每次都会发送另一个数据块。不同的块可能有不同的长度


我是否可以保证,若服务器在一次调用中发送块,那个么客户端将在一次
消息
回调中接收块,反之亦然?也就是说,WebSocket是否具有嵌入的“打包”功能,因此我不必关心我的数据在传输过程中是否在几个回调中被分割?

WebSocket是一种基于消息的协议,因此如果您发送一块数据作为WebSocket消息的有效负载,对等方将收到一条单独的WebSocket消息,该消息正好包含作为有效负载的数据块。

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

  • WebSocket消息由一个或多个帧组成
  • 帧可以是完整帧,也可以是片段帧
  • 消息本身在协议中没有任何长度指示,只有帧有
  • 帧的有效负载长度可达9223372036854775807字节(由于协议允许63位长度指示符)
  • 分段的主要目的是允许在消息启动时发送大小未知的消息,而不必缓冲该消息
所以

单个WebSocket“消息”可以由不限数量的9223372036854775807字节片段组成

这可能会使实现很难始终通过其API向您传递完整的消息

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


在标准化过程中,我曾大肆宣扬过这一点。

old rant(大约在2011年),大多数观点都是毫无意义的、无效的,或者在websocket的各种实际实现中得到了解决。好吧,我想我们会同意不同意,除非你喜欢评论有问题的博客文章并指出它现在是如何不正确;然后我们可以讨论。实现可以并且确实提出了自己的解决方案(如消息大小限制),这一事实并不影响协议规范允许上述行为的事实,这很不幸,当时应该/可能已经解决了。我想这里讨论的所有人都是我所说的网络和WebSocket方面的专家;)但我想向其他读者指出一件事:我想区分API和协议是值得的。WebSocket API可以在不同级别公开WebSocket:每消息、每帧或流。即使使用流式API,实现也可以公开消息边界。在任何情况下,WebSocket协议本身都是基于消息(和帧)的。它需要保留消息边界,但不需要保留框架边界。然而,最初的问题通过询问实现将如何将消息传递给用户代码,使问题变得有点混乱,