TCP的流量控制和拥塞控制详解
目录
1、流量控制
1.1 为什么要进行流量控制
双方在通信的时候,发送方的速率与接收方的速率是不一定相等,如果发送方的发送速率太快,会导致接收方处理不过来,这时候接收方只能把处理不过来的数据存在缓存区里(失序的数据包也会被存放在缓存区里)。
如果缓存区满了发送方还在疯狂着发送数据,接收方只能把收到的数据包丢掉,大量的丢包会极大着浪费网络资源,因此,我们需要控制发送方的发送速率,让接收方与发送方处于一种动态平衡才好。
对发送方发送速率的控制,我们称之为流量控制。
1.2 如何控制
由图中可知,TCP三次流量控制分别是,第一次窗口大小由400减到300,第二次减到100,第三次减到0。
TCP连接的一方如果收到零窗口通知,就会启动坚持计时器。若坚持计时器的时间到期,就会发送一个零窗口控测报文段,收到报文段的一方就重新设置坚持计时器。
2、拥塞控制
2.1 概述
为了提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性,这就是拥塞控制。
拥塞控制包括四部分:慢启动、拥塞避免、快速重传、快速恢复。
发送端向网络一次连续写入的数据量,我们称为swnd(Send Window,发送窗口).但是发送端最终以TCP报文段来发送数据,所以swnd的大小限制了能连续发送的TCP报文段数量。这些TCP报文段的最大长度(仅数据部分)称为SMSS(Sender Maximum Segment Size,发送者最大段大小),其值一般等于MSS。
发送端需要合理的选择SWND的大小,如果SWND太小,会引起明显的网络延迟;反之,如果SWND太大,则容易导致网络拥塞。所以还需要引入一个称为拥塞窗口cwnd(Congestion Window,CWND)的状态变量
(1)慢开始
发送方维持一个拥塞窗口cwnd的状态变量。它的大小取决于网络的拥塞程度,并且在动态的变化,发送方会让自己的发送窗口等于这个拥塞窗口。
发送方控制拥塞窗口的原则是:
- 只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。
- 但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。
慢开始算法:因为不清楚网络状况,所以需要进行试探,将发送窗口逐渐增大,也就是逐渐增大拥塞窗口的数值。在刚开始发送的时候,先把拥塞窗口cwnd设置为最大报文段MSS,每收到一个对新报文段的确认后,就把拥塞窗口最多增加一个MSS数值。这种逐步增大的方法可以使分组注入到网络的速率更加合理。【指数增长】
例外,为了防止拥塞窗口过大引起网络拥塞,我们需要设置一个慢开始门限ssthreth状态变量,
当cwnd < ssthreth时,使用慢开始算法;
当cwnd > ssthrerth时,使用拥塞控制算法;
如果两者相等,两个都可以使用。
慢开始的“慢”并不是指cwnd增长速率慢而是说在TCP开始发送报文时,先设置CWND=1,使发送端开始时只发送一个报文段进行探测。
(2)拥塞避免
就是让拥塞窗口缓慢增大,即每经过一个往返时间RTT就使cwnd+1,这种线性增长的速率慢很多。
只要发送方判断出网络拥塞,不论是在慢开始还是拥塞控制阶段,都要把慢开始门限值设置为出现拥塞时发送端窗口大小的一半,但不能小于2。然后把cwnd重新置为1,执行慢开始算法。门限值减半,cwnd重置为1,做目的是减少发送到网络中的分组数,使得发生拥塞的路由器能够有时间能把队列中积压的分组处理掉。
发送端判断网络拥塞的依据:
- 传送超时,即TCP重传定时器溢出
- 收到重复的确认报文
(3)快重传
快重传算法要求接收方每收到一个失序的报文段后就立即发出重复确认,而不要等到自己发送数据时才进行捎带确认。发送方只要一连收到3个同样的确认报文就应当立即重传数据报,不必等待报文段的重传计时器到期。
(4)快恢复
把慢开始门限减半,“乘法减小”,将cwnd设置为新的慢开始门限值,继续执行拥塞避免算法,“加法增大”
2.2 图解