什么是TCP粘包和半包?怎么解决?
为什么会有粘包问题?
粘包问题发生在 TCP/IP 协议中,因为 TCP 是面向连接的传输协议,它是以“
流”的形式传输数据的,而“流”数据是没有明确的开始和结尾边界的,所以就会出现粘包问题
。
粘包问题
是指当发送两条消息时,比如发送了 ABC 和 DEF,但另一端接收到的却是 ABCD和EF,像这种一次性读取了两条数据的情况就叫做粘包(正常情况应该是一条一条读取的)。
半包问题
是指,当发送的消息是 ABC 时,另一端却接收到的是 AB 和 C 两条信息,像这种情况就叫做半包。
解决方案
粘包问题的常见解决方案有以下 3 种:
-
固定数据大小
发送方和接收方固定发送数据的大小,当字符长度不够时用空字符弥补,有了固定大小之后就知道每条消息的具体边界了,这样就没有粘包的问题了; -
自定义请求协议
在 TCP 协议的基础上封装一层自定义数据协议,在自定义数据协议中,包含数据头(存储数据的大小)和 数据的具体内容,这样服务端得到数据之后,通过解析数据头就可以知道数据的具体长度了,也就没有粘包的问题了(推荐方案); -
特殊字符结尾
以特殊的字符结尾,比如以“\n”结尾,这样我们就知道数据的具体边界了,从而避免了粘包问题。
代码实现(自定义协议)
最后更新于 2023-08-31 12:49:10 并被添加「」标签,已有 807 位童鞋阅读过。
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处
此处评论已关闭