TCP流量控制与拥塞控制

1》流量控制

1>流量控制:通过滑动窗口实现的(以字节为单位),管理两端的流量,以免会产生发送过快导致接收端溢出,或者因收端处理太快而浪费时间的状态。

2>滑动窗口:TCP采用大小可变的滑动窗口进行流量控制,窗口大小的单位是字节。发送窗口在连接建立时双方商定,但在通信的过程中,发送窗口大小取决于接收端窗口大小和拥塞窗口大小(可增大或减少)

3>滑动窗口的作用:提供TCP可靠性;提供TCP的流控制特性,同时还体现TCP面向字节流的设计思想

4>窗口:连接建立时,各端分配一块缓冲区用来储存接受的数据,并将缓冲区的尺寸发送给另一端,接受方发送的确认信息中包含了自己的缓冲区尺寸,剩余缓冲区空间的数量叫做窗口

5>窗口有三种动作:展开(右边向右),合拢(左边向右),收缩(右边向左)这三种状态受到收端的控制

展开:表示允许缓存发送更多的字节

合拢:表示已经收到相应字节的确认了

收缩(不希望出现的,某些实现是禁止的):表示本来可以发送的,现在不能发送,但是如果收缩的是那些已经发出的,就会有问题,避免收端会等待到缓存中有更多缓存空间才进行通信

6>窗口:(发送窗口大小取决于接收端窗口大小和拥塞窗口大小)

接收端窗口rwnd:接收端缓冲区大小,接收端将此窗口值放在TCP报文的首部中的窗口字段,传送给发送端

拥塞窗口cwnd:发送端缓冲区大小,发送方为一个动态变化的窗口叫做拥塞窗口,拥塞窗口的大小取决于网络的拥塞程度,发送方让自己的发送窗口=拥塞窗口的,但是发送窗口不是一直等于拥塞窗口的,在网络情况好的时候,拥塞窗口不断增加,发送方的窗口自然也不断增加,但是接受方的接受能力有限,在发送方的窗口达到某个大小时就不在发生变化

发送窗口swnd:发送窗口上限值=Min[rwnd,cwnd],发送方窗口内的序号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧

当rwnd<cwnd时,是接收端的接受能力限制发送窗口的最大值

当cwnd<rwnd时,则是网络的拥塞限制发送窗口的最大值

特殊情况:如果B(接收方)在向A(发送方)发送了零窗口报文段后不久,B的接收缓存又有了一些存储空间,于是B向A发送一个rwnd=400的报文段,然而这个报文段在传送过程中丢失,A就一直等待B发送非零窗口的通知,而B一直等待A发送数据,如果没有任何措施的话,这死锁的局面会一直延续下去

解决方法:TCP为每一个连接设有一个持续计时器只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器,若持续计时器设置的时间到期,就发送一个零窗口控测报文段(携1字节的数据),对方在收到探测报文段后,再对该报文段的确认报文给出现在的窗口值,如果窗口值任为零,则收到这个报文段的一方就重新设置持续计时器,如果窗口不为零,那么死锁的僵局就被打破

7>滑动窗口机制:

滑动窗口协议的基本原理就是在任意时刻,发送方都维持一个连续的允许发送的帧的序号,称为发送窗口

同时接受方也维持一个连续的允许接受的帧的序号,称为接收窗口

发送窗口和接受窗口的序号的上下界不一定要一样,甚至大小也可以不同

发送方窗口内的序号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧

举例(假设发送窗口尺寸为2,接受窗口尺寸为1)

TCP流量控制与拥塞控制

分析:

1)初始状态,发送方没有帧发出,发送窗口前后沿相重合,接收方0号窗口打开,等待接受0号帧

2)发送方打开0号窗口,表示已发出0帧但尚未确认返回信息,此时接受窗口状态不变

3)发送方打开0,1号窗口,表示0,1号帧均在等待确认之列,至此发送方打开窗口数已达到限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧。接收窗口此时状态未变

4)接收方收到0帧,0号窗口关闭,1号窗口打开,表示准备接受1号帧,此时发送窗口不变

5)发送方收到接收方发来的0帧确认返回信息,关闭0号窗口,表示从重发表中删除0号帧,此时接受窗口状态仍不变

6)发送发继续发送2号帧,2号窗口打开,表示2号帧也纳入待确认之列,至此发送方打开的窗口又已达到规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧,此时接受窗口状态仍不变

7)接受方已经收到1号帧,1号窗口关闭,2号窗口打开,表示准备接受2号帧,此时发送窗口状态不变

8)发送方收到接收方发来的1号帧确认信息,关闭1号帧,此时接受窗口状态不变

2》拥塞控制慢启动,拥塞避免,快重传,快恢复

1>原因:资源(宽带,处理机)的需求>可用资源

2>作用:为了防止过多的数据注入到网络中,这样可以使网络中的路由器或者链路不至于过载,拥塞控制要做的所有一个前提:就是网络能够承受现有的网络负荷

3>对比流量控制:拥塞控制是一个全局的过程,涉及到所有主机,路由器,以及降低网络相关的所有因素。流量控制往往指点对点通信量的控制,是端对端的问题

4>拥塞窗口:发送方为一个动态变化的窗口叫做拥塞窗口,拥塞窗口的大小取决于网络的拥塞程度,发送方让自己的发送窗口=拥塞窗口的,但是发送窗口不是一直等于拥塞窗口的,在网络情况好的时候,拥塞窗口不断增加,发送方的窗口自然也不断增加,但是接受方的接受能力有限,在发送方的窗口达到某个大小时就不在发生变化

5>慢启动:(加倍增加)

主机开始发送数据报时,如果立即将大量的数据注入到网络中,可能会出现网络拥塞。慢启动算法就是在主机刚开始发送数据报的时候先探测一下网络状况,如果网络状况良好,发送方每发送一次文段都能正确的接受确认报文段,那么就从小到大的增加拥塞窗口的大小

在主机刚刚开始发送报文段时可先将拥塞窗口cwnd设置为一个最大报文段MSS的数值

在每收到一个对新的报文段的确认后,将拥塞窗口增加至多一个MSS的数值

用这样的方法逐步增大发送端的拥塞窗口cwnd,可以使分组注入到网络的速率更加合理

6>拥塞避免:(缓慢增加)

为防止cwnd增加过快而导致网络拥塞,所以需要设置一个慢启动门限ssthresh状态量

当cwnd<ssthresh,使用慢启动算法

当cwnd>ssthresh,使用拥塞控制算法,停用慢启动算法

当cwnd=ssthresh,这两个算法都可以

思路:是让cwnd缓慢的增加而不是加倍的增长,没经历一次往返时间就使cwnd增加1,而不是加倍,这样使cwnd缓慢的增长,比慢启动要慢的多

无论是慢启动算法还是拥塞避免算法,只要判断网络出现拥塞就要把慢启动开始门限(ssthresh)设置为发送窗口的一半,cwnd设置为1,然后在使用慢启动算法,这样做的目的能迅速的减少主机向网络传输数据,使发生拥塞的路由器能够把队列中堆积的分组处理完毕

7>实例讲解:

TCP流量控制与拥塞控制

TCP连接进行初始化的时候,cwnd=1,sstresh=16

1)在慢启动算法开始时,cwnd的初始值是1,每次发送方收到一个ACK拥塞窗口就增加1,当ssthresh=cwnd时,启动拥塞控制算法,拥塞窗口按照规律增长

2)当cwnd=24时,网络出现超时,发送方收不到确认ACK,此时设置ssthresh=12(二分之一cwnd),设置cwnd=1,然后开始慢启动算法,当ssthresh=cwnd时,启动拥塞控制算法

AIMD(加法增大乘法减小)

乘法减小:无论在慢启动阶段还是在拥塞控制阶段,只要网络出现超时,就是将cwnd设置为1,ssthresh设置为cwnd的一半,然后开始执行慢启动算法(cwnd<ssthresh)

加法增大:当网络频发出现超时情况,ssthresh就下降的很快,为了减少注入到网络中的分组数,而加法增大是执行拥塞避免算法后,拥塞窗口缓慢的增大,以防止网络过早出现拥塞

通过控制拥塞窗口的大小只能使网络不易出现拥塞,不能避免拥塞

8>快重传:

1)快重传算法要求:首先接收方收到一个失序的报文段后立刻发出重复确认,而不是等待自己发送数据时才进行捎带确认。

接受方成功的接受了发送方发送来的M1,M2并且分别给发送方ACK,现在接受方没有收到M3,而且收到了M4,显然接受方不能确认M4,因为M4是失序的报文段,如果根据可靠性传输原理接受方什么都不做,但是按照快重传算法,在收到M4,M5等报文段的时候,不断重复向发送方发送M2的ACK,如果接收方一连收到三个重复的ACK,那么发送方不必等待重传计时器到期,发送方立刻重传未被确认的报文段

TCP流量控制与拥塞控制

9>快恢复:

1)原理:当发送发连续收到三个确认时,就执行乘法减小算法,把慢启动开始门限(sstresh)减半,但是接下来并不执行慢启动算法

此时不执行慢启动算法,而是把cwnd设置为sstresh的一半然后执行拥塞避免算法,使拥塞窗口缓慢增大

TCP流量控制与拥塞控制

9>补充:ack通常被理解为收到数据后给出一个确认ACK,ACK包含两个非常重要的信息:一是期望接收到的下一字节的序号n,该n代表接收方已经接收到前n-1字节数据,此时如果接收方收到第n+1字节数据而不是第n字节数据,接收方是不会发送序号为n+2的ACK