-
窗口机制
通过调节窗口的大小实现对发送方数据速率的调整。检测整个网络的情况,当整个网络很拥堵,即使接收端的缓存足够大,发送端也要控制发送速度。这里引入了拥塞窗口,当网络很拥堵,拥塞窗口就要小一点。
真正的发送窗口值:
-
窗口调整的基本策略
AIMD:加性增加,乘性减小。
网络未发生拥塞时,逐渐“加性”增大窗口大小,当网络拥塞时“乘性”快速减小窗口大小。
-
TCP拥塞控制算法:
包括了慢开始、拥塞避免、快速重传和快速恢复4部分。
-
慢开始
目的:探测网络的负载能力或拥塞程度。
算法:由小到大逐渐增大注入到网络中的数据字节,即:由小到大逐渐增大拥塞窗口数值。
-
拥塞避免
目的:让拥塞窗口cwnd缓慢地增大,避免出现拥塞。
拥塞窗口cwnd增大:每经过一个往返时间RTT(不管在此期间收到了多少确认),发送方的拥塞窗口cwnd=cwnd+1。
当网络出现拥塞时:
无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(重传定时器超时):
-
ssthresh = max (cwnd/2,2)
-
cwnd = 1
-
执行慢开始算法
-
-
快重传
目的:让发送方尽早知道发生了个别报文段的丢失。
发送方只要连续收到三个重复的确认,就立即进行重传(即“快重传”),这样就不会出现超时。
快重传算法要求接收方立即发送确认,即使收到了失序的报文段,也要立即发出对已收到的报文段的重复确认。
-
快恢复
当发送端收到连续三个重复的确认时,不执行慢开始算法,而是执行快恢复算法:
-
慢开始门限ssthresh=当前拥塞窗口cwnd/2;
-
乘法减小拥塞窗口。
新拥塞窗口cwnd=慢开始门限ssthresh;
-
执行拥塞避免算法,使拥塞窗口缓慢地线性增大。
-
-
-
拥塞控制算法的实现举例:
- 当TCP连接进行初始化时,将拥塞窗口值置为1(窗口单位不使用字节而使用报文段)。慢开始门限的初始值设置为16个报文段,即ssthresh=16。
- 开始执行慢开始算法时,拥塞窗口cwnd=1,发送第一个报文段。
- 发送方每收到一个对新报文段的确认ACK,就把拥塞窗口值加1(每收到一个就加1,每收到两个就加2,以此类推,实际上拥塞窗口值变为原来的2倍),因此拥塞窗口cwnd随着往返时间RTT按指数规律增长。
- ①当拥塞窗口cwnd增长到慢开始门限值ssthresh时,改为执行拥塞避免算法,拥塞窗口按线性规律增长。
- ②当拥塞窗口cwnd=24时,网络出现了超时,发送方判断为网络拥塞。调整门限值ssthresh=cwnd/2=12,同时设置拥塞窗口cwnd=1,进入慢开始阶段。
- ③按照慢开始算法,发送方每收到一个对新报文段的确认ACK,就把拥塞窗口值加1。当拥塞窗口值cwnd=ssthresh=12时,改为执行拥塞避免算法,拥塞窗口按线性规律增大。
- ④当拥塞窗口cwnd=16时,发送方连续收到3个对同一个报文段的重复确认(记为3-ACK)。发送方改为执行快重传和快恢复算法。
- ⑤执行快重传和快恢复算法:发送方调整门限值ssthresh=cwnd/2=8,设置拥塞窗口cwnd=ssthresh=8,开始执行拥塞避免算法。
-
TCP拥塞控制流程图
参考资料:《计算机网络(第8版)》—— 谢希仁。