版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45795744/article/details/123083507
————————————————
拥塞控制的一般原理
- 在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏-产生拥塞。
- 出现网络拥塞的条件:对资源需求的总和 > 可用资源
- 若网络中有许多资源同时产生拥塞,网络的性能就要明显变坏,整个网络的吞吐量将随输入负荷的增发而下降。
拥塞控制与流量控制的关系
- 拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路过载。
- 拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。
- 流量控制往往指在给定的发送端和接受端之间点对点通信量的控制。
- 流量控制所要做的就是抑制发送端发送数据的速率,以便使接受端来得及接收数据。
TCP的拥塞控制
拥塞控制主要包含四个方面:
- 满开始
- 拥塞避免
- 快重传
- 快恢复
这四点分别代表什么将在拥塞避免算法的实例中讲解,以便我们理解记忆。
首先我们了解一下两个窗口:
- 接收窗口RWnd:是指就手段根据其目前的最大缓存大小所许诺的最新的窗口值,是来自接受端的流量控制
- 拥塞窗口CWnd:是发送端根据自己估计的网络拥塞程序而设置的窗口值,是来自发送端的流量控制。
发送端的发送窗口的上限值应当取为接收端窗口RWnd和拥塞窗口CWnd这两个变量中较小的一个。
即:Swnd = Min(RWnd, CWnd)
慢开始和拥塞避免算法的实现举例
TCP拥塞控制算法的操作可以划分为三个阶段:
阶段一:慢开始生长阶段
- 连接建立时拥塞窗口初始值为该连接允许的一个最大段长MSS。设置初始门限值(ssthreh)
- 一个最大段长的TCP段,若正确确认,拥塞窗口变为最大段长的两倍。
- 发出(拥塞窗口/最大段长)最大长度的TCP段,若都得到确认,则拥塞窗口加倍
- 重复上一步,直至发生丢包超时事件,或者拥塞窗口大于门限值。
不理解没关系,看图
当TCP 连接进行初始化时,将拥塞窗口置为 1 .图中的窗口单位为报文段。
慢开始的门限的初始值设置为 16 个报文段,即ssthresh = 16
在执行慢开始算法时,拥塞窗口cwnd的初始值为1,发送一个报文段M0。
发送端收到 ACK1 (确认M0,期望收到M1)后,将cwnd 从 1 增大到 2 , 于是发送可以接着发送 M1和 M2 两个报文段
接受端发回ACK2 和 ACK3。发送端每收到一个对应的报文段的确认 ACK 就把发送端的拥塞窗口加 1 ,即变为原来的两倍 ,现在发送端的cwnd 从2 增大到4.
发送端每收到一个对新报文的确认ACK就把发送端的拥塞窗口加1,因此 拥塞窗口swnd 随着传输次数按指数规律增长
阶段二:拥塞避免阶段
当拥塞窗口cwnd增长到慢开始门限值 ssthresh时(即当 cwnd = 16 时),就改为执行拥塞避免算法,拥塞窗口按线性规律增长。每次窗口大小加1
阶段三:控制阶段
拥塞窗口不可能无限制地增加。当TCP检测到网络拥塞的时候(超时或者重复的确认出现)拥塞窗口停止增加,拥塞控制进入第三阶段。
- 首先把门限值 ssthresh 设置为当前发送窗口(拥塞窗口和通告窗口的最小值)的一半 swnd/2
- 接着把拥塞窗口设置长一个最大段长cwnd = 1 MSS
- 然后重新开始慢开始算法
假定拥塞窗口的数值增长到 24 时,网络出现超时
更新后的 ssthresh 值变为12 (24的一半),拥塞窗口的值重新设置为1,并执行慢开始算法。
当 cwnd = 12 时 执行拥塞避免算法,拥塞窗口按线性规律增长,每经过一个往返时延就增加一个MSS的大小
乘法减小
- 是指不论在慢开始阶段还是拥塞避免阶段,只要出现一次超时,就把慢开始门限设置为当前拥塞窗口的值乘 0.5
- 当网络频繁出现拥塞时, ssthresh 值就下降的很快,以大大减少注入到网络中的分组数
加法增大
- 加法增大是指执行拥塞避免算法后,当收到对所有报文段的确认就将拥塞窗口cwnd 增加一个MSS 大小,使拥塞窗口 cwbd增加 一个MSS 大小,使拥塞窗口缓慢增大,以防止网络过早出现拥塞。
快重传机制
- 快重传规定,发送端只要一连收到三个重复的ACK即可断定有分组丢失了,就应立即重传丢失的报文而不必继续等待为该报文段设置重传计时器的超时
- 快重传并非取消重传计时器,而是在某些情况下可更早地重传丢失地报文段
举例:
快恢复算法
- 当发送端收到连续三个重复地ACK使,就重新设置开始门限 ssthresh。变为原来的一半
- 与慢开始不同之处使拥塞窗口 cwnd不是设置为 1 ,而是设置为ssrhresh + 3 × MSS
- 若收到地重复地 ACK 为 n个 。则将cwnd 设置为 ssthresh + n × MSS
- 若发送窗口值还容许发送报文段,就按照拥塞避免算法继续发送报文段
- 若收到了确认新地报文段地 ACK ,就将 swnd 缩小到 ssthresh。(直至收到对丢失报文段和其后若干报文段的累积确认后,置cwnd=ssthresh,进入拥塞避免阶段。)