当前位置: 首页 > 后端技术 > Node.js

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

时间:2023-04-03 20:35:42 Node.js

序言极尽倾注,深陷其中,界限分明。分享的文章纯属个人观点。如果有不准确的地方或者需要讨论的地方,欢迎大家评论交流,和同学一起学习~欢迎关注“前端进阶”步圈’公众号,一起探索学习前端技术。..公众号回复加群或扫码,即可加入前端交流学习群,长期交流学习。。公众号回复加群即可加为好友.什么是粘袋/半袋问题,如何解决?什么是粘袋?粘包问题:数据传输过程中,一条消息读取了另一条消息的部分数据。这种现象称为粘包。比如发送两条消息,分别是“ABC”和“DEF”,那么正常情况下接收端也应该收到两条消息“ABC”和“DEF”,但是接收端收到的是“ABCD”,这样的情况这叫粘包,如下图:什么是半包?半包问题:指接收端只收到部分数据,没有收到完整数据的情况,称为半包。例如,一条消息发送为“ABC”,但接收端收到“AB”和“C”两条消息。这种情况称为半包,如下图:为什么会出现粘包问题?Q:为什么会出现粘包问题?R:粘包问题出现在TCP/IP协议中,因为TCP是面向连接的传输协议,它以流的形式传输数据,而流数据没有明确的数据起止边界,所以会存在一个坚持的问题。如何解决粘袋/半袋问题?Q:如何解决粘包/半包问题?固定数据大小:发送方和接收方固定发送数据的大小,当字符串长度不够时,使用空字符来弥补。有了固定大小后,每条消息的具体边界就知道了,这样就不存在粘包的问题了。缺点:当数据量较小时,使用空字符填充会增加网络传输的负担。自定义数据协议层封装:在TCP协议的基础上封装一层自定义数据协议。在自定义数据协议中,包含数据头(存储数据的大小)和数据的具体内容,这样服务器拿到数据后,通过解析数据头,可以得到数据的具体长度已知,不存在粘包问题。缺点:这种方案虽然可以解决粘包问题,但是消息设计和代码实现的复杂度比较高,而且不是很理想的方案都是以特殊字符结尾:比如\n结尾,这样我们就知道了数据的特定边界以避免粘包问题。缺点:优点是实现简单,但有一定的局限性。比如消息中间有终止符,就会造成半包问题。因此,如果是复杂的字符串,则必须对内容进行编码和解码。确保终止符的正确性。Header+body格式:这种格式的数据包一般分为两部分,即header和body。头部是固定大小的,头部必须包含一个字段来指示下一个主体的大小。文章特殊字符描述:问号Q(问题)答案标记R(结果)注释标准:A:(注意事项)详细描述标记:D:(详细信息)摘要标记:S:(摘要)分析标记:Ana:(analysis)提示标签:T:(tips)往期回顾:热门面试题:过程系列题?热门面试题:Node.js中的垃圾回收?面试热点问题:http3.0~http1.0有哪些改进?JavaScript中的AMD和CMD规范Vue数据监控Object.definedProperty()方法的实现最后:欢迎来到“前端进阶圈”公众号,一起来探索和学习前端技术吧...公众号回复补充群或扫描二维码,可以加入前端交流学习群,长期交流学习...公众号回复加好友,即可加为好友