文章目录

  • 前言
  • 如何检测拥塞
  • 拥塞控制方法分类
  • 通过窗口减缓TCP发送
  • 拥塞控制算法
    • 理论基础
    • 状态迁移图
    • 慢启动
    • 拥塞避免
    • 快速恢复
    • 总结

前言

TCP的流量控制服务完成了对发送方发送速率的调节——当TCP通信的接收方的接收速率无法匹配发送速率时,发送方会降低发送速率。但流量控制没有考虑到整个网络中的情况——即使路由器能够存储一些数据,但若源源不断的数据到达速率高于路由器的发出速率,任何容量的路由器都会溢出。

路由器因无法处理高速率到达的流量而被迫丢弃数据的现象被称为——拥塞

从流量控制服务可知,针对于丢包情况,TCP采取的首要机制是重传,包括超时重传快速重传。但如果网络已经处于了拥塞状态,你再进行重传,会导致同一时间段内网络传输路径上需要传输更多的数据包。这就好比火上浇油,拥塞的情况会更加严重。

所以,拥塞控制的原则为:

  • 当拥塞状况出现时,我们就需要减缓TCP发送端的发送速率。
  • 当拥塞状况好转时,我们就需要检测和使用新的可用带宽。

如何检测拥塞

但是检测拥塞却很难做到,因为对于TCP的发送方来说,没有一个精确的方法去知晓中间路由器的状态。换言之,没有一个明确的信号告知拥塞状况已经发生。

往深了说,网络层没有为运输层拥塞控制提供显示支持。即使网络中存在拥塞,端系统也必须通过对网络行为的观察(如分组丢失与时延)来推断。

有两种行为可以观察

  • 期待的ACK超时未到达。
  • 收到了三个冗余ACK。

拥塞控制方法分类

  • 端到端拥塞控制。端系统通过观察丢包行为(通过超时或3次冗余ACK而得知)。
  • 网络辅助的拥塞控制。网络层构件(即路由器)向发送方提供关于网络中拥塞状态的显式反馈信息,一般来说我们不能依靠这种方式。分为两种:
    • 路由器直接反馈信息给发送方。
    • 路由器标记或更新从发送方流向接收方的分组中的某个字段来表示拥塞的发生。接收方收到这个分组后,再向发送方通知网络拥塞。这种形式更慢,需要一个完整的往返时间。

通过窗口减缓TCP发送

在流量控制服务中,用接受窗口rwndrwndrwnd来限制发送方可以发送的数据量。在拥塞控制中,我们用拥塞窗口cwndcwndcwnd(congestion window)来限制。那么发送方实际可用窗口WWW为二者的较小者:
W=min{cwnd,rwnd}W = min\{ cwnd, rwnd\}W=min{cwnd,rwnd}

为了仅关注于拥塞控制,本文假设TCP接受缓存无限大,即rwndrwndrwnd无限大。那么W=cwndW = cwndW=cwnd。

且已发送、待确认的数据量不会超过WWW:
LastByteSent−LastByteAck≤WLastByteSent - LastByteAck \leq WLastByteSent−LastByteAck≤W

已发送、待确认的数据量有时也被称为在外数据量(flight size)。

拥塞控制算法

主要包含这三部分:

  1. 慢启动
  2. 拥塞避免
  3. 快速恢复

慢启动和拥塞避免是TCP的强制部分,二者的差异在于:对收到的ACK做出反应时增加cwndcwndcwnd长度的方式。
快速恢复是推荐部分,不是必需的。

理论基础

慢启动和拥塞避免是基于包守恒ACK时钟原理的。

守恒指的是——某个量进入一个系统不会凭空消失或出现,而是以某种表现形式继续存在。在上图中,上面的数据包在被接收方接收后就会变成下面的ACK包。

在高效传输的稳定状态下,上下通道都不会出现包堵塞的情况,而且在上通道中也不会有较大传输间隔。注意到,每当发送包接收到一个ACK,就代表其可以向上层通道发送一个数据包。这种由一个ACK到达(称为ACK时钟)触发一个新数据包传输的关系称为自同步(self-clocking)。

状态迁移图

ssthreshssthreshssthresh为slow start threshold即慢启动阈值。

  • 当cwnd<ssthreshcwnd < ssthreshcwnd<ssthresh时,使用慢启动算法。
  • 当cwnd>ssthreshcwnd > ssthreshcwnd>ssthresh时,使用拥塞避免算法。
  • 当cwnd=ssthreshcwnd = ssthreshcwnd=ssthresh时,任何一种算法都可以。

有两种ACK:

  • new ACK,指发送方收到的ACK包里的Ack序号是大于LastByteAckLastByteAckLastByteAck的。
  • duplicate ACK,指发送方收到的ACK包里的Ack序号是等于LastByteAckLastByteAckLastByteAck的。

慢启动

当一个新的TCP连接建立、或检测到 由超时引起的重传 时,需要执行慢启动。TCP发送端长时间处于空闲状态也可能调用慢启动算法。慢启动的目的是,使TCP在使用拥塞避免算法之前就找到一个cwndcwndcwnd值,以及帮助TCP建立ACK时钟。

开始时,cwndcwndcwnd的值通常设置为一个MSS的较小值,这使得初始发送速率大约为MSSRTT\frac{MSS}{RTT}RTTMSS​。

该算法的过程为:发送方每收到一个ACK,cwndcwndcwnd就增加一个MSS。这样,发送方每经过一个RTT的时间,cwndcwndcwnd就会翻倍。从上面的折线图,可以看到窗口大小呈指数形增长(只关注上面那根折线的话)。

慢启动的执行过程如同上图左边的过程:

  • 初始时,cwndcwndcwnd的值为1个MSS。
  • 在第1阶段开始时发送了一个数据包(因为cwndcwndcwnd=1MSS),结束时收到了一个ACK。
    • 因为收到了一个ACK,所以cwndcwndcwnd增加1个MSS,变成2个MSS。
  • 在第2阶段开始时发送了两个数据包(因为cwndcwndcwnd=2MSS),结束时收到了两个ACK。
    • 因为收到了两个ACK,所以cwndcwndcwnd增加2个MSS,变成4个MSS。
  • 以此类推


如上图,当cwnd>ssthreshcwnd > ssthreshcwnd>ssthresh时,转而使用拥塞避免算法。


如上图,这三个状态(包括慢启动自身)当遇到超时后(遇到超时,说明网络已经拥塞了),都会执行:

  • ssthreshssthreshssthresh设为cwndcwndcwnd的一半。

    • ssthreshssthreshssthresh变小,那么就会更快地从慢启动转到拥塞避免。
  • cwndcwndcwnd设为1MSS。
    • 让窗口回到初始值,并重新通过指数增长来探索到一个合理的窗口值。

拥塞避免


如上图,在慢启动阶段,cwndcwndcwnd会快速增长,并且会确定一个可能小于64KB的ssthreshssthreshssthresh。如上图,整个慢启动过程中,可能遇到多次超时,每次超时后,将ssthreshssthreshssthresh减半,让cwndcwndcwnd重新开始指数增长,最终cwndcwndcwnd会超过ssthreshssthreshssthresh。值得注意的是,在离开慢启动前的最后一次指数增长过程中,是没有遇到过timeout的,也就是说,理想的窗口大小是大于等于这个ssthreshssthreshssthresh的(让窗口大小保持为ssthreshssthreshssthresh也可以,因为肯定不会造成网络拥塞。但是太过保守,有可能存在一个更大的值并且这个值也不会造成网络拥塞,所以,要让拥塞避免阶段来找到一个不那么保守的窗口大小)。

一旦超过了由慢启动阶段确定的ssthreshssthreshssthresh值,就意味着有更多可用的传输资源。如果立即全部占用这些资源,可能会使路由器出现严重丢包,从而使得网络不稳定。为了得到更多的传输资源同时不会影响其他TCP连接传输,所以我们要转而使用拥塞避免算法。

进入拥塞避免后,cwndcwndcwnd每次的增长值近似于成功传输的数据段大小,即每个RTT只将cwndcwndcwnd的值增加一个MSS。从上面的折线图可以看到,cwndcwndcwnd呈线性增长。

拥塞避免的执行过程如同上图左边的过程:

  • 每收到一个ACK,cwndcwndcwnd增加MSS⋅MSScwndMSS \cdot \frac{MSS}{cwnd}MSS⋅cwndMSS​。
  • MSS是每个数据包payload的大小,cwndcwndcwnd是窗口内可以发送数据的总和,所以在每个RTT刚开始时,会发送cwndMSS\frac{cwnd}{MSS}MSScwnd​个数据包出来。
  • 正常情况下,在每个RTT快结束时,也会收到cwndMSS\frac{cwnd}{MSS}MSScwnd​个ACK,那么cwndcwndcwnd总共增加MSS⋅MSScwnd⋅cwndMSSMSS \cdot \frac{MSS}{cwnd} \cdot \frac{cwnd}{MSS}MSS⋅cwndMSS​⋅MSScwnd​即刚好一个MSS。

在拥塞避免阶段,cwndcwndcwnd的变化过程为:每个RTT内cwndcwndcwnd线性(加性)增加1MSS,然后出现3个冗余ACK时,cwndcwndcwnd减半(乘性减)。因此,TCP拥塞控制常常被称为 加性增、乘性减(Additive-Increase, Multiplicative-Decrease,AIMD) 的拥塞控制方式。

快速恢复

能收到冗余ACK,说明网络可能有点拥塞,但是也没那么严重,所以进入到快速恢复这种中间状态,需要进一步确认网络的状况,以决定之后到底是回到慢启动还是拥塞避免。

快速恢复是一种中间状态,是因为只有一直收到冗余ACK才能维持这种状态:

  • 当处于慢启动、拥塞恢复状态时,只有收到3个冗余ACK后,才会进入到 快速恢复状态。此时,窗口近似减半(因为还加了3MSS)。
  • 当处于快速恢复状态本身时,只有继续收到冗余ACK才能保持拥塞恢复状态。其他事件都会使得状态变化。注意,窗口还在继续“膨胀”。

处于快速恢复状态后,如果不再收到冗余ACK,那么其他事件将使得状态变化:

  • 如果超时,说明网络已经拥塞。那么由快速恢复进入到慢启动。
  • 如果收到new ACK,说明网络不拥塞,可以继续线性探索理想窗口大小。那么由快速恢复进入到拥塞避免。那么,窗口“收缩”到上一次窗口大小的一半值(看从上数第三张图,先做了ssthresh=cwnd/2,然后这里做了cwnd=ssthresh,所以这里是刚好减半)。

总结

  • 慢启动过程中,可能以数次的指数增长过程来找到一个cwndcwndcwnd值,但这个cwndcwndcwnd值可能太过保守。
  • 拥塞避免过程中,以线性增长过程来增加cwndcwndcwnd值,以使得这个值既能相比慢启动结束时更大,也能保证整个网络不会拥塞。
  • 快速恢复则是一个中间状态,当连续收到3个及以上冗余ACK时会进入。如果timeout,那么回到慢启动;如果收到new ACK,那么回到拥塞避免。
  • 拥塞控制是加性增、乘性减的方式。

计算机网络 理解拥塞控制相关推荐

  1. 计算机网络TCP拥塞控制窗口大小变化、重传、滑动窗口、流量控制等

    转载自:[计算机网络] - TCP 重传.滑动窗口.流量控制.拥塞控制_3000~3500的数据早已被接收了,因为 ack 都到了 4000 了,已经意味着 4000 之前__浮生_的博客-CSDN博 ...

  2. tcp拥塞控制编程实验c语言代码,C语言 计算机网络TCP拥塞控制模拟程序

    帮助你更好地认识TCP拥塞控制的机制 #include "stdio.h" #include "stdlib.h" void show() { //system ...

  3. 计算机网络-TCP拥塞控制

    目录 1 拥塞概念 2 拥塞控制的一般原理 3 拥塞控制的方法 3.1 慢开始 (Slow start) 3.2 拥塞避免算法 3.3 快重传算法 3.4 快恢复算法 3.5 加法增大,乘法减小 (A ...

  4. 计算机网络 理解流量控制与SACK机制

    文章目录 从Telnet协议理解TCP的全双工 理解TCP的双工 理解TCP的全双工 流量控制 解释 示意图 接收方的实现 发送方的实现 三次握手时的窗口信息 Window size scaling ...

  5. 【计算机网络】第五部分 传输层(24) 拥塞控制和服务质量

    文章目录 24.1 数据通信量 24.1.1 通信量描述符 1. 平均数据速率 2. 峰值数据速率 3. 最大突发长度 4. 有效带宽 24.1.2 通信量特征值 1. 恒定比特率 2. 可变比特率 ...

  6. TCP拥塞控制和流量控制区别含义深刻理解

    TCP拥塞控制和流量控制区别含义深刻理解 因为最近学习了TCP/IP协议,学习TCP其中内部的两个很大的特点,就是流量控制和拥塞控制两个优化数据传输的方法,因为两者有很多细节的知识,所以再这里记录一下 ...

  7. 计算机网络-2020年期末复习提纲-概念类

    计算机网络-2020-期末复习提纲-概念类 制作:彭冠淇 郑霄汉(内容) 纪元(排版) 本提纲遵循CC-BY-NC-SA协议 (署名-非商业性-相同方式共享) 本提纲由讨论区答案整理而成,可能存在纰漏 ...

  8. 南邮-物联网院计算机网络学习笔记(2022年考试版)

    自行整理的笔记可能会有错误,且考点不一定覆盖完全 在小卖部打印时请以PDF形式打印并及时删除,若在打印店看见此资料可以拒绝付款 有侵权时请联系我处理,若笔记有做的不好的地方请见谅 <计算机网络& ...

  9. 面试热点|理解TCP/IP传输层拥塞控制算法

    来自:后端技术指南针 0x00.前言 这是TCP/IP协议栈系列的第二篇文章,之前的一篇理解TCP/IP协议栈之HTTP2.0感兴趣可以看下,今天一起来学习下一个热点问题. 通过本文你将了解到以下内容 ...

  10. 计算机网络-TCP协议

    目录 1 概述 2 TCP的主要特点 3 TCP的连接 4 可靠传输的工作原理 4.1 停止等待协议 4.1.1 无差错情况 4.1.2 出现差错 4.2 自动重传请求ARQ 4.3 连续 ARQ 协 ...

最新文章

  1. 共享内存简介和mmap 函数
  2. 采用SIMULINK SimPowerSystems的光伏并网阵列仿真
  3. MyBatis使用resultMap自定义映射规则与关联映射
  4. 经典算法(5)- 用二进制方法实现扩展的最大公约数(Extended GCD)
  5. 《Android进阶之光》--View体系与自定义View
  6. 江西省一级计算机考试试题,2江西省计算机一级考试试题
  7. 对应猎豹网校的lua 视频教程 做的学习记录 前三课简单介绍1-3
  8. 【Java编程思想笔记】-集合1
  9. 编译OpenJDK12:链接freelib时提示 LNK4044,无法识别的选项
  10. linux多个svn仓库权限管理,svn建立仓库而且设置用户的权限
  11. Bulk insert远程服务器导入sqlserver
  12. 常用服务器出厂默认管理口IP及账号密码
  13. node mysql菜鸟教程_Node.js 创建第一个应用
  14. c语言mod是什么意思,mod什么意思中文意思,Mod是什么意思
  15. 汽车维修企业管理【15】
  16. 论文专题笔记:part segmentation
  17. 操作系统与网络协议晦涩难懂,华为18级工程师神级文档助你过关
  18. 2019年安徽省学业水平考试计算机,2019年安徽高中学业水平考试信息技术与通用技..._报关水平_帮考网...
  19. Excel表格如何快速隔行填充指定颜色
  20. 信道容量、码率、带宽、频谱利用率

热门文章

  1. 视频捕获增加color space converter + Transform Filter
  2. 1223 Dice Roll Simulation
  3. 10个文献、期刊、论文、学术查找的学术网站整理
  4. IDEAIU-version2019.2百度网盘下载
  5. python26个保留字,Python保留字(关键字)一览表
  6. 10分钟教你用scratch做一款小游戏,玩游戏不如自己做游戏
  7. 用连续自然数之和来表达整数
  8. Numpy中的向量运算
  9. 用matlab绘制对数图像,matlab图像绘制(进阶篇)
  10. web前端是干嘛的?你了解Web前端开发工程师吗?