假定:
1、数据是单方向传递,另一个窗口只发送确认;
2、接收方的缓存足够大,因此发送方的大小的大小由网络的拥塞程度来决定。
拥塞窗口cwnd(congestion window)的状态变量:取决于网络的拥塞程度,并且动态地在变化
发送方:拥塞窗口cwnd:发送方维护的一个状态变量,根据网络拥塞程度动态变化
swnd = min(cwnd, rwnd)
标志:重传
即未在规定时间内接收ACK应答报文,标志拥塞发生
图示
实现算法(实现策略)
ssthresh:慢启动门限slow start threshold
用法如下:
当cwnd
当cwnd=ssthresh时,慢开始与拥塞避免算法任意
慢启动:先探测一下网络的拥塞程度
拥塞避免
拥塞发生:把慢开始门限ssthresh设置为出现拥塞时的发送窗口大小的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。
目的:迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕
快速恢复
(1)拥塞窗口cwnd初始化为1个报文段,慢开始门限初始值为16
(2)执行慢开始算法,指数规律增长到第4轮,即cwnd=16=ssthresh,改为执行拥塞避免算法,拥塞窗口按线性规律增长
(3)假定cwnd=24时,网络出现超时(拥塞),则更新后的ssthresh=12,cwnd重新设置为1,并执行慢开始算法。当cwnd=12=ssthresh时,改为执行拥塞避免算法
关于 乘法减小(Multiplicative Decrease)和加法增大(Additive Increase):
“乘法减小”指的是无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞,就把慢开始门限ssthresh设置为出现拥塞时的发送窗口大小的一半,并执行慢开始算法,所以当网络频繁出现拥塞时,ssthresh下降的很快,以大大减少注入到网络中的分组数。“加法增大”是指执行拥塞避免算法后,使拥塞窗口缓慢增大,以防止过早出现拥塞。常合起来成为AIMD算法。
注意:“拥塞避免”并非完全能够避免了阻塞,而是使网络比较不容易出现拥塞。
往返时间RTT:
初始化 init_ssthresh、init_cwnd
- 慢启动 cwnd < ssthresh
每收到一个ACK,cwnd = cwnd + 1 即 cwnd(new) = cwnd * 2^n,即指数增长
- 拥塞避免 cwnd > ssthresh
每收到一个ACK,cwnd = cwnd + 1/cwnd 即 cwnd(new) = cwnd + 1,即线性增长
- 拥塞发生
a.超时重传 —— 慢启动
ssthreth(new) = cwnd / 2(但不能小于2)
cwnd(new) = init_cwnd
b.快速重传 —— 快速恢复
cwnd(new) = cwnd / 2
ssthreth(new) = cwnd
- 快速恢复 —— 拥塞避免
cwnd(new) = ssthreth + 3 (此时已进行拥塞发生快速重传算法即ssthreth=old_cwnd / 2)
快重传:接收失序报文段后立即发出重复确认(及早告知,提高网络吞吐量约20%)而不要等到自己发送数据时捎带确认。连续接收到3个重复确认后立即重传而不等待重传计时器到期。
如接收M4后立即重复确认,接收到应答M6后立即重传
快恢复:
注意:在采用快恢复算法时,慢开始算法只是在TCP连接建立时和网络出现超时时才使用