TCP 的拥塞控制

概述

拥塞控制的一般原理
在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种现象称为拥塞 (congestion)。
最坏结果:系统崩溃。
image

拥塞产生的原因 ∑ 对资源需求 > 可用资源

常见拥塞产生的原因:

  • 点缓存的容量太小
  • 链路的容量不足
  • 处理机处理的速率太慢
  • 拥塞本身会进一步加剧拥塞

增加资源能解决拥塞吗? 不能。
这是因为网络拥塞是一个非常复杂的问题。简单地采用上述做法,在许多情况下,不但不能解决拥塞问题,而且还可能使网络的性能更坏。
网络拥塞往往是由许多因素引起的。例如:

增大缓存,但未提高输出链路的容量和处理机的速度,排队等待时间将会大大增加,引起大量超时重传,解决不了网络拥塞;
提高处理机处理的速率会会将瓶颈转移到其他地方;

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

定义

  • 拥塞控制防止过多的数据注入到网络中,使网络中的路由器或链路不致过载;
  • 流量控制抑制发送端发送数据的速率,以使接收端来得及接收;

需要步骤

  • 拥塞控制是一个全局性的过程,涉及到与降低网络传输性能有关的所有因素。

  • 流量控制是点对点通信量的控制,是端到端(两个端点的问题和中间环节无关)的问题;

联系: 流量控制做的好会大大降低拥塞;但是拥塞不仅仅和流量控制有关。

拥塞控制所起的作用

  1. 没有拥塞的时候 预防拥塞
  2. 即将拥塞时,减少流量
  3. 已经拥塞 防止损失

image

拥塞控制的一般原理

拥塞控制的前提:网络能够承受现有的网络负荷。
实践证明,拥塞控制是很难设计的,因为它是一个动态问题
分组的丢失是网络发生拥塞的征兆而不是原因。
在许多情况下,甚至正是拥塞控制本身成为引起网络性能恶化、甚至发生死锁的原因。

开环控制和闭环控制

开环控制
在设计网络时,事先考虑周全,力求工作时不发生拥塞;
思路:力争避免发生拥塞

闭环控制
基于反馈环路的概念;
根据网络当前的运行状态采取相应控制措施;
思路:在发生拥塞后,采取措施进行控制,消除拥塞

闭环控制

措施:

  1. 监测 监测网络系统,以便检测到拥塞在何时、何处发生。

  2. 传送 将拥塞发生的信息传送到可采取行动的地方。

  3. 调整 调整网络系统的运行以解决出现的问题。

(一)、监测 网络的拥塞
主要指标:

  1. 由于缺少缓存空间而被丢弃的分组的百分数;
  2. 平均队列长度;
  3. 超时重传的分组数;
  4. 平均分组时延;
  5. 分组时延的标准差,等等。

上述这些指标的上升都标志着拥塞的增长。

(二)、传送 拥塞通知

  1. 发送通知拥塞发生的分组;
  2. 在分组中保留表示拥塞状态的字段
  3. 周期性地发出探测分组等。

(三)、调整 网络运行
采取行动的时机难以选择

  • 过于频繁,会使系统产生不稳定的振荡;
  • 过于迟缓地采取行动又不具有任何实用价值。

解决拥塞的两条思路

  • 增加网络可用资源;
  • 减少用户对资源的需求。

TCP 拥塞控制方法

TCP 采用闭环控制中基于窗口的方法进行拥塞控制。

实现:

  • TCP发送方维持一个拥塞窗口 cwnd (Congestion Window)
  • 发送端利用拥塞窗口根据网络的拥塞情况调整发送的数据量。

注: 真正的发送窗口值 = Min (接收方窗口值,拥塞窗口值)`

控制拥塞窗口的原则

  1. 只要网络没有出现拥塞,拥塞窗口就可以再增大一些,以便把更多的分组发送出去,这样就可以提高网络的利用率。

  2. 但只要网络出现拥塞或有可能出现拥塞,就必须把拥塞窗口减小一些,以减少注入到网络中的分组数,以便缓解网络出现的拥塞。

拥塞的判断

  1. 重传定时器超时: 网络已经发生了拥塞。

  2. 收到三个重复的 ACK(确认报文) :预示网络可能会出现拥塞(实际可能还未发生拥塞)。

四种拥塞控制算法( RFC 5681) :
1.慢开始 (slow-start);2.拥塞避免 (congestion avoidance);
3.快重传 (fast retransmit);4.快恢复 (fast recovery)

慢开始

SMSS:发送者最大段大小 一般就是1

目的 用来确定网络的负载能力或拥塞程度。

算法思路 由小到大逐渐增大拥塞窗口数值。 维护两个变量:

  1. 拥塞窗口cwnd 初始拥塞窗口值:窗口值逐渐增大。
    在每收到一个对新的报文段的确认后: 把拥塞窗口增加最多一个 SMSS 的数值。
    拥塞窗口 cwnd 每次的增加量 = min (N, SMSS)(N:是原先未被确认的、但现在被刚收到的确认报文段所确认的字节数
    (重传的不算在内)

  2. 慢开始门限ssthresh 防止拥塞窗口增长过大引起网络拥塞。
    当 cwnd < ssthresh 时,使用慢开始算法。
    当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
    当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞避免算法。

用这样的方法逐步增大发送方的拥塞窗口cwnd,可以使分组注入到网络的速率更加合理。
流程图:
image

注:窗口大小按指数增加,不慢!

传输轮次

使用慢开始算法后,每经过一个传输轮次 (transmission round),拥塞窗口 cwnd 就加倍

一个传输轮次所经历的时间其实就是往返时间 RTT。
image

“传输轮次”更加强调
把拥塞窗口 cwnd 所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认。

例如,拥塞窗口 cwnd = 4
这时的往返时间 RTT 就是发送方连续发送 4 个报文段,并收到这 4 个报文段的确认,总共经历的时间。

拥塞避免算法

思路: 使拥塞窗口 cwnd 按线性规律缓慢增长,避免出现拥塞。

具体操作:
(一)、拥塞避免阶段 “加法增大”
每经过一个传输轮次,拥塞窗口 cwnd = cwnd + 1。

(二)、当网络出现拥塞时重传定时器超时
无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞:

  1. \(ssthresh = max (\frac{cwnd}{2},2)\)
  2. \(cwnd = 1\)
  3. 重新执行慢开始算法

目的: 迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。

注意:

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

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

image

  • 当 TCP 连接进行初始化时,将拥塞窗口置为 1。图中的窗口单位不使用字节而使用报文段。

  • 慢开始门限的初始值设置为 16 个报文段,即 ssthresh = 16。

  • 在执行慢开始算法时,拥塞窗口 cwnd=1,发送第一个报文段。

  • 发送方每收到一个对新报文段的确认 ACK,就把拥塞窗口值加 1,然后开始下一轮的传输(请注意,横坐标是传输轮次,不是时间)。因此拥塞窗口 cwnd 随着传输轮次按指数规律增长。

  • 当拥塞窗口 cwnd 增长到慢开始门限值 ssthresh 时(图中的点 ,此时拥塞窗口 cwnd = 16),就改为执行拥塞避免算法,拥塞窗口按线性规律增长。

  • 当拥塞窗口 cwnd = 24 时,网络出现了超时(图中的点 ),发送方判断为网络拥塞。于是调整门限值 ssthresh = cwnd / 2 = 12,同时设置拥塞窗口 cwnd = 1,进入慢开始阶段。

  • 按照慢开始算法,发送方每收到一个对新报文段的确认 ACK,就把拥塞窗口值加 1。

  • 当拥塞窗口 cwnd = ssthresh = 12 时(图中的点,这是新的 ssthresh 值),改为执行拥塞避免算法,拥塞窗口按线性规律增大。

  • 当拥塞窗口 cwnd = 16 时(图中的点),出现了一个新的情况,就是发送方一连收到 3 个对同一个报文段的重复确认(图中记为 3-ACK)。发送方改为执行快重传和快恢复算法

快重传算法

算法要求:

  • 发送方只要一连收到三个重复确认,就知道接收方确实没有收到报文段,因而应当立即进行重传(即“快重传”)。
    这样就不会出现超时,发送方也不就会误认为出现了网络拥塞。

  • 接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认
    即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认。

目的: 采用快重传 FR (Fast Retransmission) 算法可以让发送方尽早知道发生了个别报文段的丢失。

注:

  • 快重传并非取消重传计时器,而是在某些情况下可以更早地(更快地)重传丢失的报文段。
  • 使用快重传可以使整个网络的吞吐量提高约20%。


image

快恢复算法

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

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

快恢复和拥塞避免算法的实现举例

image
在图的点4,发送方知道现在只是丢失了个别的报文段。于是不启动慢开始,而是执行快恢复算法。这时,发送方调整门限值 ssthresh = cwnd / 2 = 8,同时设置拥塞窗口 cwnd = ssthresh = 8(见图中的点5),并开始执行拥塞避免算法。

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

TCP拥塞控制流程图

image

发送窗口的上限值

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

发送窗口的上限值 = Min [rwnd, cwnd]

当 rwnd < cwnd 时,是接收方的接收能力限制发送窗口的最大值。
当 cwnd < rwnd 时,则是网络的拥塞限制发送窗口的最大值。

也就是说,rwnd 和 cwnd 中数值较小的一个,控制了发送方发送数据的速率。

主动队列管理 AQM

TCP 拥塞控制和网络层采取的策略有密切联系。
若路由器对某些分组的处理时间特别长,那么这就可能使这些分组中的TCP报文段经过很长时间才能到达终点,结果引起发送方超时,对这些报文段进行重传。
重传会使 TCP 连接的发送端认为在网络中发生了拥塞,但实际上网络并没有发生拥塞。
对 TCP 拥塞控制影响最大的就是路由器的分组丢弃策略。

posted @ 2022-11-01 08:13  kingwzun  阅读(577)  评论(0编辑  收藏  举报