### 什么是 TCP 粘包/拆包

**什么是 TCP 粘包？**

**TCP 粘包 (Nagle's Algorithm)** 指的是发送方发送的多个数据包，在接收端看起来就像是一个大的数据包。简单来说，就是多个独立的报文被“粘”在一起了

这通常发生在以下情况：

- **发送方发送频率快，数据量小**：当发送方以极快的速度发送多个小数据包时，TCP 协议的 **Nagle 算法**会为了提高网络利用率，将这些小数据包缓存起来，直到积累到一定大小或者收到接收方的 ACK 确认后，才一次性发送出去
- **接收方读取速度慢**：当接收方应用程序从缓冲区读取数据时，如果一次性读取了多个数据包，就会发生粘包

**举个例子：**

假设客户端连续发送了两个数据包，内容分别是 `“Hello”` 和 `“World”`

1. 发送方将 `“Hello”` 发送出去
2. 发送方很快又发送 `“World”`，但此时网络可能拥塞，或 Nagle 算法正在等待
3. TCP 将这两个数据包合并，一次性发送给接收方
4. 接收方在接收缓冲区中收到的是 `“HelloWorld”`

接收端的应用程序在读取时，无法区分出这是两个独立的消息，因此造成了**粘包**问题

**什么是 TCP 拆包？**

**TCP 拆包**与粘包相反，指的是一个完整的数据包被拆分成多个小数据包进行发送

这通常发生在以下情况：

- **发送的数据包过大**：当发送的数据包超过 TCP 缓冲区的最大值时，TCP 会自动将其拆分为多个数据包进行传输
- **网络传输过程中出现拥塞**：网络拥塞时，路由器或防火墙可能会对数据包进行分片（fragmentation）。

**举个例子：**

假设客户端发送了一个 2000 字节的数据包，但网络 MTU（最大传输单元）是 1500 字节

1. 发送方将 2000 字节的数据包拆分为两个数据包：第一个 1500 字节，第二个 500 字节
2. 接收方在接收缓冲区中先收到 1500 字节的数据，然后又收到 500 字节的数据

接收端应用程序在读取时，可能只读取到一部分数据，导致无法获得一个完整的消息，从而造成**拆包**问题