zoukankan      html  css  js  c++  java
  • TCP拥塞控制

    一、拥塞控制概述

    1、什么是拥塞控制

    拥塞: 在某段时间内,若对网络中某资源的需求量大于所能提供的部分,网络的性能就要下降

    拥塞产生条件: 对资源需求的总和 > 可用资源

    ​ 为了解决网络拥塞所带来网络性能的下降,就需要有拥塞控制

    2、拥塞控制和流量控制的区别

    拥塞控制: 全局的。 所有主机和路由器都要参与

    ​ 流量控制: 端到端的。 发送端和 接收端之间的流量控制

    3、拥塞控制所起的作用

    image-20210110143725727

    ​ 吞吐量(throughput)表示在单位时间内通过某个网络(或信道、接口)的数据量。比如某网络的带宽为100M,那么该网络的最大吞吐量为100M/s 。

    假设最大带宽为100M

    • 理想的拥塞控制: 传输的数据量越大,开始吞吐量越大。当数据量超过最大带宽时,吞吐量保持在最大带宽处。多余的数据就扔掉。比如 150M就扔掉50M

    • 无拥塞控制: 当数据小于100M时,就开始丢包了(此时为轻度拥塞)。等数据大于100M时,整个网络都瘫痪了==》导致吞吐量为0

    • 实际的拥塞控制:当数据量越来越大时,吞吐量也越来越大,此时就会降低数据的传输速率,以减少拥塞

    二、拥塞控制原理

    1、简介

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

      拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口。如再考虑到接收方的接收能力,则发送窗口还可能小于拥塞窗口。 ==》 发送窗口 小于等于 拥塞窗口

      发送窗口一般等于拥塞窗口。

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

      只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。

      只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数

    2、发送窗口的上限

    ​ 前面讲过发送方的发送窗口是由接收方的接收窗口决定的。例如接收方的接收窗口为100字节,那么发送方的发送窗口就为100字节。实际上:

    ​ 发送方的发送窗口的上限值应当取为接收方窗口 rwnd 和拥塞窗口 cwnd 这两个变量中较小的一个,即应按以下公式确定:

    img

    • 即刚开始发送数据时,由于网络情况未知cwnd的值由1开始按指数规律增大,而接收窗口的是固定的假设为100字节。此时 cwnd < rwnd ,网络的拥塞窗口cwnd限制了发送窗口的最大值。

    • 之后cwnd的值越来越大,最后被限制在接收方的接收窗口大小100字节上。此时此时 cwnd > rwnd ,接收方的接收能力限制了发送窗口的最大值。

    3、慢开始和拥塞避免(1988年提出)

    3.1 慢开始图例

    image-20210110144002497

    第一轮:刚开始cwnd=1,发送窗口也为1,发送方先发送一个报文M1测试连接通畅程度,当收到对M1报文的确认之后,cwnd+1,即发送窗口变为2,可以同时发送两个报文M2~M3;

    第二轮:发送方发送两个报文M2M3,发送方收到了M2报文的确认后使cwnd+1变为3,收到了M3报文确认后cwnd+1变为4,即每收到一个对新报文的确认(重传的不算在内)就使cwnd+1。由此cwnd=4,即发送窗口也为4,可以同时发送四个报文M4M7 。

    以此类推第三轮之后cwnd=8。传输速度由慢开始,每轮翻倍,最后传输速度越来越快。

    3.2 慢开始概念介绍

    1、慢开始门限状态变量ssthresh(相当于阈值)

    ​ 当 cwnd < ssthresh 时,使用慢开始算法(cwnd每轮加倍)。 ==》 每次加倍

    ​ 当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。 ==》 每次加1

    3.3 慢开始和拥塞避免算法的实现举例

    image-20210110144312245

    1、开始时采用慢开始算法,每经历一轮cwnd翻倍,传输的数据包翻倍,到第4轮时cwnd=16,意味着可以同时发送16个数据包

    2、到达了设定的慢开始门限值ssthresh,随后采用拥塞避免算法。采用拥塞避免算法期间,每经历一轮cwnd+1

    3、当cwnd=24时,发送方不能准时收到确认数据包(即丢包),判断出现网络拥塞,于是把慢开始门限值ssthresh重新设为当前cwnd值(24)的一半,即12,并把cwnd重置为1 ,再次进入慢开始阶段。

    可以看到:采用慢开始算法,cwnd按指数规律增长;采用拥塞避免算法,cwnd按线性规律增长。

    3.4 注意

    “拥塞避免”并非指完全能够避免了拥塞。利用以上的措施要完全避免网络拥塞还是不可能的。

    “拥塞避免”是说在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。

    4、快重传和快恢复(1990年提出)

    4.1 快重传

    • 为什么需要快重传?

      即按原来的方式是需要一个分组都接收完后,才反馈丢失的信息。效率低

      当不出现丢包情况时,接收方是每接收多个数据包才给发送方一个确认。例如每收到5个连续的数据包,发送以此确认信息。

      当出现丢包情况时:如发送数据包M1~M5,丢失了M3,如按上述规律,接收方要等到接收完M5后才能向发送方反馈丢失M4的信息。实际上,接收方接连收到不连续的数据包M2、M4,就已经发现丢失了M3,可采用以下的快重传方式。

    image-20210110144419185

    • 快重传是什么?

      接收方发现丢失报文段后立即发三个重复确认信息给发送方。 发送方只要一连收到三个重复确认就应该立马重传接收方缺少的报文段

    4.2 快恢复
    • 快恢复是什么?

      当发送端收到连续三个重复的确认时,就执行“乘法减小”算法,把慢开始门限 ssthresh 减半。但接下去不执行慢开始算法。(因为发送方认为现在网络没有拥塞[因为我都收到你发来的连续三个确认信息],我就不从1 进行慢开始算法了。直接从 ssthresh 减半 开始)

    • 图例

    image-20210110144436861


    如果本篇博客有任何错误和建议,欢迎大佬们批评指正

    我是知逆,我们下期见

    Peace

  • 相关阅读:
    data-toggle data-target
    css pseudo classes
    Kentico中的skin.css的加载
    What does jQuery.fn mean?
    Bootstrap4 网格系统
    同一个站点下,兼容不同版本的JQuery
    DataTables
    sql compare options
    NaN in JavaScript
    JavaScript面试题
  • 原文地址:https://www.cnblogs.com/mercurytan/p/14258434.html
Copyright © 2011-2022 走看看