同事定义了一个二进制协议格式如下
帧头+帧长度+……
但是没有看到有数据内包含与帧头一样的数据时如何转译的说明,所以我就有疑问如何避免粘包或多帧合并发送时怎么拆包?
对方回答:
我们实际上会在缓存解包,分包与拆包,不会出现大量粘包现象的。
问题来了,我不太理解他说的:“在缓存解包,分包与拆包” 是什么意思? 是如何识别帧头帧尾,分包拆包的?
发帖咨询后得到了网友ba_wang_mao的热心回复,而且非常详细启发很大:
粘包和拆包发生的场合
1、一般只有在TCP网络上通信时才会出现分包与折包,单片机串口通信时,只要两帧报文之间发送的时间间隔大于一定值(例如:100毫秒),就不会出现分包和折包。
什么是分包与拆包呢?
假设客户端分别发送了两个数据包D1和D2给服务端,由于服务端一次读取到的字节数是不确定的,故可能存在以下4种情况。
(1)服务端分两次读取到了两个独立的数据包,分别是D1和D2,没有粘包和拆包;
(2)服务端一次接收到了两个数据包,D1和D2粘合在一起,被称为TCP粘包;
(3)服务端分两次读取到了两个数据包,第一次读取到了完整的D1包和D2包的部分内容,第二次读取到了D2包的剩余内容