流量控制和拥塞控制的原理和区别
Posted 龙崎流河
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了流量控制和拥塞控制的原理和区别相关的知识,希望对你有一定的参考价值。
先介绍下重传机制和滑动窗口
超时重传
重传机制的其中一个方式,就是发送数据时,设定一个定时器,当超过指定的时间后,没有收到对方的ACK确认应答报文就会重发该数据。
TCP会在以下两种情况发送超时重传:
- 数据包丢失
- 确认应答丢失
RTT(往返时延):RTT是数据发送时刻到接收到确认的时刻的差值。
超时重传时间是以RTO表示,在重传情况下超过时间RTO会有哪些情况发生?
如果RTO较大,重发慢效率低。
如果RTO较小,导致可能没有丢就重发,会增加网络堵塞导致更多超时。
RTO值非常重要,超时重传时间RTO的值应该略大于报文往返RTT的值。
快速重传
不以时间驱动,以数据驱动重传。
快速重传的工作方式是当收到三个相同的ACK报文时会在定时器时期之前重传丢失的报文段。
快速重传面对的问题是重传一个还是重传所有,为了解决不知道该重传哪些报文,于是就有了SACK方法。
SACK方法
选择性确认。
在TCP头部字段里加一个SACK,可以将已收到的数据的信息发生给发送方,这样发送方就可以知道哪些数据收到了,哪些数据没收到,就可以只重传丢失的数据。
Duplicate SACK
使用SACK告诉发送方有哪些数据被重复接受了。
接收方发现数据是重复收到的,于是返回一个SACK=3000-3500,告诉发送方数据已被接收到了,因为ACK都到4000了说明4000以前都被接收了。
好处:
可以让「发送方」知道,是发出去的包丢了,还是接收方回应的 ACK 包丢了;
可以知道是不是「发送方」的数据包被网络延迟了;
可以知道网络中是不是把「发送方」的数据包给复制了;
滑动窗口
下图传输的缺点:数据包的往返时间越长,通信的效率越低。
为了解决这个问题,TCP引入了窗口这个概念。窗口实际上就是操作系统开辟的一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区保留已发送的数据,如果按期收到确认应答,此时数据就可以在缓存区清楚。
下图假设窗口大小为3个TCP段,那么发送方就可以连续发送3个TCP段,并且中途若有ACK丢失,可以通过下一个确认应答进行确认。
图中的 ACK 600 确认应答报文丢失,也没关系,因为可以通过下一个确认应答进行确认,只要发送方收到了 ACK 700 确认应答,就意味着 700 之前的所有数据「接收方」都收到了。这个模式就叫累计确认或者累计应答。
TCP中有个字段叫Window,也就是窗口大小。
这个字段就是接收端告诉发送端自己还有多少缓冲区可以接收数据,于是发送端就可以根据接受端的处理能力发送数据,而不会导致接收端处理不过来。
发送方缓存窗口
可用窗口耗尽,在未收到ACK确认前无法继续发送数据了。
下图,当收到之前发送的数据的ACK确认应答后,如果发送窗口的大小没有变化,则滑动窗口右移5个字节,因为有5个字节的数据被应答确认,接下来52到56字节又变成了可用窗口,后续也就可以发送52到56字节的数据了
SND.WND:表示发送窗口大小,由接收方指定
SND.UNA:是一个绝对指针,指向已发送但未确认的第一个字节的序列号
SND.NXT:也是一个绝对指针,指向未发送但总大小在接收方处理范围内的第一个字节
接收方缓存窗口
接收窗口和发送窗口大小相等吗?
约等于,不是一成不变的。当接收方的应用进程读取数据的速度非常快的话,接收窗口就会很快的空缺出来,通过TCP报文中的Windows字段告诉发送方新的接收窗口大小。
流量控制
发送方不能无脑发数据给接收方,考虑接收方处理能力。
TCP提供一种机制可以让发送方根据接收方的实际接收能力控制发送的数据量,这就是所谓的流量控制。
利用滑动窗口机制可以很方便在TCP连接上实现对发送方的流量控制。
建立TCP连接时B告诉A,我的接收窗口是400,主机A将自己的窗口也设置为400
主机A调整自己的发送窗口为300
发送窗口内序号201-300这100个字节数据的重传计时器超时了,主机A将它们重新封装成一个TCP报文段发送出去
主机A还可以发送100字节
主机B对收到601号以前的数据进行累计确认,并将窗口字段的值调整为0,对主机A进行流控
目前主机A不能再发送一般的TCP报文段了
主机A将最后的发送缓存中序号501-600的字节数据全部删除了
假设过一段时间,主机B的接收缓存又有一些存储空间。
TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器,如果持续计时器超时,就发送一个零窗口探测报文,仅仅携带一字节的数据,对方在确认这个探测报文段时,给出现在的接收窗口值,如果接受窗口仍然是0,那么收到这个报文段的一方就重新启动持续计时器,如果接受窗口不是0,死锁的局面就打破了。
零窗口探测报文丢失怎么办,它也有持续计时器,超时也会被重传。
小结
流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。
利用滑动窗口机制可以很方便地在TCP连接上实现对发送方地流量控制。
- TCP接收方利用自己的接收窗口大小来限制发送方发送窗口的大小。
- TCP发送方收到接收方的零窗口通知后应启动持续计时器。持续计时器超时后就向接收方发送零窗口探测报文。
拥塞控制
在某段时间,若对网络中某一资源的需求超过该资源所能提供的可用部分,网络性能就要变坏。
待更新
TCP中的流量控制和拥塞控制
TCP中的流量控制和拥塞控制
流量控制
什么是流量控制
如果发送者发送数据过快,接收者来不及接收,那么就会出现分组丢失,为了避免分组丢失,控制发送者的发送速度,使得接收者来得及接收,这就是流量控制。
流量控制的目的是:防止分组丢失,是构成TCP可靠性的一方面。
如何实现流量控制
由滑动窗口协议(连续ARQ协议)实现,滑动窗口协议即保证了分组无差错,有序接收,也实现了流量控制。主要的方式就是接收方返回的ACK会包含自己的接受窗口大小,并利用大小来控制发送方的数据发送。
拥塞控制
什么是拥塞控制
拥塞控制是作用于网络的,它是防止过多的数据注入网络,避免出现网络负载过大的情况,常见的方法就是
- 慢开始,避免拥塞
- 快重传、快恢复
拥塞控制算法
我们首先添加几个限定条件
- 数据是单方向传递,另一个窗口只发送确认
- 接收方的缓存足够大,因此发送方的大小由网络的拥塞程度来决定
慢开始算法
发送方维持一个叫做拥塞窗口cwnd(congestion window)的状态变量,拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化,发送方让自己的发送窗口等于拥塞窗口,另外考虑到接收方的接受能力,发送窗口可能小于拥塞窗口。
慢开始算法的思路就是:不要一开始就发送大量的数据,先测探一下网络的拥塞程度,也就是说从小到大主键增加拥塞窗口的大小。
这里用报文段的个数作为拥塞窗口的大小举例说明慢开始算法,实际的拥塞窗口大小是以字节为单位的。如下图所示:
发送方没收到一个确认窗口,就把窗口cwnd加1
从上图可以看到,一个传输轮次所经历的时间其实就是往返时间RTT,而且每经过一个传输轮次,拥塞窗口cwnd就加倍
为了防止cwnd增长过大引起网络拥塞,还需设置一个慢开始门限ssthresh状态变量,ssthresh的用法如下:
- 当 cwnd > ssthresh时:使用慢开始算法
- 当cwnd = ssthresh时:采用 慢开始或拥塞避免中的任意一种
- 当 cwnd > ssthresh时:采用拥塞避免算法
拥塞避免算法
拥塞避免算法让拥塞窗口缓慢增长,即没经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍,这样能够让拥塞窗口按线性规律增长。
无论是在慢开始阶段,还是在拥塞控制阶段,只要发送方判断网络出现拥塞,就把慢开始门限 ssthressh设置为当前出现拥塞时发送窗口大小的一半(不能小于2),然后将拥塞窗口cwnd设置为1,执行慢开始算法。
这样做的目的是迅速减少主机发送到网络中的分组数,使得发送拥塞的路由器有足够时间把队列中积压的分组处理完毕。
整个拥塞控制的流程图如下图所示:
- 拥塞窗口cwnd初始化为1个报文段,慢开始门限初始值为16
- 执行慢开始算法,指数规律增长到第4轮,即cwnd=16=ssthresh,改为执行拥塞避免算法,拥塞窗口按线性规律增长
- 假定cwnd=24时,网络出现超时(拥塞),则更新后的ssthresh=12,cwnd重新设置为1,并执行慢开始算法。当cwnd=12=ssthresh时,改为执行拥塞避免算法
乘法减小和加法增大
- 乘法减小”指的是无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞,就把慢开始门限ssthresh设置为出现拥塞时的发送窗口大小的一半,并执行慢开始算法,所以当网络频繁出现拥塞时,ssthresh下降的很快,以大大减少注入到网络中的分组数。
- 加法增大”是指执行拥塞避免算法后,使拥塞窗口缓慢增大,以防止过早出现拥塞。常合起来成为AIMD算法。
快重传算法
快重传要求接收方在收到一个失序的报文段后,就立即发出重复确定(为的是使发送方及早知道有报文段没有达到对方,可提高网络吞吐量约20%)而不要等到自己发送数据时捎带确定。快重传算法规定,发送方只要一连收到三个重复确定就应当立即重传对方尚为收到的报文段,而不必继续等待设置的重传计时器时间到期,如下所示
快恢复
快重传配合使用的还有快恢复算法,有以下两点要求
- 当发送方连续收到三个重复确认时,就执行乘法减小算法,把ssthresh门限减半(为了预防发送拥塞),但是接下来并不执行慢开始算法
- 考虑到如果网络出现拥塞的话,就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞,所以此时不执行慢开始算法,而是将cwnd设置为ssthresh减半后的值,然后执行拥塞避免算法,使cwnd缓慢增大,如下图所示:TCP Reno版本是目前使用最广泛的版本。
在采用快恢复算法时,慢开始算法只是在TCP连接建立时和网络出现超时时才使用
来源
以上是关于流量控制和拥塞控制的原理和区别的主要内容,如果未能解决你的问题,请参考以下文章
深入浅出之 TCP协议(三次握手与四次挥手超时重发流量控制拥塞控制与UDP区别)