详解啥是tcp粘包和拆包现象并演示netty是如何解决的

author author     2023-03-30     483

关键词:

参考技术A 本文介绍什么是 TCP 粘包和拆包现象,并通过 Netty 编写详细的案例来重现 TCP 粘包问题,最后再通过一个 Netty 的 demo 来解决这个问题。具体内容如下

TCP 编程底层都有粘包和拆包机制,因为我们在C/S这种传输模型下,以TCP协议传输的时候,在网络中的byte其实就像是河水,TCP就像一个搬运工,将这流水从一端转送到另一端,这时又分两种情况:

下面通过 Netty 重现 TCP 粘包和拆包现象。

其中关键的代码如下

从上面的案例可以发现当出现 TCP 粘包和拆包现象后会出现下面的问题:

由于 TCP 粘包和拆包现象会导致不能正确区分数据的头尾,那么解决的办法也挺简单的,通过 特殊字符串 来分隔消息体或者使用 定长消息 就能够正确区分数据的头尾。

目前的主流解决方式有以下几种:

Netty 中也提供了基于分隔符实现的半包解码器和定长的半包解码器:

使用 DelimiterBasedFrameDecoder 可以确保收到的数据会自动通过 自定义的分隔符 进行分隔。发送的时候消息的后面只需要增加上 自定义的分隔符 即可。

解决粘包和拆包问题(代码片段)

解决粘包和拆包问题 上一篇我们介绍了如果使用Netty来开发一个简单的服务端和客户端,接下来我们来讨论如何使用解码器来解决TCP的粘包和拆包问题我们知道,TCP是以一种流的方式来进行网络转播的,当tcp三次握手简历通... 查看详情

什么是粘包和拆包,netty如何解决粘包拆包?(代码片段)

Netty粘包拆包TCP粘包拆包是指发送方发送的若干包数据到接收方接收时粘成一包或某个数据包被拆开接收。如下图所示,client发送了两个数据包D1和D2,但是server端可能会收到如下几种情况的数据。上图中演示了粘包和拆... 查看详情

tcp粘包和拆包及解决方案(代码片段)

目录 1. TCP粘包和拆包基本介绍2.TCP粘包和拆包现象实例3.TCP粘包和拆包解决方案 4.具体实例1. TCP粘包和拆包基本介绍TCP 是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一... 查看详情

tcp的粘包和拆包示例以及使用lengthfieldframedecoder来解决的方法(代码片段)

粘包和拆包是什么?TCP协议是一种字节流协议,没有记录边界,我们在接收消息的时候,不能人为接收到的数据包就是一个整包消息当客户端向服务器端发送多个消息数据的时候,TCP协议可能将多个消息数据合并成一个数据包进行发送,... 查看详情

tcp粘包拆包基本解决方案

上个小节我们浅析了在Netty的使用的时候TCP的粘包和拆包的现象,Netty对此问题提供了相对比较丰富的解决方案 Netty提供了几个常用的解码器,帮助我们解决这些问题,其实上述的粘包和拆包的问题,归根结底的解决方案就是... 查看详情

netty解决粘包和拆包问题的四种方案(代码片段)

 在RPC框架中,粘包和拆包问题是必须解决一个问题,因为RPC框架中,各个微服务相互之间都是维系了一个TCP长连接,比如dubbo就是一个全双工的长连接。由于微服务往对方发送信息的时候,所有的请求都是使... 查看详情

tcp粘包和拆包

...个数据包粘在一起的情况,这就是TCP协议中经常会遇到的粘包以及拆包的问题。传输层的UDP协议是否会发生粘包或者拆包问题?不会。UDP是基于报文发送的,在UDP首部采用了16bit来指示UDP数据报文的长度,因此在应用层能很好的... 查看详情

netty解决粘包和拆包问题的四种方案(代码片段)

 在RPC框架中,粘包和拆包问题是必须解决一个问题,因为RPC框架中,各个微服务相互之间都是维系了一个TCP长连接,比如dubbo就是一个全双工的长连接。由于微服务往对方发送信息的时候,所有的请求都是使... 查看详情

day476.tcp粘包和拆包及解决方案-netty(代码片段)

TCP粘包和拆包及解决方案一、TCP粘包和拆包基本介绍TCP是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发给接收端的包࿰... 查看详情

day476.tcp粘包和拆包及解决方案-netty(代码片段)

TCP粘包和拆包及解决方案一、TCP粘包和拆包基本介绍TCP是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发给接收端的包࿰... 查看详情

服务端netty客户端非netty处理粘包和拆包的问题

之前为了调式和方便一直没有处理粘包的问题,今天专门花了时间来搞NETTY的粘包处理,要知道在高并发下,不处理粘包是不可能的,数据流的混乱会造成业务的崩溃什么的我就不说了。所以这个问题在我心里一直是个结。 ... 查看详情

tcp粘包和拆包问题

1)产生TCP粘包和拆包问题的主要原因是,操作系统在发送TCP数据的时候,底层会有一个缓冲区,例如1024个字节大小,如果一次请求发送的数据量比较小,没达到缓冲区大小,TCP则会将多个请求合并为同一个请求进行发送,这就... 查看详情

tcp粘包拆包原因与解决方案

文章目录TCP粘包和拆包问题背景举例说明产生原因解决方案思考:UDP会不会产生粘包问题呢?TCP粘包和拆包问题背景TCP是一个“流”协议,所谓流,就是没有界限的一长串二进制数据。TCP作为传输层协议并不了解... 查看详情

tcp粘包拆包原因与解决方案

文章目录TCP粘包和拆包问题背景举例说明产生原因解决方案思考:UDP会不会产生粘包问题呢?TCP粘包和拆包问题背景TCP是一个“流”协议,所谓流,就是没有界限的一长串二进制数据。TCP作为传输层协议并不了解... 查看详情

关于tcp粘包和拆包的终极解答(代码片段)

关于TCP粘包和拆包的终极解答程序员行业有一些奇怪的错误的观点(误解),这些误解非常之流行,而且持有这些错误观点的人经常言之凿凿,打死也不相信自己有错,实在让人啼笑皆非。究其原因,还是因为这些错误观点所对应... 查看详情

网络i/o编程模型21netty的粘包和拆包问题的解决方案(代码片段)

...f0c;需要在接收端处理消息边界问题,也就是我们说的粘包,拆包问题。1.2粘包和拆包假设有两个数据包D1和D2,由于服务端一次读取到直接数是不确定的,所以可能存在以下4种情况:1.客户端分别发送两个独立... 查看详情

netty之路(二)tcp拆包/粘包问题

...的包封装成一个大的数据包发送,这就是所谓的TCP拆包和粘包问题。假设客户端分别发送了两个数据包D1和D2给服务端,由于服务端一次读取到字节数是不确定的,故可能存在以下四种情况:服务端分两次读取到了两个独立的数... 查看详情

十二.netty入门到超神系列-tcp粘包拆包处理(代码片段)

...别完整的数据包了(TCP无消息保护边界),可能会出现粘包拆包的问题。粘包拆包理解下面我用一个图来带大家理解什么是粘包和拆包解释一下第一次传输没有问题,数据1和数据2没有粘合,也没有拆分第二次传输,... 查看详情