头图

热点面试题:什么是粘包/半包问题,该如何解决?

前言

极度投入,深度沉浸,边界清晰

前端小菜鸡一枚,分享的文章纯属个人见解,若有不正确或可待讨论点可随意评论,与各位同学一起学习~

欢迎关注 『前端进阶圈』 公众号 ,一起探索学习前端技术......

公众号回复 加群扫码, 即可加入前端交流学习群,长期交流学习......

公众号回复 加好友,即可添加为好友

什么是粘包/半包问题,该如何解决?

什么是粘包?

  • 粘包问题:在数据传输时,在一条消息中读取到了另一条消息的部分数据,这种现象叫做粘包。
  • 比如发送了两条消息,分别为“ABC”和“DEF”,那么正常情况下接收端也应该收到两条消息“ABC”和“DEF”,但接收端却收到的是“ABCD”,像这种情况就叫做粘包,如下图所示:
    label

    什么是半包?

  • 半包问题:指接收端只收到了部分数据,而非完整的数据的情况就叫做半包。
  • 比如发送了一条消息是“ABC”,而接收端却收到的是“AB”和“C”两条信息,这种情况就叫做半包,如下图所示:
    label

    为什么会出现粘包问题?

  • Q: 为什么会出现粘包问题?

    • R: 粘包问题发生在 TCP/IP 协议中,因为 TCP 是面向连接的传输协议,它是以 流 stream 的形式传输数据的,而 流 数据是没有明确数据的开始和结尾边界的,所以就会出现粘包问题。

      如何解决粘包/半包问题?

  • Q: 如何解决粘包/半包问题?

    1. 固定数据大小:发送放和接收方固定发送数据的大小,当字符串长度不够时用空字符弥补。有了固定大小之后就知道每条消息的具体边界了,这样就没了粘包问题。

      • 缺点:当数据量小的时候使用空字符来填充,会额外增加网络传输的负担。
    2. 封装自定义数据协议层:在 TCP 协议的基础上封装一层自定义数据协议,在自定义数据协议中,包含数据头(储存数据的大小) 和数据的具体内容,这样服务端得到数据后,通过解析数据头就可以知道数据的具体长度,也就没有粘包的问题了。

      • 缺点:此方案虽然可以解决粘包问题,但消息的设计和代码的实现复杂度比较高,所有也不是理想的解决方案
    3. 以特殊的字符结尾: 比如 \n 结尾,这样我们就知道数据的具体边界了从而避免了粘包的问题。

      • 缺点:优点是实现起来简单,但存在一定的局限性,比如一条消息中间如果出现了结束符就会造成半包的问题,所以如果是复杂的字符串要对内容进行编码和解码处理,这样才能保证结束符的正确性。
    4. 包头 + 包体格式:这种格式的包一般分为两部分,即包头和包体,包头是固定大小的,且包头中必须含有一个字段来说明接下来的包体有多大。

文章特殊字符描述:

  1. 问题标注 Q(question)
  2. 答案标注 R(result)
  3. 注意事项标准:A:(attention matters)
  4. 详情描述标注:D:(detail info)
  5. 总结标注:S:(summary)
  6. 分析标注:Ana:(analysis)
  7. 提示标注:T:(tips)

往期回顾:

最后:

  • 欢迎关注 『前端进阶圈』 公众号 ,一起探索学习前端技术......
  • 公众号回复 加群扫码, 即可加入前端交流学习群,长期交流学习......
  • 公众号回复 加好友,即可添加为好友
47 声望
2 粉丝
0 条评论
推荐阅读
热点面试题:JS 如何判断一个元素是否在可视区域内?
前言系列首发于公众号『前端进阶圈』 ,更多精彩内容敬请关注公众号最新消息。JS 如何判断一个元素是否在可视区域内?方法一:offsetTop、scrollTop方法二:getBoundingClientRect()方法三:Intersection Observe...

控心crazy1阅读 163

封面图
正则表达式实例
收集在业务中经常使用的正则表达式实例,方便以后进行查找,减少工作量。常用正则表达式实例1. 校验基本日期格式 {代码...} {代码...} 2. 校验密码强度密码的强度必须是包含大小写字母和数字的组合,不能使用特殊...

寒青57阅读 8.7k评论 11

JavaScript有用的代码片段和trick
平时工作过程中可以用到的实用代码集棉。判断对象否为空 {代码...} 浮点数取整 {代码...} 注意:前三种方法只适用于32个位整数,对于负数的处理上和Math.floor是不同的。 {代码...} 生成6位数字验证码 {代码...} ...

jenemy49阅读 7.4k评论 12

再也不学AJAX了!(二)使用AJAX ① XMLHttpRequest
「再也不学 AJAX 了」是一个以 AJAX 为主题的系列文章,希望读者通过阅读本系列文章,能够对 AJAX 技术有更加深入的认识和理解,从此能够再也不用专门学习 AJAX。本篇文章为该系列的第二篇,最近更新于 2023 年 1...

libinfs42阅读 7k评论 12

封面图
「多图预警」完美实现一个@功能
一天产品大大向 boss 汇报完研发成果和产品业绩产出,若有所思的走出来,劲直向我走过来,嘴角微微上扬。产品大大:boss 对我们的研发成果挺满意的,balabala...(内心 OS:不听,讲重点)产品大大:咱们的客服 I...

wuwhs32阅读 3.6k评论 5

封面图
安全地在前后端之间传输数据 - 「3」真的安全吗?
在「2」注册和登录示例中,我们通过非对称加密算法实现了浏览器和 Web 服务器之间的安全传输。看起来一切都很美好,但是危险就在哪里,有些人发现了,有些人嗅到了,更多人却浑然不知。就像是给门上了把好锁,还...

边城29阅读 6.4k评论 5

封面图
2022大前端总结和2023就业分析
我在年前给掘金平台分享了《2022年热点技术盘点》的前端热点,算是系统性的梳理了一下我自己对前端一整年的总结。年后,在知乎上看到《前端的就业行情怎么样?》,下面都是各种唱衰前端的论调,什么裁员,外包化...

i5ting27阅读 2.4k评论 4

封面图
47 声望
2 粉丝
宣传栏