黄小华的个人网站
熬过无人问津的日子才有诗和远方!
TCP流量控制和拥塞控制

一.拥塞控制与流量控制的区别

拥塞控制:拥塞控制是作用于网络的,它是防止过多的数据注入到网络中,避免出现网络负载过大的情况;是一个全局的过程
涉及所有主机 路由器
常用的方法就是:( 1 )慢启动、拥塞避免( 2 )快速重传、快速恢复。

流量控制:流量控制是作用于接收者的,它是控制发送者的发送速度从而使接收者来得及接收,防止分组丢失的 点到点的通信量控制。

二什么是流量控制?流量控制的目的?

如果发送者发送数据过快,接收者来不及接收,那么就会有分组丢失。为了避免分组丢失,
控制发送者的发送速度,使得接收者来得及接收,这就是流量控制。
流量控制根本目的是防止分组丢失,消除接受缓存溢出它是构成TCP可靠性的一方面。

如何实现流量控制?

由滑动窗口协议(连续ARQ协议)实现。滑动窗口协议既保证了分组无差错、有序接收,也实现了流量控制。
主要的方式就是接收方返回的 ACK 中会包含自己的接收窗口的大小,并且利用大小来控制发送方的数据发送。

流量控制引发的死锁?怎么避免死锁的发生?

当发送者收到了一个窗口为0的应答,发送者便停止发送,等待接收者的下一个应答。但是如果这个窗口不为0的应答在传输过程丢失,
发送者一直等待下去,而接收者以为发送者已经收到该应答,等待接收新数据,这样双方就相互等待,从而产生死锁。 为了避免流量控制引发的死锁,TCP使用了持续计时器。每当发送者收到一个零窗口的应答后就启动该计时器。
时间一到便主动发送报文询问接收者的窗口大小。若接收者仍然返回零窗口,则重置该计时器继续等待;
若窗口不为0,则表示应答报文丢失了,此时重置发送窗口后开始发送,这样就避免了死锁的产生。

拥塞控制机制是TCP提供可靠传输服务的关键部分

TCP连接的每一端都是由一个接收缓存,一个发送缓存和几个变量(用于实现流量控制等)组成

TCP采用的方法是让每一个发送方根据所感知到的网络拥塞程度来限制其能向连接发送流量的速率。
此方法引出三个问题:

1.如何限制向连接发送流量的速率?

运行在发送方的拥塞控制机制跟踪一个额外的变量即拥塞窗口(表示为cwnd)
它对一个TCP发送方能向网络中发送流量的速率进行了限制 表示未被确定的数据量小于等于cwnd与rwnd(接收方缓存剩余空间)中的最小值。

2.如何感知路径上存在拥塞?

出现拥塞时路径中的路由器会出现缓存溢出,发送方则会有丢包事件(要么超时或收到3个冗余ACK),发送方就认为路径中出现了拥塞的指示。

3.采用什么算法来改变发送速度?

既要网络不拥塞 又要充分利用可用的宽带 下面就让我们来详细了解TCP拥塞控制算法

1.慢启动

如果立即将大量的数据注入到网络可能会出现网络的拥塞。慢启动算法就是在刚开始发送数据报的时候先探测一下网络的状况,
如果网络状况良好,发送方每发送一次报文都能正确的接受确认报文段。那么就从小到大的增加拥塞窗口的大小
即增加发送窗口的大小。发送方先设置拥塞窗口cwnd=1, 发送第一个报文段M1,接收方接收到M1后,
发送方接收到接收方的确认后,把cwnd增加到2,接着发送方发送M2、M3,发送方接收到接收方发送的确认
后cwnd增加到4,慢启动算法每经过一个传输轮次(认为发送方都成功接收接收方的确认),拥塞窗口cwnd就加倍。

2.拥塞避免

为了防止拥塞窗口cwnd增加过快而导致网络拥塞,所以需要设置一个慢开始门限ssthresh状态变量:

               **1.  当cwnd < ssthresh,使用慢启动算法。   
               2.  当cwnd > ssthresh,使用拥塞避免算法,停用慢启动算法。   
               3.  当cwnd = ssthresh,这两个算法都可以。   **

拥塞避免是让cwnd缓慢的增加而不是加倍的增长,每经历过一次往返时间就使cwnd增加1,而不是加倍,
这样使cwnd缓慢的增长,比慢启动要慢的多。 值得注意的是: 无论是慢启动算法还是拥塞避免算法,只要判断网络出现拥塞,就要把慢启动开始
门限ssthresh为设置为发送窗口的一半,cwnd设置为1,然后在使用慢启动算法,这样做的目的
能迅速的减少主机向网络中传输数据,使发生拥塞的路由器能够把队列中堆积的分组处理完毕。拥塞窗口
是按照线性的规律增长,比慢启动算法拥塞窗口增长块的多。

3.快速重传

要求首先接收方收到一个失序的报文段后就立刻发出重复确认,而不要等待自己发送数据时才进行捎带确认。
接收方成功的接受了发送方发送来的M1、M2并且分别给发送了ACK,现在接收方没有收到M3,而接收到了M4,
显然接收方不能确认M4,因为M4是失序的报文段。如果根据可靠性传输原理接收方什么都不做,但是按照快
速重传算法,在收到M4、M5等报文段的时候,不断重复的向发送方发送M2的ACK,如果接收方一连收到三个
重复的ACK,那么发送方不必等待重传计时器到期,由于发送方尽早重传未被确认的报文段。

4.快速恢复:

  1. 当发送发连续接收到三个确认时,就执行乘法减小算法,把慢启动开始门限(ssthresh)减半,但是接下来并不执行慢开始算法。
  2. 此时不执行慢启动算法,而是把cwnd设置为ssthresh的一半, 然后执行拥塞避免算法,使拥塞窗口缓慢增大。
    快速重传和快速恢复并非是必须的,慢启动和拥塞避免则是强制部分