文章目录
TCP的拥塞控制
计算机网络中的链路容量(带宽)、交换节点中的缓存和处理机等都是网络的资源。
在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏 ,这种情况就叫作拥塞(congestion)。若出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降。
拥塞控制是 TCP 为了避免网络出现过载(拥塞)情况而采取的一种机制。在网络通信中,当发送的数据量超过网络的承载能力时,就会出现拥塞,导致数据包丢失、延迟增加等问题。
TCP 的拥塞控制 机制通过动态地调整发送方的发送速率,使网络中的数据流量保持在一个合理的水平,以提高网络资源的利用率和数据传输的效率,同时保证数据传输的可靠性。
慢启动和拥塞避免:
-
在TCP建立连接之后,发送方会采用慢启动算法逐渐增加发送窗口的大小,以便测试网络的拥塞程度。
-
如果网络出现拥塞,发送方会以指数增长的速度减小发送窗口的大小,从而减少发送速度,以避免网络拥塞的进一步加剧。
拥塞控制:
-
TCP使用拥塞控制算法来检测网络拥塞并相应地减少发送速度。
-
当网络出现拥塞时,发送方会采用拥塞避免算法,逐渐减小发送窗口的大小,以降低发送速度。
-
通过监测丢包和延迟,发送方可以判断网络的拥塞情况并相应地调整发送速度。
衡量网络拥塞的指标包括:
- 由于缓存溢出而丢弃的分组的百分比
- 路由器的平均队列长度
- 超时重传的分组数量
- 平均分组时延和分组时延的标准差
- ......
上述指标的上升,都标志着拥塞程度的增大
拥塞控制的基本方法
进行拥塞控制是需要付出代价的。可能需要在节点之间交换信息和各种命令 ,以便选择拥塞控制的策略并实施控制,这样会产生额外开销。还可能需要预留一些资源用于特殊用户或特殊情况,这样就降低了网络资源的共享程度。
然而,为了确保网络性能的稳定,不会因为输入负载的增长而导致网络性能的恶化甚至出现崩溃,使用拥塞控制而付出一定的代价是值得的。
流量控制与拥塞控制的区别
-
流量控制 的主要任务是:解决因发送方发送数据太快而导致接收方来不及接收,造成接收方的接收缓存溢出的问题。
-
拥塞控制 的主要任务是:防止过多的数据注入到网络中,使网络能够承受现有的网络负荷。
拥塞控制分类
拥塞控制分为开环控制 和闭环控制
-
当网络的流量特征可以准确规定 且性能要求可以事先获得 时,适合使用开环控制。
-
当网络的流量特征不能准确描述 或者当网络不提供资源预留 时,适合使用闭环控制。因特网采用的就是闭环控制方法。
闭环拥塞控制算法
根据拥塞信息的反馈形式,可将闭环拥塞控制算法分为显式反馈算法 和隐式反馈算法。
-
显式反馈算法 :从拥塞节点(即路由器)向源点提供关于网络中拥塞状态的显式反馈信息。
-
隐式反馈算法 :源点自身 通过对网络行为的观察(例如超时重传或往返时间
RTT
)来推断网络是否发生了拥塞。TCP 采用的就是隐式反馈算法。
TCP的四种拥塞控制方法(算法)
TCP的四种拥塞控制方法分别为:
- 慢开始 (slow-start)
- 拥塞避免 (congestion avoidance)
- 快重传 (fast retransmit)
- 快恢复 (fast recovery)
为了集中精力讨论用塞控制算法的基本原理,假定如下条件:
-
数据是单方向传送的,而另一个方向只传送确认。
-
接收方总是有足够大的接收缓存空间,因而发送方的发送窗口的大小仅由网络的拥塞程度来决定,也就是不考虑接收方对发送方的流量控制。
-
以TCP 最大报文段 MSS(即 TCP 报文段的数据载荷部分)的个数 作为讨论问题的单位,而不是以字节为单位(尽管TCP是面向字节流的)。
窗口
TCP 发送方要维护一个叫作发送窗口 的状态变量 swnd
,还要维护一个叫作拥塞窗口 的状态变量 cwnd
TCP 接收方要维护一个叫作接收窗口 的状态变量 rwnd
。
发送窗口 swnd
的取值为 s w n d = m i n ( c w n d , r w n d ) swnd=_{min}{(cwnd,rwnd)} swnd=min(cwnd,rwnd),发送方可将序号落入发送窗口 swnd
的数据连续发送出去。
-
拥塞窗口
cwnd
:取决于网络的拥塞程度和发送方所采用的 TCP 拥塞控制算法 -
接收窗口
rwnd
:取决于接收方可用的接收缓存的大小
-
cwnd 的维护原则:只要网络没有出现拥塞,拥塞窗口就再增大一些,但只要网络出现拥塞,拥塞窗口就减少一些。
-
判断网络出现拥塞的依据 :没有按时收到应当到达的TCP确认报文段而产生了超时重传。
慢开始门限
发送方还需要维护一个叫作慢开始门限 的状态变量 ssthresh
:
-
当
cwnd < ssthresh
时,使用慢开始算法。 -
当
cwnd > ssthresh
时,停止使用慢开始算法而改用拥塞避免算法。 -
当
cwnd = ssthresh
时,既可使用慢开始 算法,也可使用拥塞避免算法。
慢开始算法
在 TCP 双方建立连接时,拥塞窗口 cwnd
的初始值被设置为 1(初始为 1 个最大报文段长度 MSS
),这是因为主机刚开始发送数据时,完全不知道网络的拥塞情况,如果立即把大量的数据都注入网络中,就有可能引起网络拥塞。
较好的方法是由小到大逐渐增大发送方的拥塞窗口 cwnd 的数值,直到发生拥塞 。发送方每收到一个对新发送报文段的确认(ACK
),就会将拥塞窗口大小增加 1 个 MSS
,即拥塞窗口呈指数增长。
本例情况不考虑 TCP 流量控制的情况,假设慢开始门限 ssthresh
为 16。
拥塞避免算法
当发送方当前拥塞窗口 cwnd 的值,已经增大到了慢开始门限 ssthresh 的值 ,因此要改用拥塞避免算法 ,也就是每个传输轮次结束后,cwnd的值只能线性加 1。
发送过程中部分报文段发生了丢失,重传计时器超时,拥塞发送方以此判断网络可能出现了拥塞,需要调整自己的拥塞窗口 cwnd
的值和慢开始门限 ssthresh
的值。
将慢开始门限 ssthresh
的值调整为拥塞开始时拥塞窗口 cwnd
的值的一半 ,将拥塞窗口 cwnd
的值减小为 1 ,并重新开始执行慢开始算法 。当拥塞窗口 cwnd
的值,增大到了慢开始门限 ssthresh
的值,又重新改用拥塞避免算法。
绘制出本例的拥塞窗口 cwnd
的值随传输轮次 RTT
的变化关系图:
-
"慢开始 "是指一开始向网络注入的报文段少 ,而并不是指拥塞窗口
cwnd
的值增长速度慢。 -
"拥塞避免 "也并非指完全能够避免拥塞,而是指在拥塞避免阶段将cwnd值控制为按线性规律增长,使网络比较不容易出现拥塞。
快重传算法
有时,个别 TCP 报文段会在网络中丢失,但实际上网络并未发生拥塞,这将导致发送方超时重传,并误认为网络中发生了拥塞。
采用快重传算法 可以让发送方尽早知道发生个别TCP报文段的丢失
"快重传"是指使发送方尽快 (尽早)进行重传,而不是等重传计时器超时再重传,这就要求接收方不要等待自己发送数据时才进行捎带确认 ,而是要立即发送确认 ,即使收到了失序的报文段 也要立即发出 对已收到的报文段的重复确认。
a c k n ack_n ackn 表明序号到 n 为止的数据已正确接收 ,现在期望收到序号为 n+1 的数据。
发送方 一旦收到3个连续的重复确认 ,就将相应的报文段立即重传,而不是等该报文段的重传计时器超时再重传。
对于个别丢失的报文段,发送方不会出现超时重传,也就不会误认为出现了拥塞而错误地把拥塞窗口 cwnd
的值减为1。实践证明,使用快重传可以使整个网络的吞吐量提高约20%。
快恢复算法
与快重传算法配合使用的是快恢复算法 ,发送方一旦收到 3 个重复确认,就知道现在只是丢失了个别的报文段。于是不启动慢开始算法,而是执行快恢复算法。
发送方将慢开始门限 ssthresh
的值和拥塞窗口 cwnd
的值,都调整为当前 cwnd
值的一半 ,并开始执行拥塞避免算法。
也有的快恢复实现是把快恢复开始时的 cwnd
值再增大一些,即 cwnd = 新ssthresh + 3
:
-
既然发送方收到了 3 个重复的确认,就表明有 3 个数据报文段已经离开了网络。
-
这 3 个报文段不再消耗网络资源,而是停留在接收方的接收缓存中。
-
可见现在网络中不是堆积了报文段而是减少了 3 个报文段,因此可以适当把
cwnd
值增大一些。
本例的拥塞窗口 cwnd
的值随传输轮次 RTT
的变化关系图:
TCP拥塞控制的流程
TCP 拥塞控制仍然是计算机网络中的一个研究热点,TCP 拥塞控制算法也还在不断地发展和变化。
TCP拥塞控制与网际层拥塞控制的关系
路由器的输入缓存(可看作缓存队列,以下简称为队列)通常都按照先进先出 FIFO
的规则来处理到达的IP数据报。由于队列长度总是有限的,因此当队列已满时,之后再到达的所有IP数据报都将被丢弃 ,这就叫作 尾部丢弃策略。
为了避免网络中出现全局同步问题,在1998年提出了主动队列管理 (Active Queue Management,AQM )所谓"主动",就是在路由器的队列长度达到某个阈值但还未满时就主动丢弃IP数据报,而不是要等到路由器的队列已满时才不得不丢弃后面到达的IP数据报,这样就太被动了。
应当在路由器队列长度达到某个值得警惕的数值 时,也就是网络出现了某些拥塞征兆时 ,就主动丢弃到达的IP数据报来造成发送方的超时重传 ,进而降低发送方的发送速率,因而有可能减轻网络的拥塞程度甚至不出现网络拥塞。
主动队列管理 AQM
可以有不同的实现方法,其中曾流行多年的就是随机早期检测 (Random Early Detection,RED ),也称为随机早期丢奔(Random Early Drop,RED或 Random Early Discard,RED)。
路由器需要维护两个参数来实现RED:队列长度最小门限和最大门限。当每一个IP数据报到达路由器时,RED就按照规定的算法计算出当前的平均队列长度。
-
若平均队列长度小于最小门限 ,则把新到达的IP数据报存入队列进行排队。
-
若平均队列长度大于最大门限 ,则把新到达的IP数据报丢弃,
-
若平均队列长度在最小门限和最大门限之间,则按照某一丢弃概率p把新到达的IP数据报丢弃(这体现了丢弃IP数据报的随机性)
但使用 RED
机制效果并不理想,已被列为废弃。