Socket粘包分包

Socket粘包分包

粘包和分包问题

1.首先什么是包
包就是每次服务器向客户端发送的数据每发送一个消息都会被打成一个包发送到客户端。
客户端向服务器端发送消息也是一样的。
2.为什么会有粘包和分包的问题
是因为SocketTCP自身的优化机制所导致的。
3.什么是粘包
粘包就是当服务器端发送的数据很小的时候又很频繁的时候,就会消耗性能,所以SocketTCP就会把几个数据包打成一个包发送到客户端,来进行优化网络。
4.什么是分包
分包就是当服务器端发送的消息特别大的时候,它的传输速度就会特别慢,还有可能是发送中途会失败,这个时候这条消息就要在次重新发送一次,非常消耗性能和时间,为了避免这样的事情发生,SocketTCP自身优化机制就会把这条特别大的消息分开为N个小包发送到客户端,提高消息的传输速度与安全性,就算中间有个别的包丢失了,也不用重新全部发送一遍而是单独发送一遍丢失的小包就好了。
5.粘包或者分包后接到的顺序是什么样的
虽然经过分包或者粘包,但是他的先后顺序是不会变的。
比如第一条消息是1第二条是2那么他接收到的粘包数据就是12。
分包也是一样,分包粘包不会影响数据的顺序,只是会影响接收的次数。
6.什么时候会出现这种问题
例如:在Unity中某个游戏物体的坐标需要实时的同步,这个时候就会出现粘包问题因为它的数据非常小只有xyz的坐标数据,但是每秒要同步很多次,造成了数据传输频繁数据又非常小就会出现粘包的现象。
7.粘包分包的解决方案
我们每次发送的消息都是一个Byte数组,这个数据肯定是有一个大小的,这时候我们在这个数据前面加一个数据,这个数据来代表我们的数据长度,也就是我们说的消息头,然后我们在读取长度的时候就会先读取到这个数据的长度,然后我们知道了数据的长度就往后读取相应长度的字节就好了,如果发现我们后面的数据没有那么长这个时候就不处理等到满足相应的长度在去处理。我们的数据长度是不固定的,但是我们的消息头是固定的。

声明:这篇文章只是个人学习笔记,如果有不同见解或者有不对的,欢迎大家评论区指正,大家一起学习共进步。

你可能感兴趣的:(Socket粘包分包)