简单地说,比如客户端调用
client.send(“1”);
client.send(“2”);
clinet.send(“3”);
底层的TCP可能会把这几个小包合起来成为一个大包,因此底层可能的调用是client.send(“123”);
另一种情况是服务器没有及时处理数据:
服务器先后收到三个包"1",“2”,“3”,服务器没有及时处理,这三个包粘成了"123",由于服务器不知道包的边界,因此只能一起取出,而不知道分三次取出。把大包"123"拆成三个小包"1",“2”,"3"的过程就叫拆包。拆包只能依赖应用层来解决;
要是这三个包是有联系的,那么就不需要拆包;
要是这三个包是不相联的,那么就需要拆包了。
粘包的原因:数据流是没有边界的
拆包的关键:为基于数据流的包添加边界:如加入分界符,将包分为数据头和数据体等。
参考:
https://www.cnblogs.com/sui776265233/p/9289858.html
https://blog.csdn.net/ailunlee/article/details/95944377