计算机网络——TCP拥塞控制

TCP拥塞控制

问题引入

​ TCP必须使用端到端拥塞控制而不是网络辅助的拥塞控制,因为IP层不向端系统提供显示的网络拥塞反馈。TCP所采用的方法是让每一个发送方根据所感知到的网络拥塞程度来限制其能向链接发送流量的速率。主要有三个问题:

  1. TCP发送方如何限制向其连接发送流量的

    运行在发送方的TCP拥塞控制机制跟踪一个额外的变量,即拥塞窗口cwnd,对TCP发送方能向网络中发送流量的速率进行了限制。
    L a s t B y t e S e n t − L a s t B y t e A c k e d < = m i n { c w n d , r w n d } LastByteSent - LastByteAcked <= min \{cwnd,rwnd\} LastByteSentLastByteAcked<=min{cwnd,rwnd}
    现假设接收缓存足够大,以至于可以忽略接收窗口的限制,因此在发送方中未被确认的数据量仅仅受限与cwnd 。在每个往返时间(RTT)的起始点,上述的限制条件允许发送方向该连接发送cwnd个字节的数据,在该RTT结束时发送方接收对数据的确认报文。因此,该发送方的发送速度大概是cwnd/RTT字节/秒(实际情况要大一点),通过调整cwnd的值可以限制发送方的发送速率

  2. TCP发送方如何感知在它与目的地之间的路径上出现了拥塞

    分组超时或收到3个冗余ACK那么可判断网络出现了拥塞。

  3. TCP发送方如何确定发送速率

    确定发送速率之前,首先要理解以下几点:

    1. 一个丢失的报文段意味着拥塞,因此当丢失报文段时应当降低TCP发送方的效率。
    2. 当未确认报文段确认到达时,可增加发送方的速率。当报文段能正确到达接收方,那就代表网络不阻塞,可适当增加发送速率。
    3. 当出现拥塞时,适当减少发送速率,然后通过增加它的传输速率以探测该速率能不能使报文段正确到达。
TCP拥塞控制算法

​ TCP拥塞控制算法,主要包括3个这要部分:慢启动、拥塞控制、快速恢复

  1. 慢启动

    ​ 当一条TCP连接刚开始建立时,拥塞窗口(cwnd)的值通常初始置为一个MSS的较小值,使得初始发送速率大约为MSS/RTT。如,如果MSS=500Byte且RTT=200ms,则初始发送速率大约只有20Kbs。然而对于TCP发送端而言,可用带宽比MSS/RTT大得多,TCP发送方希望迅速找到可用带宽的数量

    ​ 因此,在慢启动状态,cwnd的值以1个MSS开始并且每当传输报文段首次被确认就增加1个MSS(指数级增长),如下图:

    计算机网络——TCP拥塞控制_第1张图片

    每过一个RTT(确认一次),发送速率就翻倍,因此TCP发送速率起始慢,但在慢启动阶段以指数级增长

问: 那么什么时候结束指数级增长?

  • 第一种情况,如果存在一个丢包事件,TCP发送方将cwnd重新设置为1并重新开始慢启动过程。同时将状态变量ssthresh(“慢启动阈值”)设置为cwnd/2。
  • 第二种情况,直接于ssthresh的值有关。当拥塞窗口到达或超过ssthresh的时候,结束慢启动并且TCP转移到拥塞避免模式
  • 第三种情况,如果检测到3个冗余ACK,TCP执行快速重传并进入快速恢复状态

计算机网络——TCP拥塞控制_第2张图片

  1. 拥塞控制

    ​ 但cwnd的值大约是上次遇到拥塞时的值的一半时,就会进入拥塞控制状态。即当cwnd>ssthresh时,拥塞窗口使用拥塞避免算法,按线性增长(通常是将cwnd增加一个MSS)。

    ​ 当出现超时时,结束拥塞避免的线性增长,把cwnd的值设为1,同时ssthresh的值被更新为cwnd值(旧)的一半。

  2. 快速恢复

    ​ 快速恢复具体有两种版本:

    第一种是Tcp Tahoe(TCP的早期版本,现已经弃用)。发生3个冗余ACK指示的丢包事件后,无条件地将其拥塞窗口减至为1个MSS,并且把ssthress更新为cwnd值的一半。然后进入慢启动阶段,当cwnd超过ssthress后,cwnd线性增长;

    第二种是Tcp Reno。发生3个冗余ACK指示的丢包事件后,将cwnd将为ssthress的一半,然后线性增长(没有慢启动);

    计算机网络——TCP拥塞控制_第3张图片
    问:为什么要发生3个冗余ACK指示的丢包事件后才进行操作?

    ​ 在网络传输过程中,网络外部因素不稳定,到达接收方的先后顺序有可能是乱序的,乱序的分组一样会触发冗余ACK,但是为了这个冗余ACK重传没必要。因为一般分组的乱序距离相差不会太大,比如说分组1、2、3,可能分组2现到达然后分组1再到达,但是分组1没可能在分组5后才到达。所以限定成3个或以上可以在很大程度上避免因乱序而触发快速重传

总结

​ 一条连接开始时处于慢启动阶段,假定丢包有3个冗余的ACK而不是超时指示,TCP拥塞控制是:每个RTT内cwnd线性(加性)增加1MSS,然后出现3个冗余ACK事件时cwnd减半(乘性减)。因此TCP拥塞控制常常被称为加性增、乘性减

你可能感兴趣的:(tcp/ip,计算机网络,网络)