TCP拥塞控制算法通过动态调整发送窗口大小来平衡网络负载与传输效率,其核心机制包括**慢启动(Slow Start)**、**拥塞避免(Congestion Avoidance)**、**快速重传(Fast Retransmit)**和**快速恢复(Fast Recovery)**。
---
### 1. **慢启动(Slow Start)**
**目标**:快速探测可用带宽,避免初次连接时突然淹没网络。
**规则**:
- 初始拥塞窗口(`cwnd`)为1 MSS(最大报文段大小)。
- 每收到一个ACK,`cwnd`增加1 MSS(指数增长)。
- 当`cwnd`达到慢启动阈值(`ssthresh`,通常初始为较高值,如65535字节)时,进入拥塞避免阶段。
**示例**:
- 初始状态:`cwnd=1 MSS`,`ssthresh=8 MSS`。
- **第1个RTT**:发送1个报文,收到ACK后`cwnd=2`。
- **第2个RTT**:发送2个报文,收到2个ACK后`cwnd=4`。
- **第3个RTT**:发送4个报文,收到4个ACK后`cwnd=8`(达到`ssthresh`)。
- 此时触发**拥塞避免**,转为线性增长。
---
### 2. **拥塞避免(Congestion Avoidance)**
**目标**:谨慎增加窗口,避免触发拥塞。
**规则**:
- 每收到一个ACK,`cwnd`增加`1/cwnd` MSS(每个RTT增加1 MSS)。
- 若检测到丢包(超时或重复ACK),调整阈值并可能重启慢启动。
**示例**:
- 当前状态:`cwnd=8 MSS`,`sshtresh=8 MSS`。
- **第4个RTT**:发送8个报文,收到8个ACK后`cwnd=9`(每个ACK增加1/8,共+1)。
- **第5个RTT**:发送9个报文,收到9个ACK后`cwnd=10`。
- 持续线性增长,直到发生丢包。
---
### 3. **快速重传(Fast Retransmit)**
**触发条件**:收到3次重复ACK(表明报文丢失,但后续报文可能已到达)。
**动作**:立即重传丢失报文,无需等待超时。
**示例**:
- 发送方发送报文`seq=1~20`,但`seq=10`丢失。
- 接收方收到`seq=11`后,持续回复`ACK=10`(重复ACK)。
- 发送方收到第3个`ACK=10`时,立即重传`seq=10`,并进入**快速恢复**。
---
### 4. **快速恢复(Fast Recovery)**
**目标**:避免因单个丢包导致窗口骤降,维持吞吐量。
**规则**:
- 将`ssthresh`设为当前`cwnd`的一半,`cwnd = ssthresh + 3 MSS`(补偿已确认的3个重复ACK)。
- 每收到一个重复ACK,`cwnd`增加1 MSS。
- 收到新数据的ACK后,退出快速恢复,进入**拥塞避免**。
**示例**:
- 触发快速重传时,原`cwnd=20`,则:
- `ssthresh = 20/2 = 10`,`cwnd = 10 + 3 = 13`。
- 重传`seq=10`后,若收到新ACK(如`ACK=21`),则重置`cwnd = ssthresh=10`,进入拥塞避免。
---
### 5. **超时重传(Timeout Retransmit)**
**触发条件**:未收到ACK且超时(表明严重拥塞)。
**动作**:
- 将`ssthresh`设为当前`cwnd`的一半,`cwnd`重置为1 MSS。
- **重新进入慢启动阶段**。
**示例**:
- 若`cwnd=16 MSS`时发生超时:
- `ssthresh = 16/2 = 8`,`cwnd=1`。
- 重新从慢启动开始,直到`cwnd=8`时切换至拥塞避免。
---
### **综合场景示例**
1. **初始连接**:
- `cwnd=1`,`ssthresh=8`。慢启动阶段指数增长至`cwnd=8`。
2. **拥塞避免**:
- 线性增长至`cwnd=16`时,发生报文丢失。
3. **快速重传与恢复**:
- 收到3个重复ACK,重传丢失包,`ssthresh=8`,`cwnd=11`,进入拥塞避免。
4. **超时事件**:
- 若再次丢包且未收到足够重复ACK,超时后重置`cwnd=1`,重启慢启动。
---
### **关键区别**
- **慢启动 vs 拥塞避免**:指数增长 vs 线性增长。
- **快速重传 vs 超时重传**:
- 快速重传:网络仍通畅,仅单个丢包,快速恢复维持高吞吐。
- 超时重传:网络严重拥塞,需彻底降速。
---
通过上述机制,TCP在避免网络崩溃的同时,最大化利用带宽。现代TCP变种(如CUBIC、BBR)进一步优化了窗口调整策略,但核心思想仍基于这些经典算法。
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码`
- 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传