# 5.6 TCP拥塞控制 ## 一、TCP拥塞控制概述 ### 1.1 什么是拥塞 **拥塞(Congestion)**: - 网络中分组过多 - 路由器缓冲区溢出 - 网络性能下降 - 延迟增加、丢包 ### 1.2 拥塞产生的原因 - **发送方发送速率过快** - **网络容量不足** - **流量分布不均** - **突发流量** ### 1.3 拥塞的后果 - **延迟增加** - **丢包增加** - **吞吐量下降** - **重传增加** - **恶性循环** ### 1.4 什么是拥塞控制 **拥塞控制(Congestion Control)**: - 防止网络过载 - 控制发送方的发送速率 - 全局性的控制 ### 1.5 拥塞控制 vs 流量控制 | 特性 | 拥塞控制 | 流量控制 | |-----|---------|---------| | 控制对象 | 发送方和网络 | 发送方和接收方 | | 目的 | 防止网络过载 | 防止接收方溢出 | | 范围 | 全局 | 端到端 | | 信息来源 | 网络状态(丢包、延迟) | 接收方通告(rwnd) | | 机制 | 拥塞窗口(cwnd) | 接收窗口(rwnd) | --- ## 二、拥塞窗口 ### 2.1 什么是拥塞窗口 **拥塞窗口(Congestion Window, cwnd)**: - 发送方根据网络拥塞程度调整的窗口 - 限制发送方的发送速率 - 发送窗口 = min(rwnd, cwnd) ### 2.2 拥塞窗口的调整 **增加**: - 网络不拥塞时,增加cwnd - 提高发送速率 **减小**: - 网络拥塞时,减小cwnd - 降低发送速率 ### 2.3 拥塞窗口的单位 - **MSS(Maximum Segment Size)**:最大报文段长度 - cwnd通常以MSS为单位 --- ## 三、拥塞控制算法 ### 3.1 慢开始(Slow Start) **机制**: - 初始cwnd = 1 MSS - 每收到一个ACK,cwnd增加1 MSS - 每经过一个RTT,cwnd翻倍 - 指数增长 **阈值(ssthresh)**: - 慢开始阈值 - cwnd < ssthresh:慢开始 - cwnd ≥ ssthresh:拥塞避免 **过程**: ``` RTT 0: cwnd = 1 MSS RTT 1: cwnd = 2 MSS RTT 2: cwnd = 4 MSS RTT 3: cwnd = 8 MSS ... ``` ### 3.2 拥塞避免(Congestion Avoidance) **机制**: - cwnd ≥ ssthresh时 - 每收到一个ACK,cwnd增加1/cwnd MSS - 每经过一个RTT,cwnd增加1 MSS - 线性增长 **过程**: ``` RTT n: cwnd = 16 MSS RTT n+1: cwnd = 17 MSS RTT n+2: cwnd = 18 MSS ... ``` ### 3.3 快重传(Fast Retransmit) **机制**: - 收到3个重复ACK,立即重传 - 不等待超时 **过程**: 1. 发送方发送报文段1、2、3、4、5 2. 报文段2丢失 3. 接收方收到1、3、4、5 4. 接收方对1发送重复ACK(ACK=2) 5. 收到3个重复ACK后,发送方重传2 ### 3.4 快恢复(Fast Recovery) **机制**: - 收到3个重复ACK后 - ssthresh = cwnd / 2 - cwnd = ssthresh + 3 MSS - 进入拥塞避免(不是慢开始) **与超时后的区别**: - 超时:ssthresh = cwnd / 2,cwnd = 1,慢开始 - 3个重复ACK:ssthresh = cwnd / 2,cwnd = ssthresh + 3,拥塞避免 --- ## 四、拥塞控制过程 ### 4.1 拥塞控制状态图 ``` 超时或3个重复ACK ┌─────────────────────────┐ │ │ ▼ │ ┌─────────┐ cwnd >= ssthresh ┌─────────────┐ │ 慢开始 │ ──────────────────────> │ 拥塞避免 │ │(cwnd=1) │ <────────────────────── │(线性增长) │ └─────────┘ 超时或3个重复ACK └─────────────┘ │ │ │ │ │ 3个重复ACK │ │ ┌─────────────────────────────────┘ │ │ │ ▼ │ ┌─────────────┐ └─│ 快恢复 │ │(cwnd=ssthresh+3)│ └─────────────┘ ``` ### 4.2 拥塞控制示例 ``` cwnd (MSS) │ 32│ ╱╲ │ ╱ ╲ 16│ ╱╲ ╱ ╲ │ ╱ ╲ ╱ ╲____ │ ╱ ╲ ╱ ╲___ │ ╱ ╲________╱ ╲___ │ ╱ │ ╱ 1│╱ └─────────────────────────────────────────> 时间 慢开始 拥塞避免 超时 慢开始 拥塞避免 ``` **过程**: 1. 初始:cwnd=1,ssthresh=16,慢开始 2. cwnd指数增长到16,进入拥塞避免 3. cwnd线性增长到32,超时 4. ssthresh=16,cwnd=1,慢开始 5. cwnd指数增长到16,进入拥塞避免 ### 4.3 拥塞控制详细过程 **初始状态**: - cwnd = 1 MSS - ssthresh = 65535(或配置值) **慢开始阶段**: - 每收到一个ACK,cwnd += 1 MSS - cwnd指数增长 - 直到cwnd >= ssthresh **拥塞避免阶段**: - 每收到一个ACK,cwnd += 1/cwnd MSS - cwnd线性增长 - 直到超时或收到3个重复ACK **超时处理**: - ssthresh = cwnd / 2 - cwnd = 1 MSS - 进入慢开始 **3个重复ACK处理**: - ssthresh = cwnd / 2 - cwnd = ssthresh + 3 MSS - 进入快恢复(拥塞避免) --- ## 五、TCP拥塞控制版本 ### 5.1 TCP Tahoe **特点**: - 慢开始 + 拥塞避免 - 超时后cwnd=1,慢开始 - 无快重传和快恢复 ### 5.2 TCP Reno **特点**: - 增加快重传和快恢复 - 3个重复ACK后快恢复 - 目前最广泛使用的版本 ### 5.3 TCP NewReno **特点**: - 改进快恢复 - 部分ACK也触发快恢复 - 处理多个报文段丢失 ### 5.4 TCP Vegas **特点**: - 基于延迟的拥塞控制 - 预测拥塞,提前调整 - 根据RTT变化调整cwnd ### 5.5 TCP CUBIC **特点**: - Linux默认 - 使用三次函数调整cwnd - 适合高带宽延迟积网络 - 窗口增长:W(t) = C(t-K)³ + Wmax ### 5.6 TCP BBR **特点**: - Google开发 - 基于带宽和RTT的拥塞控制 - 不依赖丢包 - 高吞吐、低延迟 --- ## 六、拥塞控制的性能 ### 6.1 吞吐量 **理想吞吐量**: ``` 吞吐量 = cwnd / RTT ``` **实际吞吐量**: - 受拥塞控制限制 - 通常小于理想值 ### 6.2 公平性 **TCP公平性**: - 多个TCP连接共享带宽 - 最终每个连接获得相等的带宽 **证明**: - 拥塞控制使窗口动态调整 - 最终达到平衡 ### 6.3 效率 **链路利用率**: - 拥塞控制使链路保持高利用率 - 避免过载 --- ## 七、考研重点 1. **拥塞控制的概念**: - 什么是拥塞 - 拥塞产生的原因和后果 - 什么是拥塞控制 - 拥塞控制 vs 流量控制 2. **拥塞窗口(cwnd)**: - 概念 - 调整 - 与发送窗口的关系 3. **拥塞控制算法**: - 慢开始:机制、指数增长 - 拥塞避免:机制、线性增长 - 快重传:机制 - 快恢复:机制 4. **拥塞控制过程**: - 状态图 - 详细过程 - 超时处理 - 3个重复ACK处理 5. **TCP拥塞控制版本**: - TCP Tahoe - TCP Reno - TCP NewReno - TCP Vegas - TCP CUBIC - TCP BBR 6. **拥塞控制的性能**: - 吞吐量 - 公平性 - 效率 --- *第五章完,进入第六章:应用层*