unity游戏开发网络模块之TCP粘包

TCP与UDP

在了解TCP粘包问题之前,我们先简单了解一下TCP与UDP。

UDP本质上是一个不可靠的传输,他对于传输过程没有建立连接,也没有过多的处理,是直接发送数据报文的形式,所以,UDP传输过程中,不会出现粘包情况

TCP是一个可靠传输,有着三次握手和四次握手的机制来保证连接的建立和断开,是转化字节流传输的,并且TCP在接收和发送都有自己的处理机制,就是这些机制导致了粘包现象。

简单描述了一下TCP以及UDP的区别,大致了解了粘包之后,我们来具体介绍一下什么是粘包,以及如何解决粘包问题

粘包现象

接下来用一段简单的大量发送消息的尝试来复现一下粘包问题。

这一段代码是发送100次,每次发送一段字符串"aaaabbbbcccc"

我们看一下发送的结果

数据很明显被截断了,分成了2部分,并且截断的尾部,很明显不是一个完整的发送的字符串,这就是一个很明显的粘包现象,100次的数据粘成了两部分。

TCP的粘包原因

TCP的粘包原因主要出现在两个方面:
发送方:发送方出现粘包的原因主要是因为TCP协议本身的原因,一方面是因为TCP在发送数据之前,会先收集足够多的数据量才会进行数据发送,如果有些数据偏小的情况,就会导致数据粘连;另一方面是因为TCP协议规定有MSS,如果数据包过长就会被分开传输。这样就会导致数据截断,然后剩下的数据会跟后续的数据粘连

接收方:TCP中有数据缓冲区,接收方从缓冲区中接收数据不及时,在下一个数据包到达之前没有取走之前的数据,就导致了拿出来的数据是粘包的

TCP粘包的解决方法

在充分了解了粘包出现的原因之后,我们可以考虑一下如何解决粘包问题。其实根本问题很简单,就是如何拆分接收到的数据包。如果我们能知道每次数据包的长度,那么不管包体如何粘连,我们都可以完整的拆分出每个数据包,核心的思路就在于如何拆分,因为每次发送的数据包长度大小并不固定。

其实解决的思路很简单,我们只需要知道每次发送的包体长度即可,那么我们就可以把包体的长度当作每次数据包的包头,放在数据包里发过去,再使用固定长度的包头,那么我们的接收方就可以通过读取固定长度的包头,取出包体长度,然后继续读取这个长度的数据即可,而这也是我们解决粘包问题的核心思路。

在发送方,我们把每次要发的数据封装成两部分,第一部分是固定长度的包头部分,然后获取发送数据的长度,把长度放入包头中,然后再拼接数据作为第二部分,也就是包体部分。

然后在接收方再进行拆包即可,拆包的规则也很简单,通过第一个包的包头获取到包体的数据长度,然后通过包体长度获取后面已知的长度数据解析,就可以拿到一个完整的数据包。

如果数据长度不够,那我们把后续的数据存起来,等到下一个包过来,拼接起来,然后取数据长度就可以拿到完整数据包。

如果数据长度超出我们需要的数据长度,也就是说还有多余数据,那么我们就存一个读到的位置,然后后面的数据就从这个位置开始读。

通过这两种情况的组合处理,逐次把缓冲区数据读取出来。

经过拆包之后,每个拆分的数据包都是一个完整的数据包。

Unity实现Socket通讯时,常常会遇到TCP粘包和拆包的问题。下面我将介绍在Unity中如何解决这些问题。 TCP粘包是指在传输过程中,由于数据缓冲区的限制,多个小的数据包可能会被合并成一个大的数据包,导致数据的解析和处理出现问题。为了解决这个问题,可以通过以下两种方式来处理。 第一种方式是定长包头+包体的设计。即在数据包前面添加一个固定长度的包头,包头中包含了包体的长度信息。接收方在接收数据时,首先读取包头的长度信息,然后再根据长度信息读取相应长度的数据进行解析和处理。 第二种方式是使用特殊的字符序列作为包的分隔符。例如,在每个数据包的末尾添加一个换行符或其他不常用的字符作为分隔符。接收方在接收数据时,通过查找这个分隔符来确定包的结束位置,然后对数据进行解析和处理。 TCP拆包是指在传输过程中,一个大的数据包可能会被拆分成多个小的数据包,导致数据的解析和处理出现问题。为了解决这个问题,可以通过以下方式来处理。 可以在接收方使用缓冲区来接收数据,并且设置一个最大接收长度。当接收到的数据长度小于最大接收长度时,将数据放入缓冲区中,并在缓冲区中进行数据的拼接。当接收到的数据长度大于等于最大接收长度时,对缓冲区中的数据进行解析和处理,并清空缓冲区。 以上是Unity实现Socket通讯时解决TCP粘包和拆包问题的方法。希望对你有帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值