|
|
|
@ -1,6 +1,6 @@
|
|
|
|
|
## TCP 粘包/拆包
|
|
|
|
|
|
|
|
|
|
熟悉 TCP 编程 的都知道,无论是服务端还是客户端,当我们读取或者发送消息的时候,都需要考虑 TCP 底层 的 粘包/拆包机制。TCP 粘包/拆包问题,在功能测试时往往不会怎么出现,而一旦并发压力上来,或者发送大报文之后,就很容易出现 粘包 / 拆包问题。如果代码没有考虑,往往就会出现解码错位或者错误,导致程序不能正常工作。本篇博文,我们先简单了解 TCP 粘包/拆包 的基础知识,然后来看看 Netty 是如何解决这个问题的。
|
|
|
|
|
熟悉 TCP 编程的都知道,无论是服务端还是客户端,当我们读取或者发送消息的时候,都需要考虑 TCP 底层 的 粘包/拆包机制。TCP 粘包/拆包问题,在功能测试时往往不会怎么出现,而一旦并发压力上来,或者发送大报文之后,就很容易出现 粘包 / 拆包问题。如果代码没有考虑,往往就会出现解码错位或者错误,导致程序不能正常工作。本篇博文,我们先简单了解 TCP 粘包/拆包 的基础知识,然后来看看 Netty 是如何解决这个问题的。
|
|
|
|
|
|
|
|
|
|
### TCP 粘包/拆包问题说明
|
|
|
|
|
|
|
|
|
@ -34,6 +34,11 @@ TCP 是个 “流” 协议,所谓流,就是没有界限的一串数据。TC
|
|
|
|
|
3. 将消息分为消息头和消息体,在消息头中定义一个 长度字段 Len 来标识消息的总长度;
|
|
|
|
|
4. 更复杂的应用层协议。
|
|
|
|
|
|
|
|
|
|
**注意**:从 TCP 流式设计上来看,TCP 粘包其实是一个伪命题。应用层协议需要自己划分消息的边界。**TCP 粘包问题是因为应用层协议开发者的错误设计导致的,他们忽略了 TCP 协议数据传输的核心机制 — 基于字节流,其本身并不存在数据包的概念。** 所有在 TCP 中传输的数据都是以流的形式进行传输,这就需要应用层协议开发者自行设计消息的边界划分规则。所以粘包总的来说还是以下两点:
|
|
|
|
|
|
|
|
|
|
- TCP 协议是面向字节流的协议,它可能会重新分割组合应用层协议的消息到多个数据段中;
|
|
|
|
|
- 应用层协议没有定义消息的边界,导致数据的接收方无法按边界拆分粘连的消息。
|
|
|
|
|
|
|
|
|
|
介绍完了 TCP 粘包/拆包 的基础,下面我们来看看 Netty 是如何使用一系列 “半包解码器” 来解决 TCP 粘包/拆包问题的。
|
|
|
|
|
|
|
|
|
|
## 利用 Netty 的解码器 解决 TCP 粘拆包问题
|
|
|
|
|