这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战
4. TCP流量控制
一般来说,我们总是希望数据传输得更快一些,但如果发送方把数据发送得过快,接受方就可能来不及接收,这样就会造成数据的丢失。
流量控制就是让发送方的发送速率不要太快,既能让接收方来得及接收,也不要使网络发送拥塞。利用滑动窗口机制可以很方便地在TCP连接上实现流量控制。
流量控制举例
5. TCP拥塞控制
在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏——产生拥塞。
出现资源拥塞的条件:
对资源需求的总和 > 可用资源
若网络中有许多资源同时产生拥塞,网络的性能就要明显变坏,整个网络的吞吐量将随输入负荷的增大而下降。
1)、拥塞控制和流量控制的关系
拥塞控制所能做的都是一个前提,就是网络能够承受现有的网络负荷。
拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。
流量控制往往指在给定的发送端和接收端之间的点对点通信量的控制。
流量控制所能做的就是抑制发送端发送数据的速率,以便使接收端能来得及接收。
2)、拥塞控制所起到的作用
3) 、慢开始和拥塞避免
发送方维持一个叫做拥塞窗口cwnd(congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态的变化。发送方让自己的发送窗口等于拥塞窗口。如在考虑到接收方的接收能力,则发送窗口还可能小于拥塞窗口。
发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就在增大一些,以便把更多的分组发送出去。但是只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。
慢开始算法的原理
在主机刚刚开始发送报文段时可先设置拥塞窗口cwnd=1,即设置为一个最大报文段MSS的数值。
在每收到一个对新的报文段的确认后,将拥塞窗口加1,即增加一个MSS的数值。
用这样的方法逐步增大发送端的拥塞窗口cwnd,可以使分组注入到网络的速率更加合理。
传输轮次
使用慢开始算法后,没经过一个传输伦次,拥塞窗口cwnd就加倍。
一个传输轮次所经历的时间其实就是往返时间RTT。
传输轮次更加强调:把拥塞窗口cwnd所允许发送的报文段都连续发送出去,并受到了对方已发送的最后一个字节的确认。
例如。拥塞窗口cwnd=4,这时的往返时间RTT就是发送方连续发送4个报文段,并受到4个报文段的确认,总共经历的时间。
设置慢开始门限状态变量ssthresh
慢开始门限ssthresh的用法如下:
当cwnd < ssthresh时,使用慢开始算法。
当cwnd > ssthresh时,停止使用慢开始算法而改用拥塞避免算法。
当cwnd = ssthresh时,即可以使用慢开始算法,也可以使用拥塞避免算法。
拥塞避免算法的思路是让拥塞窗口cwnd缓慢的增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍,使拥塞窗口cwnd按线性规律缓慢增加。
网络拥塞时
无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有按时收到确认),就要把慢开始门限ssthresh设置为现有拥塞时的发送窗口值的一半(但不能小于2)。
然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。
这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发送拥塞的路由器有足够时间吧队列中积压的分组处理完毕。
慢开始和拥塞避免算法举例
当TCP连接进行初始化时,将拥塞窗口置为1。图中的窗口单位不使用字节而使用报文段。
慢开始门限的初始值设置为16个报文段,即ssthresh=16。
发送端的发送窗口不能超过拥塞窗口cwnd的接收端窗口rwnd中的最小值。我们假设接收端窗口足够大,因此现在发送窗口的数值等于拥塞窗口的数值。
在执行慢开始算法时,拥塞窗口cwnd的初始值为1,发送第一个报文段M0。
发送端每收到一个确认,就把cwnd加1,于是发送端可以接着发送M1和M2两个报文段。
接收端功发回两个确认。发送端每收到一个对新报文的确认,就把发送端的cwnd加1.现在cwnd从2增大到4,并可接着发送后面的4个报文。
发送端每收到一个对新报文段的确认,就把发送端的拥塞窗口加1,因此拥塞窗口cwnd随着传输轮次按指数规律增长。
当拥塞窗口cwnd增长到慢开始门限ssthresh时(即当cwnd=16时),就改为执行拥塞避免算法,拥塞窗口按线性规律增长。
假定拥塞窗口的数值增加到24时,网络出现超时,表明网络拥塞了。
更新后的ssthresh值变为12(即发送窗口数值24的一半),拥塞窗口在重新设置为1,并执行慢开始算法。
当cwnd=12时就改为执行拥塞避免算法,拥塞窗口按线性规律增长,没经过一个往返时延就增加一个MSS的大小。
乘法减小
乘法减小是指无论在慢开始阶段还是拥塞避免阶段,只要出现一次超时(即出现一次网络拥塞),就把慢开始门限值ssthresh设置为当前的拥塞窗口值乘以0.5。
当网络频繁出现拥塞时,ssthresh值就下降的很快,以达达减少注入到网络中的分组数。
加法增大
加法增大是指在执行拥塞避免算法后,在收到对所有的报文段的确认后(即经过一个往返时间),就把拥塞窗口cwnd增加一个MSS大小,使得拥塞窗口缓慢增大,以防止网络过早出现拥塞。
4)、快重传和快恢复
快重传算法
快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认。这样做可以让发送方及早知道有报文没有到达接收方。
发送方只要一联收到三个重复确认就应当立即重传对方尚未收到的报文段。
不难看出,快重传并非取消重传计时器,而是在某些情况下可更早的重传丢失的报文段。
快恢复算法
当发送端收到连续三个重复的确认时,就执行“乘法减小”算法,把慢开始门限ssthresh减半。但接下来不执行慢开始算法。
由于发送方现在认为网络很可能没有发送拥塞,因此现在执行慢开始算法,即拥塞窗口cwnd现在不设置为1,而是设置为慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。
发送窗口的上限值
发送方的发送窗口的上限值应当取为接收方窗口rwnd和拥塞窗口cwnd这两个变量中较小的一个,即应按以下公式确定:
发送窗口的上限值 = Min[rwnd, cwnd]
当rwnd < cwnd时,是接收方的接收能力限制发送窗口的最大值。
当rwnd > cwnd时,则是网络的拥塞限制发送窗口的最大值。
RED将路由器的到达队列划分为三个区域
丢弃率p与THmin和THmax的关系
当Lav < THmin时,丢弃率p=0。
当Lav > THmax时,丢弃率p=1。
当THmin < Lav < THmax时,丢弃率 0 < p < 1。
瞬时队列长度和平均队列长度的区别