TCP协议中的粘包分包问题

使用TCP协议进行网络游戏开发的时候,有粘包和分包两个问题。

粘包和分包是利用Socket在TCP协议下内部的优化机制,在使用TCP协议进行数据的传输进行通讯的时候,会出现粘包分包问题的话,是由于优化导致,即内部的数据传输机制所导致的。

在客户端调用Send()方法传送数据,每传送的数据称为包

1. 粘包

当发送数据比较频繁的时候,且数据的内容较短。不会立马发送服务器,会包包结合进行打包,服务器收到多条消息但是只调用一次。服务器接收到的消息不一定是一条消息,可能是多条消息的整合。

// 向服务端发送100条数据
for (int i = 0; i < 100; i++)
{
    clientSocket.Send(Encoding.UTF8.GetBytes(i.ToString()));
}

实际客户端发送100次数据。会看到服务端只从客户端只接收了1次数据。
在这里插入图片描述
再次测试发现发送的100次数据,服务端只接受了3次。所以服务器粘包也是不固定的,他与运行的快慢有关 。
在这里插入图片描述
不管粘包多少条数据,从客户端发送来的数据的顺序是不会改变的。

2.分包

与粘包相似,发送特别大的数据量,可能进行分包发送。分成多条消息发送给服务器。包大占用网速时间都比较长。一个包被分为10次,服务器会接收10次。

分包问题不在于发送有多快,而在于发送的数据有多大。如图客户端发送一条大的数据,服务器接收两次。
在这里插入图片描述
同步接受即使接收数组足够大,数据太大也会进行分包,异步的方式数组太大不会产生分包。接收的数组在做网络游戏时,由于服务器每条接收的消息仅包含位置信息等小数据,设置1024就可以。

所以每一次读到消息的时候需要知道,一次接收里面包含多少条消息,然后再进行处理。

补充说明

关于上图中的乱码,服务器收到的第二条消息的时候前面有两个字符是乱码,这是因为汉字字符的关系,因为我这里测试的数据用的是汉字,由于汉字不可拆分这才造成乱码,但不影响后面的数据处理,只要保证时序的重要性就可以了。

猜你喜欢

转载自blog.csdn.net/wankcn/article/details/107063186