前言
极度投入,深度沉迷,边界清晰
前端小菜鸡一枚,分享的文章纯属个人见解,若有不正确或可待探讨点可随便评论,与各位同学一起学习~
欢送关注
『前端进阶圈』
公众号,一起摸索学习前端技术 ……公众号回复
加群
或扫码
, 即可退出前端交流学习群,长期交流学习 ……公众号回复
加好友
,即可添加为好友
什么是粘包 / 半包问题,该如何解决?
什么是粘包?
- 粘包问题:在数据传输时,在一条音讯中读取到了另一条音讯的局部数据,这种景象叫做粘包。
-
比方发送了两条音讯,别离为“ABC”和“DEF”,那么失常状况下接收端也应该收到两条音讯“ABC”和“DEF”,但接收端却收到的是“ABCD”,像这种状况就叫做粘包,如下图所示:
什么是半包?
- 半包问题:指接收端只收到了局部数据,而非残缺的数据的状况就叫做半包。
-
比方发送了一条音讯是“ABC”,而接收端却收到的是“AB”和“C”两条信息,这种状况就叫做半包,如下图所示:
为什么会呈现粘包问题?
-
Q: 为什么会呈现粘包问题?
-
R: 粘包问题产生在 TCP/IP 协定中,因为 TCP 是面向连贯的传输协定,它是以 流 stream 的模式传输数据的,而 流 数据是没有明确数据的开始和结尾边界的,所以就会呈现粘包问题。
如何解决粘包 / 半包问题?
-
-
Q: 如何解决粘包 / 半包问题?
-
固定数据大小
: 发送放和接管方固定发送数据的大小,当字符串长度不够时用空字符补救。有了固定大小之后就晓得每条音讯的具体边界了,这样就没了粘包问题。- 毛病:当数据量小的时候应用空字符来填充,会额定减少网络传输的累赘。
-
封装自定义数据协定层
: 在 TCP 协定的根底上封装一层自定义数据协定,在自定义数据协定中,蕴含数据头(贮存数据的大小) 和数据的具体内容,这样服务端失去数据后,通过解析数据头就能够晓得数据的具体长度,也就没有粘包的问题了。- 毛病:此计划尽管能够解决粘包问题,但音讯的设计和代码的实现复杂度比拟高,所有也不是现实的解决方案
-
以非凡的字符结尾
: 比方\n
结尾,这样咱们就晓得数据的具体边界了从而防止了粘包的问题。- 毛病:长处是实现起来简略,但存在肯定的局限性,比方一条音讯两头如果呈现了结束符就会造成半包的问题,所以如果是简单的字符串要对内容进行编码和解码解决,这样能力保障结束符的正确性。
包头 + 包体格局
: 这种格局的包个别分为两局部,即包头和包体,包头是固定大小的,且包头中必须含有一个字段来阐明接下来的包体有多大。
-
文章特殊字符形容:
- 问题标注
Q(question)
- 答案标注
R(result)
- 注意事项规范:
A:(attention matters)
- 详情形容标注:
D:(detail info)
- 总结标注:
S:(summary)
- 剖析标注:
Ana:(analysis)
- 提醒标注:
T:(tips)
往期回顾:
- 热点面试题:过程系列问题?
- 热点面试题:Node.js 中的垃圾回收机制?
- 热点面试题:简述 http3.0~http1.0 别离有什么改良?
- JavaScript 中的 AMD 和 CMD 标准
- Vue 数据监听 Object.definedProperty()办法的实现
最初:
- 欢送关注
『前端进阶圈』
公众号,一起摸索学习前端技术 …… - 公众号回复
加群
或扫码
, 即可退出前端交流学习群,长期交流学习 …… - 公众号回复
加好友
,即可添加为好友