TCP中粘包/分包问题


我们在使用TCP协议进行数据的传输时,会出现粘包与分包,只是由于内部的优化机制所导致的。
换句话说:
粘包与分包是以用Socket在TCP协议下内部的优化机制

1 什么是粘包

例如我们在向服务器传输数据时, 尤其是在频繁的发送一系列琐碎数据时,系统不会立马将消息发送到服务器端,而是会将这些琐碎细小的数据进行粘念结合,形成一个大数据后,才会发送给服务器端。
此时的服务器端只会调用一次receive方法然后一次性接受多个数据的整合

2 什么是分包

了解了粘包,就很容易理解分包了。
当我们一次性发送一个超大数据的时候。这时候系统就会对这条数据进行分包,将这条超大数据拆分成多个小数据进行发送。
在传输过程中,当发送失败进行重新发送时,大数据不仅占用时间,还占用网速。
此时,服务器端就不会像粘包一样只调用一次receive。若拆分成了十个小数据,则会调用10次receive方法

3 分包与粘包问题的演示

3.1 粘包

 for(int i = 0; i < 100; i++)
                clientSocket.Send(Encoding.UTF8.GetBytes(i.ToString()));

在这里插入图片描述

3.2 分包

这里需要一个极大的数据。这里就暂时不去弄了。

注意:以上测试是在异步环境下进行的。

4 解决分包与粘包问题

这种优化固然是好事,能在效率上给我们带来极大的提升。
但是在游戏的开发中,我们通常会频繁的发送一些琐碎数据,比如位置更新信息。这时候我们必须清楚的知道一个包里包含了多少条位置信息,这样才能对这些位置信息进行有效的处理。
如下:我们可以将数据进行分割。
前面代表我们固定每次所接收数据的长度,后面则是有效的数据。
每次接收到数据时就去检测,是否达到长度(4),达到了,则处理,未达到,则继续接受到程度为4为止。

4 XXXX

猜你喜欢

转载自blog.csdn.net/TakahashiRyosuke/article/details/107644007
今日推荐