00:00
TCP粘包和拆包及解决方案。首先我们对TCP粘包还有拆包对它做基本的介绍。TCP大家都知道,它是面向连接,面向流的,提供了高可高可靠性的服务,收发两端及我们的客户端和服务器端。那么他们要形成一个socket。通过这个so进行数据的发送和接收,因此发送端呢,他为了将多个发给接收端的包更有效的发给对方。往往会使用优化算法,就叫NEO。那么这种算法它能够干什么呢?它能够将多次间隔较小且数量数据量较小的数据合成合,合并成一个大的数据块,然后进行封包,这样发送。对,这样相当于说原先你有很多小的包。
01:00
很有很多小的包,一个一个的发送呢。太慢了,所以说他用这个算法优化算法,可以把它封装成一个较大的数据包,把它发给我们的这个。接收方。接收方。好的,这样呢,确实能够提高效率,但是同时也带来一些问题,带来什么问题呢?就是接收端它很难去分辨出一个完整的数据包了,也就是说我在接收的时候,到底你哪一个是个完整的包?对,你的信息都多少个字节才是一个完整的数据?这样就造成了麻烦,对接收方就造成了一个困难,因为我们面向流的通讯是无消息保护边界的。那这样就会出现我们的什么呢?出现我们粘包和拆包的问题。所以说由于TCP无消息保护边界,需要在接收端处理消息边界的问题,就是我们所说的经常所说的粘包、拆包问题。下面呢,我们通过一张图,可以更清晰的看到TCP粘包和拆包的问题之所在,来看这张图。
02:12
这张图呢,它就说明了我们粘包拆包的这么几种情况,比如这是我们的客户端,这是我们的server端,客户端呢要发送数据给server,好假定客户端发送了两个数据包,第一和第二。第一和第二。由于服务器端一次一次性读取到的字节数是不明确的,故而可能存在下面几种情况,四种。第一种第一种就是。服务器端,它分别读取了第一和第二。好,这样是正确的,就是说服务器端分别读取到两个独立的数据包,第一和第二,这时呢,没有出现粘包和拆包现象,就说你这个是一个数据,独立的数据,这是一个独立的完整的数据。这是一种,第二种呢,服务端一次性接收了两个数据包,第一和第二,比如他把这两个呢粘在一起接收。
03:07
也就是说,把第一和第二粘合在一起,这个就称之为TCP粘包。第三种情况,服务器端分别读取到两个数据包,第一次它读取到了一个完整的第一,再加上第二这个数据包的一部分。但是我这个是个示意啊,他不是说一定只是拆成两份,他可能拆成三份四份都有可能。我我这是这么一种假定的情况,比如说他读取到第一这么一个完整的包,再加上第二这个数据包的一部分。对,那就说第二次我们再读取到了第二的第二数据包的剩余的部分,这个就称之为拆包,把谁拆了呢?把我们的第二拆了。明白,还有一种情况就是这种情况,这种情况是也是分两次读取。第一次呢,读取到第一包的部分数据。
04:03
第二次读取到了第一,剩余的部分加上第二。完整的部分,其实这个时候也出现了沾包,呃,这个拆包的现象,对不对?好,基于这样一个原因,大家想。是不是你拿到这一部分数据,你知道怎么处理吗?就是比如说你拿到这样一个数据。你怎么去处理,或者说你拿到这个数据怎么去处理,或者说拿到这个数据怎么去处理,因为你并不知道你服务器端收到的这个数据是不是一个完整的独立的数据,你就如果你在你直接按照你这边业务逻辑进行处理,很有可能就是因为你接收到数据不完整。造成整个业务逻辑的错误。是不是所以说TCP粘包和拆包问题呢?是我们在进行网络编程的时候必须去解决的问题。那下面呢,我们就来看一下,在我们Nike里边,因为现在我们是讲Nike,所以说我们首先给大家用Nike程序演示一下TCP粘包和拆包,它会是怎样出现的,然后呢,我们再说明怎么解决好这这个呢,我们先把TCP粘包和拆包的原理给家讲清楚了,这种情况大家理解了啊,一会儿呢,我们来模拟这个问题,再说解决方案。
我来说两句