目录

  • 1 拥塞概念
  • 2 拥塞控制的一般原理
  • 3 拥塞控制的方法
    • 3.1 慢开始 (Slow start)
    • 3.2 拥塞避免算法
    • 3.3 快重传算法
    • 3.4 快恢复算法
    • 3.5 加法增大,乘法减小 (AIMD)
    • 3.6 拥塞控制流程图
    • 3.7 发送窗口的上限值

1 拥塞概念

  • 在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种现象称为拥塞 (congestion)
  • 若网络中有许多资源同时产生拥塞,网络的性能就要明显变坏,整个网络的吞吐量将随输入负荷的增大而下降
  • 出现拥塞的原因:∑ 对资源需求 > 可用资源,这里的资源包括很多方面,比如路由器的缓存、路由器的处理速度、通信线路的容量等等
  • 拥塞的现象和堵车的现象有点相似,比如出现堵车有一个原因就是道路不够宽,我们红绿灯的交替速度不够快等等诸多方面元素

既然拥塞是因为可用资源不足,那么增加资源是否可以解决拥塞现象?

  • 不可以
  • 这是因为网络拥塞是一个非常复杂的问题。简单地采用上述做法,在许多情况下,不但不能解决拥塞问题,而且还可能使网络的性能更坏
  • 如增大缓存,但未提高输出链路的容量和处理机的速度,排队等待时间将会大大增加,引起大量超时重传,会进一步的加剧拥塞,解决不了网络拥塞
  • 如果一个路由器没有足够的缓存空间,它就会丢弃一些新到的分组,但当分组被丢弃时,发送这一分组的源点就会重传这一分组,甚至可能还要車传多次。这样会引起更多的分组流入网络和被网络中的路由器丢弃
  • 如提高处理机处理的速率会会将瓶颈转移到其他地方,只提高某一方面是不可能提高整体效率的,那么限制堵车的办法不是多修路,而是限制车到路上

拥塞控制与流量控制的区别:

  • 拥塞控制:对全局的每一个发送端进行控制
  • 流量控制:对单一的发送端进行控制

2 拥塞控制的一般原理

  • 对理想的拥塞控制在达到资源上限之前,网络的吞吐量是平稳上升的,而达到最高点之后,整个网络的吞吐量可在最高点延续,这个时候哪怕有更多的分组注入网络,也能够以最高的吞吐量进行发送和接收数据
  • 实际的拥塞控制不可能达到理想拥塞控制的效果,随着注入网络的分组增加,吞吐量会逐渐增加,但达不到上限
  • 在设计拥塞算法时,由于拥塞都是动态的,每一时刻的可用资源和需求资源都是动态变化的,所以无法明确的确定一个边界,由于拥塞控制是一个全局问题,而发送方的一点无法获取到全局的网络状况,所以这使得拥塞控制的设计极为复杂

在设计拥塞控制算法时,有两类控制方法:

  1. 开环控制:事先将有关发生拥塞的因素都考虑周到,力求在网络工作的时候不发生拥塞,这需要全面的考虑到各方面原因并以参数的形式将其设计到算法中来
  2. 闭环控制:监测网络系统,以便检测到拥塞在何时、何处发生,将拥塞发生的信息传送到可采取行动的地方,通常是发送方或中间路由器,调整网络系统的运行以解决出现的问题,比如可以限制发送方发送报文的速度,通常闭环控制是最常用的控制方式

3 拥塞控制的方法

  • TCP 采用基于窗口的方法进行拥塞控制。该方法属于闭环控制方法
  • TCP发送方维持一个拥塞窗口 cwnd (Congestion Window)
  • 发送端利用拥塞窗口根据网络的拥塞情况调整发送的数据量
  • 发送窗口大小不仅取决于接收方窗口,还取决于网络的拥塞状况,所以真正的发送窗口值为:真正的发送窗口值 = Min (接收方窗口值,拥塞窗口值)

控制拥塞窗口的原则:

  • 只要网络没有出现拥塞,拥塞窗口就可以再增大一些,以便把更多的分组发送出去,这样就可以提高网络的利用率
  • 但只要网络出现拥塞或有可能出现拥塞,就必须把拥塞窗口减小一些,以减少注入到网络中的分组数,以便缓解网络出现的拥塞

拥塞的判断:

  • 重传定时器超时:现在通信线路的传输质量一般都很好,因传输岀差错而丟弃分组的概率是很小的(远小于1%)。只要出现了超时,就可以猜想网络可能出现了拥塞
  • 收到三个相同(重复)的ACK:个别报文段会在网络中丢失,预示可能会出现拥塞(实际未发生拥塞),因此可以尽快采取控制措施,避免拥塞

TCP拥塞控制算法分为四种,分别用于数据传输的不同阶段:

  1. 慢开始 (slow-start)
  2. 拥塞避免 (congestion avoidance)
  3. 快重传 (fast retransmit)
  4. 快恢复 (fast recovery)

3.1 慢开始 (Slow start)

  • 目的:用来确定网络的负载能力或拥塞程度
  • 算法的思路:由小到大逐渐增大拥塞窗口数值
  • 初始拥塞窗口cwnd设置:旧的规定在刚刚开始发送报文段时,先把初始拥塞窗口cwnd设置为1至2个发送方的最大报文段SMSS( Sender Maximum Segment Size)的数值,新的RFC5681把初始拥塞窗口cwnd设置为不超过2至4个SMSS的数值
  • 慢开始门限 ssthresh(状态变量):防止拥塞窗口cwnd增长过大引起网络拥塞,当我们发送的报文段数量达到慢开始门限后,就会从慢开始阶段转换为拥塞避免阶段

慢开始门限 ssthresh 的用法如下

  • 当 cwnd < ssthresh 时,使用慢开始算法
  • 当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法
  • 当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞避免算法
  • 拥塞窗口 cwnd 控制方法:在每收到一个对新的报文段的确认后,可以把拥塞窗口增加最多一个 SMSS 的数值,拥塞窗口 cwnd 每次的增加量 = min (N, SMSS),即在N和SMSS之中取一个最小值,其中 N 是原先未被确认的、但现在被刚收到的确认报文段所确认的字节数,不难看出,当 N < SMSS 时,拥塞窗口每次的增加量要小于 SMSS。用这样的方法逐步增大发送方的拥塞窗口 cwnd,可以使分组注入到网络的速率更加合理

传输轮次

  • 使用慢开始算法后,每经过一个传输轮次 (transmission round),拥塞窗口 cwnd 就加倍
  • 一个传输轮次所经历的时间其实就是往返时间 RTT
  • “传输轮次”更加强调:把拥塞窗口 cwnd 所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认
  • 例如,拥塞窗口 cwnd = 4,这时的往返时间 RTT 就是发送方连续发送 4 个报文段,并收到这 4 个报文段的确认,总共经历的时间

3.2 拥塞避免算法

首先要提出一点,拥塞避免算法并不是完全避免拥塞,而是让拥塞来的更慢一些

  • 思路:让拥塞窗口cwnd缓慢地增大,即毎经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍,使拥塞窗口cwnd按线性规律缓慢增长
  • 因此在拥塞避免阶段就有“加法增大”( Additive Increase)的特点。这表明在拥塞避免阶段,拥塞窗口cwnd按线性规律缓慢增长,比慢开始算法的拥基窗口增长速率缓馒得多

当网络出现拥塞时:

  • 无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(重传定时器超时
  • ssthresh = max (cwnd/2,2)
  • cwnd = 1
  • 执行慢开始算法,也就是说当进入了拥塞状态,会重新调整ssthresh和cwnd 大小并重新进入慢开始阶段
  • 目的:迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕

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

  1. 在执行慢开始算法时,拥塞窗口 cwnd=1,发送第一个报文段
  2. 发送方每收到一个对新报文段的确认 ACK,就把拥塞窗口值加 1,然后开始下一轮的传输(请注意,横坐标是传输轮次,不是时间)。因此拥塞窗口 cwnd 随着传输轮次按指数规律增长
  3. 当拥塞窗口 cwnd 增长到慢开始门限值 ssthresh 时(图中的点❶ ,此时拥塞窗口 cwnd = 16),就改为执行拥塞避免算法,拥塞窗口按线性规律增长
  4. 当拥塞窗口 cwnd = 24 时,网络出现了超时(图中的点❷ ),发送方判断为网络拥塞。于是调整门限值 ssthresh = cwnd / 2 = 12,同时设置拥塞窗口 cwnd = 1,进入慢开始阶段
  5. 按照慢开始算法,发送方每收到一个对新报文段的确认 ACK,就把拥塞窗口值加 1 当拥塞窗口 cwnd = ssthresh = 12 时(图中的点❸,这是新的 ssthresh 值),改为执行拥塞避免算法,拥塞窗口按线性规律增大
  6. 当拥塞窗口 cwnd = 16 时(图中的点❹),出现了一个新的情况,就是发送方一连收到 3 个对同一个报文段的重复确认(图中记为 3-ACK)。发送方改为执行快重传快恢复算法

注意:

  • “拥塞避免”并非指完全能够避免了拥塞。利用以上的措施要完全避免网络拥塞还是不可能的
  • “拥塞避免”是说在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞

3.3 快重传算法

  • 快重传和快恢复的目的,是为了防止因为报文段丢失重新进入到慢启动的过程,通过收到3-ACK(接收3次对同一报文的确认)判断
  • 发送方只要一连收到三个重复确认,就知道接收方确实没有收到报文段,因而应当立即进行重传(即“快重传”),这样就不会出现超时,发送方也不就会误认为出现了网络拥塞
  • 采用快重传 FR (Fast Retransmission) 算法可以让发送方尽早知道发生了个别报文段的丢失
  • 快重传 算法首先要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认

快重传举例

  • 发送方发送M3时传输过程中M3丢失,但是接收方接收到了M4报文段,那么接收方必须对M2进行重复的确认
  • 当发送方接收到连续3个对M2的确认后,发送方就知道了接收方没有接收到M3,应当立即重传M3,这也就是快重传的由来
  • 这样也不会出现超时,发送方也不会认为这是网络拥塞

3.4 快恢复算法

当发送端收到连续三个重复的确认时,由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,而是执行快恢复算法 FR (Fast Recovery) 算法:

  • 慢开始门限 ssthresh = 当前拥塞窗口 cwnd / 2
  • 新拥塞窗口 cwnd = 慢开始门限 ssthresh
  • 开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大

3.5 加法增大,乘法减小 (AIMD)

  • 可以看出,在拥塞避免阶段,拥塞窗口是按照线性规律增大的。这常称为“加法增大” AI (Additive Increase)
  • 当出现超时或3个重复的确认时,就要把门限值设置为当前拥塞窗口值的一半,并大大减小拥塞窗口的数值。这常称为“乘法减小”MD (Multiplicative Decrease)
  • 二者合在一起就是所谓的 AIMD 算法

3.6 拥塞控制流程图

3.7 发送窗口的上限值

  • 发送方的发送窗口的上限值应当取为接收方窗口 rwnd 和拥塞窗口 cwnd 这两个变量中较小的一个,即应按以下公式确定:发送窗口的上限值 = Min [rwnd, cwnd]
  • 当 rwnd < cwnd 时,是接收方的接收能力限制发送窗口的最大值
  • 当 cwnd < rwnd 时,则是网络的拥塞限制发送窗口的最大值
  • 也就是说,rwnd 和 cwnd 中数值较小的一个,控制了发送方发送数据的速率

计算机网络-TCP拥塞控制相关推荐

  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 TCP的主要特点 3 TCP的连接 4 可靠传输的工作原理 4.1 停止等待协议 4.1.1 无差错情况 4.1.2 出现差错 4.2 自动重传请求ARQ 4.3 连续 ARQ 协 ...

  4. 【计算机网络】传输层 : 总结 ( TCP / UDP 协议 | 寻址与端口 | UDP 协议 | TCP 协议特点 | TCP 连接释放 | TCP 流量控制 | TCP 拥塞控制 ) ★★★

    文章目录 一.传输层 TCP / UDP 协议 ★ 二.寻址端口号 ★ 三.UDP 协议特点 四.UDP 协议首部格式 五.UDP 校验 六.TCP 协议 特点 ★ 七.TCP 报文段首部格式 八.T ...

  5. 【计算机网络】传输层 : TCP 拥塞控制 ( 慢开始 | 拥塞避免 | 快重传 | 快恢复 )

    文章目录 一.TCP 拥塞控制 二.TCP 拥塞控制算法 三.慢开始 和 拥塞避免 算法 四.快重传 和 快回复 算法 一.TCP 拥塞控制 TCP 拥塞控制 : ① 拥塞出现表现 : 资源需求总和 ...

  6. 计算机网络-基本概念(9)【传输层】TCP拥塞控制 【网络层】拥塞避免

    TCP拥塞控制 对网络中某一资源的需求超过了该资源(带宽.交换节点中的缓存.处理机)所能提供的可用部分.防止过多的数据注入网络中,防止路由器或链路过载,是属于全局性的过程,包括主机.路由器.链路等设备 ...

  7. 计算机网络之传输层:7、TCP拥塞控制

    传输层:7.TCP拥塞控制 TCP拥塞控制: 拥塞控制算法: 慢开始和拥塞避免: 快重传和快恢复: TCP拥塞控制算法综合: TCP拥塞控制: 拥塞控制算法: 发送方维持一个叫做拥塞窗口(cwnd) ...

  8. 【计算机网络】TCP拥塞控制,分析拥塞控制的流程

    什么是拥塞?如何解决拥塞? 拥塞 :网络中某资源资源的需求超过了该资源所能提供的可用部分 为什么增加资源不能解决拥塞? 简单来说,出现拥塞就是:需求 > 供给 那么增大供给量,不就可以解决拥塞了 ...

  9. 计算机网络---TCP流量控制和拥塞控制

    (一) TCP 流量控制 TCP提供流量控制服务来消除发送方(发送速率太快)使接收方缓存区溢出的可能性,因此 流量控制是一个速度匹配服务(让发送方慢一点,要让接收方来得及接收,实现匹配发送方的发送速率 ...

最新文章

  1. Java axis 配置host_Java AxisProperties类代码示例
  2. “AI让老百姓最多跑一次”:智源科学家打造下一代政务服务智能助手
  3. yii2的model数据库配置以及应用(主从数据库配置)
  4. 【 MATLAB 】使用 filter 函数产生给定线性时不变系统的单位阶跃响应
  5. SASS的一些使用体会(安装-配置-开启firefox的调试)
  6. 什么东西都要用一句话总结出来:这是最重要的
  7. 数据集 | 计算机视觉开源数据集(计算机视觉图像、定位、识别)
  8. ubuntu下gcc的安装与使用
  9. Mac中安装Node和版本控制工具nvm遇到的坑
  10. 【C/C++】Linux下使用system()函数一定要谨慎
  11. treeset java_Java TreeSet pollLast()方法与示例
  12. python:第一个简单爬虫程序
  13. 学习Haskell的一些资料
  14. 用JS实现简单的省市联动
  15. 大数据分析方法有哪些
  16. VS2013 安装及问题解决
  17. android+5.1+root,最新的安卓5.1.1 ROOT教程(不需要刷第三方内核)
  18. python kayb算法之从一组序列当中获取一组与目标值最接近的算法
  19. 通信基础笔记 ----奈奎斯特和香农定理
  20. 最新全国省市(简称) json文件

热门文章

  1. IIS7.5中神秘的ApplicationPoolIdentity
  2. CString, BSTR, LPCTSTR之间得关系和区别
  3. 浏览器根据什么来判定脚本失控?
  4. js在firefox中的问题
  5. kali linux状态栏显示网速
  6. COJ 2192: Wells弹键盘 (dp)
  7. 控件自定义和QQ皮肤
  8. Eclipse反编译插件安装
  9. 懒加载中进行字典转模型
  10. poj(百练) 2743解题报告