TCP流量控制和拥塞控制

先来了解2个TCP的概念:

MSS:Maximum Segment Size,TCP一次传输发送的最大数据段长度。

RTT:Round-Trip Time,往返时延,表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认),总共经历的时延。

TCP传输大块数据时,肯定需要进行数据分段,而每个分段所能携带的最大数据就是1个MSS,假设大块数据为100个MSS,那么发送方发送的方式大概有如下两种:

1、  每次发送1个,收到接收方确认后,才发送下1个;

2、  一口气发送100个,然后收到对方一起确认;

显然,方式1中,一个RTT只能处理一个包,这样的传输效率太低了。而方式2看似很美好,实际会存在两个问题,一个是接收方的接收窗口未必能一次性接收这么多数据,另外一个是网络的带宽也不一定足够大,容易出现丢包事故。前一个问题就是标题中的流量控制(Flow control),TCP采用的是滑动窗口机制(Sliding window),后一个问题就是标题中的拥塞控制(Congestion control)。发送方的发送窗口或者说网络传输交互就取决于这两个问题的控制,谁控制的更严格,谁就占据了决定性因素,这也是为什么两者总是一起出现一起被讨论。

 

一、流量控制

1.什么是流量控制

Sender won’t overflow receiver’s buffer by transmitting too much, too fast. (防止发送方发的太快,耗尽接收方的资源,从而使接收方来不及处理)

2.流量控制的一些知识点

(1)接收端抑制发送端的依据:接收端缓冲区的大小
(2)流量控制的目标是接收端,是怕接收端来不及处理
(3)流量控制的机制是丢包

3.怎么样实现流量控制?

使用滑动窗口
滑动窗口
1.滑动窗口是什么?
滑动窗口是类似于一个窗口一样的东西,是用来告诉发送端可以发送数据的大小或者说是窗口标记了接收端缓冲区的大小,这样就可以实现
ps:窗口指的是一次批量的发送多少数据

2.为什么会出现滑动窗口?

在确认应答策略中,对每一个发送的数据段,都要给一个ACK确认应答,收到ACK后再发送下一个数据段,这样做有一个比较大的缺点,就是性能比较差,尤其是数据往返的时间长的时候

使用滑动窗口,就可以一次发送多条数据,从而就提高了性能

3.滑动窗口的一些知识点

TCP流量控制和拥塞控制

TCP流量控制和拥塞控制

TCP流量控制和拥塞控制

图二和图三可以知道接收方会通知发送方当前已接收到的信息和可用窗口信息。

图三和图四可以看出来窗口滑动的过程。

总结:TCP的流量控制由滑动窗口来实现的,滑动窗口控制流量取决于接收方的窗口大小。

 

(1)接收端将自己可以接收的缓冲区大小放入TCP首部中的“窗口大小”字段,通过ACK来通知发送端
(2)窗口大小字段越大,说明网络的吞吐率越高
(3)窗口大小指的是无需等待确认应答而可以继续发送数据的最大值,即就是说不需要接收端的应答,可以一次连续的发送数据
(4)操作系统内核为了维护滑动窗口,需要开辟发送缓冲区,来记录当前还有那些数据没有应答,只有确认应答过的数据,才能从缓冲区删掉

ps:发送缓冲区如果太大,就会有空间开销

(5)接收端一旦发现自己的缓冲区快满了,就会将窗口大小设置成一个更小的值通知给发送端,发送端收到这个值后,就会减慢自己的发送速度
(6)如果接收端发现自己的缓冲区满了,就会将窗口的大小设置为0,此时发送端将不再发送数据,但是需要定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端
ps:在TCP的首部中,有一个16为窗口字段,此字段就是用来存放窗口大小信息的

4.滑动窗口的优点

可以高效可靠的发送大量的数据
 

二、拥塞控制
1.什么是拥塞控制

     防止发送方发的太快,使得网络来不及处理,从而导致网络拥塞

2.拥塞控制使用的机制:

       慢启动、拥塞避免、快速重传和快速恢复。

3.发送端如何知道已经丢包?

TCP流量控制和拥塞控制

4.为什么会有拥塞控制?

       流量控制虽然可以高效可靠的传送大量的数据,但是如果在刚开始阶段就发送大量的数据,可能会导致网络拥堵,因为网络上的计算机太多了

5.拥塞控制的表现?

       丢包
      延时变长

6.拥塞控制的工作过程

慢启动:

      讨论慢启动算法先来了解下拥塞窗口的概念,这是慢启动算法为TCP发送方新增的窗口,congestion window,简称cwnd。对应上文,发送方取拥塞窗口和滑动窗口的最小值作为发送上限,即谁严格谁起决定因素。

1、  连接建立开始,发送方不了解网络的情况,cwnd(拥塞窗口)初始化比较小的值,RFC建议2-4个MSS,具体视MSS的大小而定;

If (MSS <= 1095 bytes)

      then win <= 4 * MSS;

If (1095 bytes < MSS < 2190 bytes)

      then win <= 4380;

If (2190 bytes <= MSS)

      then win <= 2 * MSS; 摘自rfc3390.

2、  如果发送出去的包都被ACK,说明还未到达拥塞点,则增加拥塞窗口,RFC建议的是每收到n个ACK,则cwnd新增n个MSS,呈指数关系增长,虽然这个过程看似比较快,但是基数比较低,所以被称为“慢启动”。

TCP流量控制和拥塞控制

3、拥塞避免:

         其实慢启动除了维护了cwnd,还维护了慢启动临界值ssthresh(门限),一般将ssthresh设置为65535字节。在cwnd<=ssthresh时,还是处于慢启动环节,一旦>ssthresh,开始进入拥塞避免。

          RFC建议拥塞避免环节,无论一个RTT可以收到多少个ACK,每一次确认都只新增1个MSS,拥塞窗口cwnd呈线性关系增长,避免快速的触碰到网络拥塞点。

TCP流量控制和拥塞控制

             

快速重传和快速恢复:

      进入拥塞避免之后,最终还是会碰到拥塞点,发送方此时迟迟得不到确认,当然得不到确认也有可能是因为延迟确认导致的。发送方此时决定等待一段时间,如果一段时间后还是得不到确认,就发起重传,这个过程叫做超时重传。从发出原始包到重传该包的时间叫做RTO(Retransmission TimeOut)。

      进入超时重传后,RFC建议将cwnd设置为1个MSS,而对于ssthresh,RFC5681建议的是发生拥塞时未被ACK的数据量的1/2,但必须大于等于2个MSS。然后重新进入慢启动环节。

TCP流量控制和拥塞控制

TCP流量控制和拥塞控制

    超时重传因为需要等待RTO之后才能进入新的恢复环节,所以对网络性能的影响是比较大的。所以各路大神又想到了一个新的方式,看能否无需等待RTO,就发起重传,这种方式叫做快速重传。 快重传算法首先要求接收方每收到一个失序的报文段就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方),然后若是发送方接收到3个重复确认ACK,则启动快重传算法。不再进入慢启动环节,然后直接进入拥塞避免,这个就是快速恢复算法。为什么是3个?因为1-2个重复ACK,很有可能是乱序,只有在3个及以上的时候才是有可能丢包了。关于具体快速重传和快速恢复的算法可以看下参考资料,已经写得非常详细了。


三、流量控制和拥塞控制的区别
1.相同点

(1)现象都是丢包;
(2)实现机制都是让发送方发的慢一点,发的少一点

2.不同点

    (1)丢包位置不同
             流量控制丢包位置是在接收端上
             拥塞控制丢包位置是在路由器上
    (2)作用的对象不同
              流量控制的对象是接收方,怕发送方发的太快,使得接收方来不及处理
           拥塞控制的对象是网络,怕发送发发的太快,造成网络拥塞,使得网络来不及处理

3.联系

       拥塞控制
             拥塞控制通常表示的是一个全局性的过程,它会涉及到网络中所有的主机、
             所有的路由器和降低网络传输性能的所有因素
      流量控制
            流量控制发生在发送端和接收端之间,只是点到点之间的控制