07-传输层(6)

TCP 拥塞控制

拥塞控制的一般原理

引入

  • 在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种现象称为拥塞 (congestion)
  • 若网络中有许多资源同时产生拥塞,网络的性能就要明显变坏,整个网络的吞吐量将随输入负荷的增大而下降
  • 出现拥塞的原因:∑对资源需求 > 可用资源

增加资源能解决拥塞吗?

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

拥塞控制所起的作用

  • 实践证明,拥塞控制是很难设计的,因为它是一个动态的(而不是静态的)问题
  • 当前网络正朝着高速化的方向发展,这很容易出现缓存不够大而造成分组的丢失。但分组的丢失是网络发生拥塞的征兆而不是原因
  • 在许多情况下,甚至正是拥塞控制本身成为引起网络性能恶化甚至发生死锁的原因。这点应特别引起重视

开环控制和闭环控制

  • 开环控制方法:就是在设计网络时事先将有关发生拥塞的因素考虑周到,力求网络在工作时不产生拥塞
  • 闭环控制方法:基于 [反馈环路] 的概念。属于闭环控制的有以下几种措施:
    • 监测网络系统以便检测到拥塞在何时、何处发生
    • 将拥塞发生的信息传送到可采取行动的地方
    • 调整网络系统的运行以解决出现的问题

监测网络的拥塞的指标

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

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

拥塞控制与流量控制

  • 拥塞控制
    • 拥塞控制就是防止过多的数据注入到网络中,使网络中的路由器或链路不致过载
    • 拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷
    • 拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素
  • 流量控制
    • 流量控制往往指点对点通信量的控制,是个端到端的问题(接收端控制发送端)
    • 流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收
  • 二者区别
    • 拥塞控制和流量控制之所以常常被弄混,是因为某些拥塞控制算法是向发送端发送控制报文,并告诉发送端,网络已出现麻烦,必须放慢发送速率。这点又和流量控制是很相似的
    • 流量控制是接收端收不过来了,让你发慢点;拥塞控制是接收两端都慢点,网堵了

TCP 的拥塞控制方法

概述

  • TCP 采用基于窗口的方法进行拥塞控制。该方法属于 "闭环控制方法"。
  • TCP 发送方维持一个拥塞窗口 CWND (Congestion Window)
  • 拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送端利用拥塞窗口根据网络的拥塞情况调整发送的数据量。
  • 所以,发送窗口大小不仅取决于接收方公告的接收窗口,还取决于网络的拥塞状况,所以真正的发送窗口值为:Min(公告窗口值,拥塞窗口值)

控制拥塞窗口的原则

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

拥塞的判断

【重传定时器超时】现在通信线路的传输质量一般都很好,因传输出差错而丢弃分组的概率是很小的(远小于 1 %)。只要出现了超时,就可以猜想网络可能出现了拥塞。

【收到三个相同(重复)的 ACK】个别报文段会在网络中丢失,预示可能会出现拥塞(实际未发生拥塞),因此可以尽快采取控制措施,避免拥塞。

拥塞控制算法

慢开始

  • 用来确定网络的负载能力
  • 算法思路:由小到大逐渐增大 [拥塞窗口cwnd] 数值
  • 初始拥塞窗口 cwnd 设置
    • 旧的:在刚刚开始发送报文段时,先把初始拥塞窗口cwnd 设置为 1 至 2 个发送方的最大报文段 SMSS (Sender Maximum Segment Size) 的数值
    • 新的:把初始拥塞窗口 cwnd 设置为不超过 2 至 4 个 SMSS 的数值
  • 传输轮次
    • 使用慢开始算法后,每经过一个传输轮次 (transmission round),拥塞窗口 cwnd 就加倍 // 慢开始算法
    • 一个传输轮次所经历的时间其实就是往返时间 RTT
    • "传输轮次"更加强调:把拥塞窗口 cwnd 所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认
    • 例如,拥塞窗口 cwnd = 4,这时的往返时间 RTT 就是发送方连续发送 4 个报文段,并收到这 4 个报文段的确认,总共经历的时间。

顺便指出,上图只是为了说明慢开始的原理。在 TCP 的实际运行中,发送方只要收到一个对新报文段的确认,其拥塞窗口 cwnd 就立即加 1,并可以立即发送新的报文段,而不需要等这个轮次中所有的确认都收到后(上图所示的那样)再发送新的报文。


为了防止 [拥塞窗口cwnd] 增长过大引起网络拥塞,而设置的一个慢开始门限 ssthresh状态变量。用法如下:

  • 当 cwnd < ssthresh 时,使用 {慢开始算法}
  • 当 cwnd > ssthresh 时,停止使用 {慢开始算法} 而改用 {拥塞避免算法}
  • 当 cwnd = ssthresh 时,既可使用 {慢开始算法},也可使用 {拥塞避免算法}

变量值的设置:

  • 默认慢开始门限 ssthresh = 16
  • 新的慢开始门限 = 出现丢包时的拥塞窗口的 1/2

拥塞避免

  • 算法思路
    • cwnd = ssthresh 时,让拥塞窗口 cwnd 缓慢地增大,即每经过一个往返时间 RTT 就把发送方的拥塞窗口 cwnd 加 1,而不是加倍,使拥塞窗口 cwnd 按线性规律缓慢增长
    • 因此在拥塞避免阶段就有"加法增大" (Additive Increase) 的特点
    • 这表明在拥塞避免阶段,拥塞窗口 cwnd 按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢得多
  • 注意!"拥塞避免"并非指完全能够避免了拥塞
    • 利用以上的措施要完全避免网络拥塞还是不可能的
    • "拥塞避免"是说在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞
  • 当网络出现拥塞时,无论在慢开始阶段还是拥塞避免阶段,只要发送方判断网络出现拥塞(重传定时器超时),便执行如下步骤。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。
    • cwnd = 1
    • ssthresh = max(cwnd/2,2)
    • 执行慢开始算法

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




快重传

  • 采用快重传 FR(Fast Retransmission) 算法可以让发送方尽早知道发生了个别报文段的丢失
  • 快重传算法首先要求接收方不要等待到累计确认时才进行捎带确认,而是要立即连续发送 3 个确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认
  • 发送方只要一连收到 3 个重复确认,就知道接收方确实没有收到报文段,因而应当立即进行重传(即"快重传"),这样就不会出现超时,发送方也不就会误认为出现了网络拥塞
  • 不难看出,快重传并非取消重传计时器,而是在某些情况下可更早地重传丢失的报文段

快恢复

  • 当发送端收到连续 3 个重复的确认时,由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行 {慢开始算法},而是执行 {快恢复算法 FR (Fast Recovery)}
    • 慢开始门限 ssthresh = 当前拥塞窗口 cwnd / 2
    • 新拥塞窗口 cwnd = 慢开始门限 ssthresh
    • 开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大
  • 从连续收到 3 个重复的确认转入拥塞避免
  • 加法增大,乘法减小 (AIMD)
    • 可以看出,在拥塞避免阶段,拥塞窗口是按照线性规律增大的。这常称为 "AI 加法增大" (Additive Increase)
    • 当出现超时或 3 个重复的确认时,就要把门限值设置为当前拥塞窗口值的一半,并大大减小拥塞窗口的数值。这常称为 "MD 乘法减小" (Multiplicative Decrease)
    • 二者合在一起就是所谓的 AIMD 算法

TCP 拥塞控制流程图

发送窗口的上限值

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

  • 当 rwnd < cwnd 时,是接收方的接收能力限制发送窗口的最大值
  • 当 cwnd < rwnd 时,则是网络的拥塞限制发送窗口的最大值
原文地址:https://www.cnblogs.com/liujiaqi1101/p/13628402.html