乐趣区

关于javascript:热点面试题什么是粘包半包问题该如何解决

前言

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

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

欢送关注 『前端进阶圈』 公众号,一起摸索学习前端技术 ……

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

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

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

什么是粘包?

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

    什么是半包?

  • 半包问题:指接收端只收到了局部数据,而非残缺的数据的状况就叫做半包。
  • 比方发送了一条音讯是“ABC”,而接收端却收到的是“AB”和“C”两条信息,这种状况就叫做半包,如下图所示:

    为什么会呈现粘包问题?

  • 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)

往期回顾:

  • 热点面试题:过程系列问题?
  • 热点面试题:Node.js 中的垃圾回收机制?
  • 热点面试题:简述 http3.0~http1.0 别离有什么改良?
  • JavaScript 中的 AMD 和 CMD 标准
  • Vue 数据监听 Object.definedProperty()办法的实现

最初:

  • 欢送关注 『前端进阶圈』 公众号,一起摸索学习前端技术 ……
  • 公众号回复 加群 扫码, 即可退出前端交流学习群,长期交流学习 ……
  • 公众号回复 加好友,即可添加为好友
退出移动版