TCP拥塞控制
背景
(课件原文):
TCP采用基于滑动窗口的方法进行拥塞控制,属于闭环控制方法。
TCP发送方维持一个拥塞窗口 cwnd(Congestion Window),其大小取决于网络的拥塞程度,并且是动态变化的。
真正的发送窗口:
判断拥塞的方法(隐式反馈)
(课件原文):
因传输出差错而丢弃分组的概率很小(远小于1%)。因此,发送方在超时重传计时器启动时,就判断网络出现了拥塞。
另一信号:收到3个重复ACK(快重传触发条件)。
四种拥塞控制算法(RFC 5681)
1. 慢开始(Slow Start)
(课件原文):
目的:探测网络的负载能力或拥塞程度。
算法:由小到大逐渐增大注入到网络中的数据字节。
cwnd增大规则(课件原文):
拥塞窗口cwnd每次的增加量 = min(N, SMSS) 其中N是原先未被确认的、但现在被刚收到的确认报文段所确认的字节数。
简化理解:每收到一个ACK,cwnd += 1 MSS → 指数增长(每RTT翻倍)
初始:cwnd = 1 MSS(或约10 MSS,RFC 6928)
2. 慢开始门限 ssthresh
(课件原文):
防止拥塞窗口cwnd增长过大引起网络拥塞。
- 当 cwnd < ssthresh:使用慢开始算法(指数增长)
- 当 cwnd > ssthresh:停止慢开始,改用拥塞避免算法
- 当 cwnd = ssthresh:两者均可
3. 拥塞避免(Congestion Avoidance)
(课件原文):
目的:让拥塞窗口cwnd缓慢地增大,避免出现拥塞。
每经过一个往返时间RTT(不管在此期间收到了多少确认),发送方的拥塞窗口 cwnd = cwnd + 1。 具有加法增大 AI(Additive Increase)特点:使拥塞窗口按线性规律缓慢增长。
超时拥塞处理(课件原文):
无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(重传定时器超时): $\(\text{ssthresh} = \max(\text{cwnd}/2, 2)\)$ cwnd 重置为 1,重新执行慢开始算法。
4. 快重传(Fast Retransmit)
触发条件:收到3个连续重复ACK(说明某报文段丢失,但网络未完全拥塞)
行动:立即重传该报文段,不等超时计时器。
5. 快恢复(Fast Recovery)
快重传后配套使用: - \(\text{ssthresh} = \text{cwnd}/2\) - \(\text{cwnd} = \text{ssthresh}\)(不归1!) - 直接进入拥塞避免阶段(线性增长)
完整状态机示意
cwnd
32 | *
16 | * | ssthresh=16
8 | * |
4 | * | * ← 快恢复起点
2 | * | *
1 |* |*
+──────────────── RTT
慢开始 拥塞避免 快恢复后
(超时:归1)
AIMD特性
- 加法增大(AI):拥塞避免阶段,每RTT +1
- 乘法减小(MD):检测到拥塞,ssthresh减半
AIMD是TCP公平性的数学基础:多条TCP连接共享链路时,最终收敛到公平分配带宽。
参见
- [[05-运输层]] — TCP完整介绍
- [[TCP三次握手]] — 连接建立
- [[05-运输层|TCP流量控制]] — rwnd机制(与cwnd协作)
- [[时延模型]] — RTT的测量