Websocket需要像TCP Socket那样进行逻辑数据包的分包与合包吗
2016-03-20 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:117538
获赞数:517196
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。
向TA提问 私信TA
关注
展开全部
RFC规范指出,WebSocket是一个message-based的协议,它可以自动将数据分片,并且自动将分片的数据组装。
也就是说,WebSocket的RFC标准是不会产生粘包、半包问题的。无需应用层开发人员关心缓存以及手工组装message。
然而理想与现实的不一致:RFC规范与实现的不一致,现实当中有几个问题:
1. 每个message可以是一个或多个分片。message不记录长度,分片才记录长度。
2. message最大的长度可以达到 9,223,372,036,854,775,807 字节,是由于Payload的数据长度有63bit的限制。
3. 很多WebSocket的实现其实并不按照标准的RFC实现完全,很多仅仅实现了50%就拿来用了。
这就导致了,在WebSocket实现上的最大长度很难达到这个大小,于是,很多API的实现上是会有限制的,可能会限制你的发送的长度,也可能会把过长的数据直接以流式发送。
结论
WebSocket的RFC标准是不会产生粘包、半包问题的,但是由于现实世界的WebSocket的实现者不同程度的偷懒,不同程度的会有这个问题,特别是当你的数据message特别大的时候(到底是多大是特别大,由具体实现决定)。
尽可能的选择一个符合自己项目的WebSocket实现,或者自己造一个满足需要的轮子。
也或者,把WebSocket看做一个有特别大的长度限制“流”协议,然后自己处理buffering的问题。
作者:RainVision
也就是说,WebSocket的RFC标准是不会产生粘包、半包问题的。无需应用层开发人员关心缓存以及手工组装message。
然而理想与现实的不一致:RFC规范与实现的不一致,现实当中有几个问题:
1. 每个message可以是一个或多个分片。message不记录长度,分片才记录长度。
2. message最大的长度可以达到 9,223,372,036,854,775,807 字节,是由于Payload的数据长度有63bit的限制。
3. 很多WebSocket的实现其实并不按照标准的RFC实现完全,很多仅仅实现了50%就拿来用了。
这就导致了,在WebSocket实现上的最大长度很难达到这个大小,于是,很多API的实现上是会有限制的,可能会限制你的发送的长度,也可能会把过长的数据直接以流式发送。
结论
WebSocket的RFC标准是不会产生粘包、半包问题的,但是由于现实世界的WebSocket的实现者不同程度的偷懒,不同程度的会有这个问题,特别是当你的数据message特别大的时候(到底是多大是特别大,由具体实现决定)。
尽可能的选择一个符合自己项目的WebSocket实现,或者自己造一个满足需要的轮子。
也或者,把WebSocket看做一个有特别大的长度限制“流”协议,然后自己处理buffering的问题。
作者:RainVision
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询