概述
拥塞控制的一般原理
在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种现象称为拥塞 (congestion)。
最坏结果:系统崩溃。
拥塞产生的原因
网络拥塞往往是由许多因素引起的。例如:
- 点缓存的容量太小;
- 链路的容量不足;
- 处理机处理的速率太慢;
- 拥塞本身会进一步加剧拥塞;
出现拥塞的原因:
∑ 对资源需求 > 可用资源
增加资源能解决拥塞吗?
- 不能。这是因为网络拥塞是一个非常复杂的问题。简单地采用上述做法,在许多情况下,不但不能解决拥塞问题,而且还可能使网络的性能更坏。
- 网络拥塞往往是由许多因素引起的。例如:
- 增大缓存,但未提高输出链路的容量和处理机的速度,排队等待时间将会大大增加,引起大量超时重传,解决不了网络拥塞;
- 提高处理机处理的速率会会将瓶颈转移到其他地方;
拥塞控制与流量控制的区别
- 拥塞控制
- 防止过多的数据注入到网络中,使网络中的路由器或链路不致过载;
- 是一个全局性的过程,涉及到与降低网络传输性能有关的所有因素。
- 流量控制
- 抑制发送端发送数据的速率,以使接收端来得及接收;
- 是点对点通信量的控制,是端到端的问题;
拥塞控制所起的作用
拥塞控制的一般原理
- 拥塞控制的前提:网络能够承受现有的网络负荷。
- 实践证明,拥塞控制是很难设计的,因为它是一个动态问题。
- 分组的丢失是网络发生拥塞的征兆而不是原因。
- 在许多情况下,甚至正是拥塞控制本身成为引起网络性能恶化、甚至发生死锁的原因。
开环控制和闭环控制
- 开环控制
- 在设计网络时,事先考虑周全,力求工作时不发生拥塞;
- 思路:力争避免发生拥塞。
- 闭环控制
- 基于反馈环路的概念;
- 根据网络当前的运行状态采取相应控制措施;
- 思路:在发生拥塞后,采取措施进行控制,消除拥塞。
闭环控制措施
(1) 监测网络系统,以便检测到拥塞在何时、何处发生。
(2) 将拥塞发生的信息传送到可采取行动的地方。
(3) 调整网络系统的运行以解决出现的问题。
监测网络的拥塞
主要指标有:
- 由于缺少缓存空间而被丢弃的分组的百分数;
- 平均队列长度;
- 超时重传的分组数;
- 平均分组时延;
- 分组时延的标准差,等等。
上述这些指标的上升都标志着拥塞的增长。
传递拥塞通知
- 发送通知拥塞发生的分组;
- 在分组中保留表示拥塞状态的字段;
- 周期性地发出探测分组等。
采取行动的时机
- 过于频繁,会使系统产生不稳定的振荡;
- 过于迟缓地采取行动又不具有任何实用价值。
解决拥塞的两条思路
- 增加网络可用资源;
- 减少用户对资源的需求。
TCP 的拥塞控制方法
- TCP 采用基于窗口的方法进行拥塞控制。该方法属于闭环控制方法。
- TCP发送方维持一个拥塞窗口 cwnd (Congestion Window)
- 发送端利用拥塞窗口根据网络的拥塞情况调整发送的数据量。
- 发送窗口大小不仅取决于接收方窗口,还取决于网络的拥塞状况,所以真正的发送窗口值为:
真正的发送窗口值 = Min (接收方窗口值,拥塞窗口值)
控制拥塞窗口的原则
- 只要网络没有出现拥塞,拥塞窗口就可以再增大一些,以便把更多的分组发送出去,这样就可以提高网络的利用率。
- 但只要网络出现拥塞或有可能出现拥塞,就必须把拥塞窗口减小一些,以减少注入到网络中的分组数,以便缓解网络出现的拥塞。
拥塞的判断
- 重传定时器超时
网络已经发生了拥塞。 - 收到三个重复的 ACK
预示网络可能会出现拥塞(实际可能还未发生拥塞)。
TCP拥塞控制算法
- 四种拥塞控制算法( RFC 5681) :
- 慢开始 (slow-start)
- 拥塞避免 (congestion avoidance)
- 快重传 (fast retransmit)
- 快恢复 (fast recovery)
- 目的:用来确定网络的负载能力或拥塞程度。
- 算法的思路:由小到大逐渐增大拥塞窗口数值。
- 两个变量:
- 拥塞窗口
初始拥塞窗口值:2 种设置方法。
1 至 2 个最大报文段 (旧标准)
2 至 4 个最大报文段 (RFC 5681)
窗口值逐渐增大。 - 慢开始门限
防止拥塞窗口增长过大引起网络拥塞。
- 拥塞窗口
慢开始 (Slow start)
- 拥塞窗口 cwnd 控制方法:在每收到一个对新的报文段的确认后,可以把拥塞窗口增加最多一个 SMSS 的数值。
拥塞窗口 cwnd 每次的增加量 = min (N, SMSS) - 其中 N 是原先未被确认的、但现在被刚收到的确认报文段所确认的字节数。
- 不难看出,当 N < SMSS 时,拥塞窗口每次的增加量要小于 SMSS。
- 用这样的方法逐步增大发送方的拥塞窗口 cwnd,可以使分组注入到网络的速率更加合理。
发送方每收到一个对新报文段的确认(重传的不算在内)就使 cwnd 加 1。
传输轮次- 使用慢开始算法后,每经过一个传输轮次 (transmission round),拥塞窗口 cwnd 就加倍。
- 一个传输轮次所经历的时间其实就是往返时间 RTT。
- “传输轮次”更加强调:把拥塞窗口 cwnd 所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认。
- 例如,拥塞窗口 cwnd = 4,这时的往返时间 RTT 就是发送方连续发送 4 个报文段,并收到这 4 个报文段的确认,总共经历的时间。
设置慢开始门限状态变量 ssthresh
- 慢开始门限 ssthresh 的用法如下:
当 cwnd < ssthresh 时,使用慢开始算法。
当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞避免算法。
拥塞避免算法
- 思路:让拥塞窗口 cwnd 缓慢地增大,避免出现拥塞。
- 每经过一个传输轮次,拥塞窗口 cwnd = cwnd + 1。
- 使拥塞窗口 cwnd 按线性规律缓慢增长。
- 在拥塞避免阶段,具有 “加法增大” (Additive Increase) 的特点。
在超时之前,每经过一个传输轮次就使 cwnd 加 1。
当网络出现拥塞时
- 无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(重传定时器超时):
- ssthresh = max (cwnd/2,2)
- cwnd = 1
- 执行慢开始算法
- 目的:迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。
快重传算法
- 发送方只要一连收到三个重复确认,就知道接收方确实没有收到报文段,因而应当立即进行重传(即“快重传”),这样就不会出现超时,发送方也不就会误认为出现了网络拥塞。
- 使用快重传可以使整个网络的吞吐量提高约20%。
不难看出,快重传并非取消重传计时器,而是在某些情况下可以更早地(更快地)重传丢失的报文段。
- 采用快重传 FR (Fast Retransmission) 算法可以让发送方尽早知道发生了个别报文段的丢失。
- 快重传 算法首先要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认。
快恢复算法
- 当发送端收到连续三个重复的确认时,由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,而是执行快恢复算法 FR (Fast Recovery) 算法:
- 慢开始门限 ssthresh = 当前拥塞窗口 cwnd / 2 ;
- 新拥塞窗口 cwnd = 慢开始门限 ssthresh ;
- 开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大。
加法增大,乘法减小 (AIMD)
- 可以看出,在拥塞避免阶段,拥塞窗口是按照线性规律增大的。这常称为“加法增大” AI (Additive Increase)。
- 当出现超时或3个重复的确认时,就要把门限值设置为当前拥塞窗口值的一半,并大大减小拥塞窗口的数值。这常称为“乘法减小”MD (Multiplicative Decrease)。
- 二者合在一起就是所谓的 AIMD 算法。
TCP拥塞控制流程图
发送窗口的上限值
-
发送方的发送窗口的上限值应当取为接收方窗口 rwnd 和拥塞窗口 cwnd 这两个变量中较小的一个,即应按以下公式确定:
发送窗口的上限值 = Min [rwnd, cwnd]
-
当 rwnd < cwnd 时,是接收方的接收能力限制发送窗口的最大值。
-
当 cwnd < rwnd 时,则是网络的拥塞限制发送窗口的最大值。
也就是说,rwnd 和 cwnd 中数值较小的一个,控制了发送方发送数据的速率。
主动队列管理 AQM
- TCP 拥塞控制和网络层采取的策略有密切联系。
- 若路由器对某些分组的处理时间特别长,那么这就可能使这些分组中的TCP- 报文段经过很长时间才能到达终点,结果引起发送方超时,对这些报文段进行重传。
- 重传会使 TCP 连接的发送端认为在网络中发生了拥塞,但实际上网络并没有发生拥塞。
- 对 TCP 拥塞控制影响最大的就是路由器的分组丢弃策略。
“先进先出”FIFO 处理规则
- 路由器的队列通常都是按照“先进先出”FIFO (First In First Out) 的规则处理到来的分组。
- 当队列已满时,以后再到达的所有分组(如果能够继续排队,这些分组都将排在队列的尾部)将都被丢弃。这就叫做尾部丢弃策略 (tail-drop policy)。
- 路由器的尾部丢弃往往会导致一连串分组的丢失,这就使发送方出现超时重传,使 TCP 进入拥塞控制的慢开始状态,结果使 TCP 连接的发送方突然把数据的发送速率降低到很小的数值。
先进先出规则与尾部丢弃策略
在最简单的情况下,路由器的队列通常采用
先进先出 (FIFO) 规则与尾部丢弃策略 (tail-drop policy)。
当队列已满时,以后再到达的所有分组将都被丢弃。
全局同步
- 更为严重的是,在网络中通常有很多的 TCP 连接,这些连接中的报文段通常是复用在网络层的 IP 数据报中传送的。
- 在这种情况下,若发生了路由器中的尾部丢弃,就可能会同时影响到很多条 TCP 连接,结果使这许多 TCP 连接在同一时间突然都进入到慢开始状态。这在 TCP 的术语中称为全局同步 (global syncronization)。
- 全局同步使得全网的通信量突然下降了很多,而在网络恢复正常后,其通信量又突然增大很多。
主动队列管理AQM
- 1998 年提出了主动队列管理 AQM (Active Queue Management)。
- 所谓“主动”就是不要等到路由器的队列长度已经达到最大值时才不得不丢弃后面到达的分组,而是在队列长度达到某个值得警惕的数值时(即当网络拥塞有了某些拥塞征兆时),就主动丢弃到达的分组。
- AQM 可以有不同实现方法,其中曾流行多年的就是随机早期检测 RED (Random Early Detection)。
随机早期检测 RED
- 使路由器的队列维持两个参数:队列长度最小门限 THmin 和最大门限 Thmax 。
- RED 对每一个到达的分组都先计算平均队列长度 LAV 。
- 若平均队列长度小于最小门限 THmin,则将新到达的分组放入队列进行排队。
- 若平均队列长度超过最大门限 Thmax ,则将新到达的分组丢弃。
- 若平均队列长度在最小门限 THmin 和最大门限 Thmax 之间,则按照某一概率 p 将新到达的分组丢弃。
RED 将路由器的到达队列划分成为三个区域:
当 LAV < Thmin 时,丢弃概率 p = 0。
当 LAV > Thmax 时,丢弃概率 p = 1。
当 Thmin < LAV Thmax时, 0 < p < 1 。
多年的实践证明,RED 的使用效果并不太理想。
2015 年公布的 RFC 7567 已经把 RFC 2309 列为“陈旧的”,并且不再推荐使用 RED。
对路由器进行主动队列管理 AQM 仍是必要的。
AQM 实际上就是对路由器中的分组排队进行智能管理,而不是简单地把队列的尾部丢弃。
现在已经有几种不同的算法来代替旧的 RED,但都还在实验阶段。
最后
以上就是雪白大雁为你收集整理的计算机网络 TCP的拥塞控制 详记的全部内容,希望文章能够帮你解决计算机网络 TCP的拥塞控制 详记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复