Add files via upload

This commit is contained in:
雾島风起時
2025-09-25 03:32:26 +08:00
committed by GitHub
parent 225937cc20
commit c2844cb166
52 changed files with 2073 additions and 0 deletions
+39
View File
@@ -0,0 +1,39 @@
### 什么是 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 字节的数据
接收端应用程序在读取时,可能只读取到一部分数据,导致无法获得一个完整的消息,从而造成**拆包**问题