粘包拆包原因
TCP 是面向流的,操作系统通过缓冲区来发送数据,数据大小和缓冲区大小的不同可能出现粘包、拆包问题
-
如果一次请求发送的数据量比较小,没达到缓冲区大小,TCP 会将多个请求合并为同一个请求进行发送,这就是粘包问题
-
如果一次请求发送的数据量比较大,超过了缓冲区大小,TCP 就会将其拆分为多次发送,这就是拆包问题
常见的解决方案
- 发送端将每个包都封装成固定的长度,比如 1024 字节,不足的空间可通过补 0 填充
- 发送端在每个包的末尾使用固定的分隔符,如
\r\n
,如果发生拆包需等待收到多个包之后再找到其中的\r\n
进行合并 - 将消息分为头部和消息体,头部中保存整个消息的长度,只有读取到足够长度的消息之后才算是读到了一个完整的消息
- 通过其它自定义协议进行粘包和拆包的处理