### 什么是 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 字节的数据 接收端应用程序在读取时,可能只读取到一部分数据,导致无法获得一个完整的消息,从而造成**拆包**问题