通过本篇文章,你可以了解到
- 什么是粘包与半包
- 解决粘包与半包的基本思路与策略
- Netty 是如何解决粘包与半包问题(解码器)
什么是粘包与半包
TCP是一个流式传输协议,其数据是没有边界的,对于发送方来讲就是讲一个一个数据发送到接收端,接收端读取io缓冲区,根据不同的解析协议来解析实际的数据
粘包
见下图,比如下图的一个tcp包中的内容就是我们要发送的一个数据。我们一共发送了两个数据,但是接收端解析处理之后把两个数据合并了。这就是粘包。

####### 粘包的本质原因
- 发送方写入的数据 < 套接字缓冲区大小
- 接收方读取套接字缓存区不够及时
半包
半包简单讲,就是我们发送了一个AB,但是接收读取的时候,只拿到了一部分数据(就是一半)。

半包
- 发送方写入数据 > 套接字缓冲区大小
- 发送的数据大于协议的MTU(Maximum Tranmission Unit) 最大传输单元
解决粘包与半包的基本思路有策略
思路其实从分析本质原因的时候,就可以留意到实际的问题本质是:接受端在解析数据的时候如何识别一条数据的边界。
实际的解决策略见下图[图片来源于见参考]

Netty 是如何解决粘包与半包问题(解码器)
Netty 根据上面的封装成帧的方案提供了三种实现方式
- FixedLengthFrameDecoder(固定长度)
- DelimiterBasedFrameDecoder(分隔符)
- LengthFieldBasedFrameDecoder(固定长度存储内容的长度信息)
- 因为其比较复杂,响应的Netty有其对应的Decoder(解码器)
参考
- 《Netty实战》
- Netty源码剖析与实战