TCP的流量控制和阻塞控制

流量控制和阻塞控制实例:

       可以用一个例子来说明这种区别。设某个光纤网络的链路传输速率为1000Gbit/s。有一台巨型计算机向一台个人电脑以1Gbit/s的速率传送文件。显然,网络本身的带宽是足够大的,因而不存在产生拥塞的问题。但流量控制却是必须的,因为巨型计算机必须经常停下来,以便使个人电脑来得及接收。(流量控制)

       但如果有另一个网络,其链路传输速率为1Mbit/s,而有1000台大型计算机连接在这个网络上,假定其中的500台计算机分别向其余的500台计算机以100kbit/s的速率发送文件。那么现在的问题已不是接收端的大型计算机是否来得及接收,而是整个网络的输入负载是否超过网络所能承受的。(阻塞控制)

TCP流量控制

1.什么是流量控制?  

   所谓的流量控制就是让发送方的发送速率不要太快,让接收方来得及接受。

2.什么方式进行流量控制?

  a.利用滑动窗口机制可以很方便的在TCP连接上实现对发送方的流量控制。

  b.TCP的窗口单位是字节,不是报文段,发送方的发送窗口不能超过接收方给出的接收窗口的数值。

 

滑动窗口机制示意图:

1.设A向B发送数据。在连接建立时,B告诉了A:“我的接收窗口rwnd = 400”(这里rwnd表示recevier window)。

2.发送方的发送窗口不能超过接收方给出的接收窗口的数值,请注意,TCP的窗口单位是字节,不是报文段。

3.再设每一个报文段为100字节长,而数据报文段序号的初始值设为1(图中第一个箭头上面的序号为seq=1。从1开始,data里有100个字节的数据。)

4.图中箭头上面大写ACK表示首部中的确认位ACK(应答标识,表示接收到信息),小写ack表示确认字段的值(表示接收到了哪些具体的数据)。

 

a.接收方的主机N进行了三次流量控制,第一次把窗口减小到rwnd  =300。

b.第二次又减小到rwnd = 100。

c.最后减到rwnd = 0,即不允许发送方再发生数据了。

d.这种使发送方暂停发送的状态将持续到主机B重新发出一个新的窗口值为止。

e.B向A发送的三个报文段都设置了ACK = 1,只有在ACK = 1时确认号字段才有意义。(相当于判定条件,只有条件成立时,才去价差下面的信息)

3.以上处理的不足

  死锁问题

    1.B向A发送了零窗口的报文段后不久,B的接收缓存又有了一些存储空间。于是B向A发送了rwnd = 400的报文段,然而这个报文段在传送过程中丢失了。

    2.A一直等待收到B发送的非零窗口的通知,而B也一直等待A发送的数据,如果没有其他措施,这种相互等待的死锁局面将一直持续下去。

4.解决方法

  1.TCP为每一个连接设有一个持续计时器。

  2.只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。

  3.若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1字节的数据),而对方就在确认这个探测报文时给出了现在的窗口值。

  4.如果窗口值仍然是零,那么收到这个报文段的一方就重新设置持续计时器。

  5.如果窗口不是零,那么死锁的僵局就可以打破了。

5.三种TCP传输机制

  1.TCP维持一个变量,它等于最大报文段长度MSS。只要缓存中存放的数据达到了MSS字节时,就组装成一个TCP报文段发送出去。

  2.发送方的应用进程指明要求发送报文段,即TCP支持的推送(push)操作。

  3.发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段(但长度不超过MSS)发送出去。

 6.如何控制TCP发送报文段的时机?

  TCP的实现中广泛使用Nagle算法

    1.若发送应用进程把要求发送的数据逐个地送到TCP的发送缓存,则发送方就把第一个数据字节先发送出去,把后面到达的数据字节都缓存起来。

    2.当发送方收到第一个数据字节的确认后,再把发送缓存中的所有数据组装成一个报文段发送出去,同时继续对随后到达的数据进行缓存,只有在收到对前一个报文段的确认后才继续发送下一个报文段。

    3.当数据到达较快而网络速率较慢时,用这养的方法可明显减少所用的网络带宽。

    4.Nagle算法还规定,当到达的数据已达到发送窗口大小的一半或已达到报文段的最大长度时,就立即发送一个报文段。这样就可以有效的提高网络的吞吐量。

7.糊涂窗口综合症

  1.TCP接收方的缓存已满,而交互式的应用进程一次只从接收缓存中读取为1个字节(这样就使接收缓存空间仅腾出1个字节)

  2.然后向发送方发送确认,并把窗口设置为1个字节(但发送的数据报是40字节长)。

  3.接收方发回确认,仍然将窗口设置为1个字节。

  4.这样进行下去,使网络的效率很低。

8.如何解决糊涂窗口综合证

  1.让接收方等待一段时间,使得或者接收缓存已有足够空间容纳一个最长的报文段,或者等到接收缓存已有一半空闲的空间。

  2.只要出现这两种情况之一,接收方就发出确认报文,并向发送方通知当前的窗口大小。

  3.此外。发送方也不要发送太小的报文段,而是把数据积累成足够大的报文段,或达到接收方缓存的空间的一半大小。

Nagle算法解决糊涂窗口综合证配合使用,使得在发送方不发送很小的报文段的同时接收方也不要在缓存刚刚有了一点小的空间就急忙把这个很小的窗口大小信息通知给对方。

 

TCP拥塞控制

1.什么是拥塞控制

  1.拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载。

2.拥塞控制要考虑的因素

  1.拥塞控制所作的都有一个前提,就是网络能够承受现有的网络负荷。

  2.拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。

  3.TCP连接的端点只要迟迟不能收到对方的确认信息,就猜想在当前网络中的某处可能发生了拥塞,但这时却无法知道拥塞到底发生在网络的何处,也无法知道发生拥塞的具体原因。

3.拥塞控制的方法:

  1.慢开始

  2.拥塞避免

  3.快重传

  4.快恢复

前提:

1) 数据是单方向传送的,对方只传送确认报文。

2) 接收方总是有足够大的缓存空间,因而发送窗口的大小由网络的拥塞程度来决定。

4.慢开始和拥塞避免

    a.下面讨论的拥塞控制也叫做基于窗口的拥塞控制。

    b.发送方维持一个叫做拥塞窗口cwnd(Congestion window)的状态变量。

    c.拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。

    d.发送方让自己的发送窗口等于拥塞窗口。

  发送方控制拥塞窗口的原则

    1.只要网络没有出现拥塞,拥塞窗口就可以再增大一些,以便把更多的分组发送出去,这样就可以提高网络的利用率。

    2.但只要网络出现拥塞或有可能出现拥塞,就必须把拥塞窗口减小一些,以减少注入到网络中的分组数,以便缓解网络出现的拥塞。

  慢开始算法的思路

    1.当主机开始发送数据时,由于并不清楚网络的负荷情况,所以如果立即把大量数据字节注入到网络,那么就有可能引起网络发生拥塞。

    2.经验证表明,较好的办法是先探测一下,即由小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口的数值。

  新的RFC 5681把初始拥塞窗口cwnd设置规定

    1.若SMSS > 2190 字节 ,则设置初始拥塞窗口 cwnd = 2 * SMSS字节,且不得超过2个报文段。

    2.若SMSS > 1095 且SMSS < 2190字节,  则设置初始拥塞窗口cwnd = 3 * SMSS字节,且不得超过 3 个报文段。

    3.若 SMSS <= 1095字节,  则设置初始拥塞窗口cwnd = 4* SMSS 字节,且不得超过4个报文段。

    4.慢开始规定,在每收到一个新的报文段的确认后,可以把拥塞窗口增加最多一个SMSS的数值。

    5.拥塞窗口cwnd 每次的增加量 = min(N, SMSS)

慢开始示意图

1.在一开始发送方先设置cwnd = 1,发送第一个报文段M1,接收方收到后确认M1

2.发送方收到对M1的确认后,把cwnd从1增大到2,于是发送方接着发送M2和M3两个报文段,接收方收到后发回对M2和M3的确认

3.发送方每收到一个对新报文段的确认(重传的不算在内)就使发送方的拥塞窗口加1,因此发送方在收到两个确认后,cwnd就从2增大到4,并可发送M4~M7共4个报文段

4.使用慢开始算法后,每经过一个传输轮次,拥塞窗口cwnd就加倍

  什么是RTT

    1.一个传输轮次所经历的时间其实就是往返时间RTT(RTT并非恒定的数值)

    2.使用“传输轮次”是更加强调:把拥塞窗口所允许发生的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认

    3.例如,拥塞窗口cwnd的大小是4个报文段,那么这时的往返时间RTT就是发送方连续发送4个报文段,并收到这4个报文段的确认,总共经历的时间。

    4.在TCP的实际运行中,发送方只要收到一个对新报文段的确认,其拥塞窗口cwnd就立即加1,并可以立即发送新的报文段,而不需要等这个轮次中所有的确认都收到后再发送新的报文段。

  什么是ssthresh状态变量,以及作用

    为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量

      1.当cwnd < ssthresh时,使用上述的慢开始算法

      2.当cwnd > ssthresh时,  停止使用慢开始算法而改用拥塞避免算法

      3.当cwnd = ssthresh时 , 即可以使用慢开始算法,也可以使用拥塞避免算法。

  拥塞避免算法的思路

     拥塞避免算法的思路是让拥塞避免窗口cwnd缓慢的增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1。

      1.假定cwnd等于10个MSS的长度,而MSS是1460字节,发送方可一连发送14600字节(即10个报文段)。

      2.假定接收方每收到一个报文段就发回一个确认。

      3.于是发送方每到一个新的确认,就把拥塞窗口稍微增大一些,即增大0.1 MSS = 146字节。

      4.经过一个往返时间RTT(或一个传输轮次)后,发送方共收到10个新的确认,拥塞窗口就增大了1460字节,正好是一个MSS的大小。)

      5.不是像慢开始阶段那样加倍增长。因此在拥塞避免阶段就有“加法增大”AI的特点。

      6.这表明在拥塞避免阶段,拥塞窗口cwnd按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢得多。

 

5.快重传和快恢复

  什么是快重传,以及优势。

    1.采用快重传算法可以让发送方尽早知道发生了个别报文段的丢失。

    2.快重传算法首先要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认。

1、接收方收到了M1和M2后都分别及时发出了确认。

2、现假定接收方没有收到M3的但收到了M4,本来接收方可以什么都不做。

3、但按照快重传算法,接收方必须立即发送对M2的重复确认,以便让发送方及早知道接收方没有收到报文段M3。

4、发送方接着发送M5和M6,接收方收到后也仍要再次分别发出对M2的重复确认。

5、这样,发送方共收到了接收方的4个对M2的确认,其中后3个都是重复确认。

6、快重传算法规定,发送方只要一收到3个重复确认,就知道接受方确实没有收到报文段M3,因而应当立即进行重传(即“快重传”),这样就不会出现超时,发送方也不就会认为出现了网络拥塞。

  快恢复的两个特点

       1)当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把慢开始门限减半,这是为了预防网络发生拥塞。
       2)由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,而是把cwnd值设置为慢开始门限减半后的值,然后开始执行拥塞避免算法,是拥塞窗口的线性增大。

   快恢复和慢开始的区别:

    慢开始算法只是在TCP建立时才使用,快恢复是在遇到网络拥塞接收不到数据时触发,常常伴随着快重传算法。

 

 

    慢开始和拥塞避免的实例

为了便于理解,上图中的窗口单位不使用字节而是用报文段的个数。

1、当TCP连接进行初始化时,把拥塞窗口cwnd置为1。

2、慢开始门限的初始值置为16个报文段,即ssthresh = 16。

3、在执行慢开始算法时,发送方每收到一个对新报文段的确认ACK,就把拥塞窗口值加1,然后开始下一轮的传输(图中的横坐标是传输轮次,不是时间)。

4、因此拥塞窗口cwnd随着传输轮次按指数规律增长。

5、当拥塞窗口cwnd增长到慢开始门限值ssthresh时(图中点(1),此时拥塞窗口cwnd=16)。

6、改为执行拥塞避免算法,拥塞窗口按线性规律增长。

7、“拥塞避免”并非完全能够避免拥塞,“拥塞避免”是说把拥塞窗口控制为线性规律增长,使网络比较不容易出现拥塞。

8、当拥塞窗口cwnd=24时,网络出现了超时(图中点(2)),发送方判断为网络拥塞,于是调整门限值ssthresh=cwnd/2=12,同时设置拥塞窗口cwnd=1,进入慢开始阶段。

9、按照慢开始算法,发送方每收到一个对新报文段的确认ACK,就把拥塞窗口值加1。

10、当拥塞窗口cwnd=ssthresh = 12时(图中点(3),则是新的ssthresh值),改为执行拥塞避免算法,拥塞窗口按线性规律增大。

11、当拥塞窗口cwnd=16时(图中点(4)),出现了一个新的情况,就是发送方一连收到3个对同一个报文段的重复确认(图中记为3-ACK)。这是因为:有时,个别报文段会在网络中丢失,但实际上网络并未发生拥塞。如果发送方迟迟收不到确认,就会产生超时,就会误认为网络发生了拥塞。这就导致发送方错误地启动慢开始,把拥塞窗口cwnd又设置为1,因而降低了传输效率。

12、图中的点(4),发送方知道现在只是丢失了个别的报文段,于是不启动慢开始,而是执行快恢复算法。

13、这时,发送方调整门限值ssthresh = cwnd/2 = 8,同时设置拥塞窗口cwnd=ssthresh = 8(上上图中点(5)),并开始执行拥塞避免算法。

14、请注意,也有的快恢复实现是把快恢复开始时的拥塞窗口cwnd值再增大一些(增大3个报文段的长度),即等于新的ssthresh+3* MSS。这样做的理由是:既然发送方收到了3个重复的确认,就表明有3个分组已经离开了网络。这三个分组不再消耗网络的资源而是停留在接收方的缓存中(接收方发送出3个重复的确认就证明了这个事实)。可见现在网络中并不是堆积了分组而是减少了3个分组。因此可以适当把拥塞窗口扩大些。

  总结:

 

    在拥塞避免阶段,拥塞窗口时按照线性规律增大的,这常称为加法增大AI(Additive Increase)。而一旦出现超时或3个重复的确认,就要把门限值设置为当前拥塞窗口值的一半,并大大减小拥塞窗口的数值。这称为“乘法减小”MD(Multiplicative Decrease)。二者合在一起就是所谓的AIMD算法。

 

TCP拥塞控制流程图:

 

TCP拥塞控制实际流程和上文理论的区别

  1.我们刚开始就假定了接收方总是有足够大的缓存空间,因而发送窗口的大小由网络的拥塞程度来决定。

  2.实际上接收方的缓存空间总是有限的。

  3.接收方根据自己的接收能力设定了接收方窗口rwnd,并把这个窗口值写入TCP首部中的窗口字段,传送给发送方。

  4.从接收方对发送方的流量控制的角度考虑,发送方的发送窗口一定不能超过对方给出的接收方窗口值rwnd

  5.把这里所讨论的拥塞控制和接收方对发送方的流量控制一起考虑,那么很显然,发送方的窗口的上限值应当取为 接收方窗口rwnd和拥塞窗口cwnd这两个变量中较小的一个。

  6.发送方窗口的上限值 = Min[ rwnd, cwnd  ]

  7.当rwnd < cwnd 时,是接收方的接收能力限制发送方窗口的最大值。

    8.反之,当cwnd < rwnd 时,则是网络的拥塞程度限制发送方窗口的最大值。

  9.也就是说,rwnd和cwnd中数值较小的一个,控制了发送方发送数据的速率。

 

posted @ 2019-03-10 18:09  X小白的逆袭之旅  阅读(7057)  评论(0编辑  收藏  举报