【转】运输层:TCP 拥塞控制

 

原文:https://www.cnblogs.com/linfangnan/p/13369615.html

-----------------------------------------------------------------------------------------------------

 

禁止码迷,布布扣,豌豆代理,码农教程,爱码网等第三方爬虫网站爬取!

 

TCP 拥塞控制#

TCP 采用基于窗口的方法进行拥塞控制,该方法属于闭环控制方法。TCP发送方维持一个拥塞窗口 CWND (Congestion Window),拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送端利用拥塞窗口根据网络的拥塞情况,调整发送的数据量。所以发送窗口大小不仅取决于接收方公告的接收窗口,还取决于网络的拥塞状况。只要网络没有出现拥塞,拥塞窗口就可以再增大一些,以便把更多的分组发送出去,这样就可以提高网络的利用率。但只要网络出现拥塞或有可能出现拥塞,就必须把拥塞窗口减小一些,以减少注入到网络中的分组数,以便缓解网络出现的拥塞。判断拥塞主要通过 2 种情况:

  1. 重传定时器超时:现在通信线路的传输质量一般都很好,因传输出差错而丢弃分组的概率是很小的(远小于 1 %)。只要出现了超时,就可以猜想网络可能出现了拥塞。
  2. 收到三个相同(重复)的 ACK:个别报文段会在网络中丢失,预示可能会出现拥塞(实际未发生拥塞),因此可以尽快采取控制措施,避免拥塞。

拥塞控制应该如何进行?有 3 个关键点:

  1. 一个丢失的报文段意味着拥塞,因此当丢失报文段时应当降低 TCP 发送方的速率;
  2. 一个 ACK 报文段指示该网络正在向接收方交付报文段,因此当未确认报文段的 ACK 到达时,能够增加发送方的速率;
  3. 为探测拥塞开始时的传输速率,TCP 发送方从速率往后退进而再次检测,看看拥塞开始时速率是否改变。

慢启动(慢开始)#

拥塞窗口 cwnd#

当主机开始发送数据时,由于网络的拥塞情况并不明确,要是盲目地把大量数据注入网络中,可能会引发拥塞。因此需要先探测网络的负载能力。慢开始的思路就是,由小到大逐渐增大拥塞窗口数值。
初始拥塞窗口 cwnd 设置,在旧的规定中在刚刚开始发送报文段时,先把初始拥塞窗口cwnd 设置为 1 至 2 个发送方的最大报文段 SMSS (Sender Maximum Segment Size)的数值。新的 RFC 5681 把初始拥塞窗口 cwnd 设置为不超过 2 至 4 个 SMSS 的数值。
拥塞窗口 cwnd 控制方法为:在每收到一个对新的报文段的确认后,把拥塞窗口增加最多一个 SMSS 的数值。

其中 N 是原先未被确认的、但现在被刚收到的确认报文段所确认的字节数。不难看出,当 N < SMSS 时,拥塞窗口每次的增加量要小于 SMSS。用这样的方法逐步增大发送方的拥塞窗口 cwnd,可以使分组注入到网络的速率更加合理。

传输轮次#

使用慢开始算法后,每经过一个传输轮次(transmission round),拥塞窗口 cwnd 就加倍,一个传输轮次所经历的时间其实就是往返时间 RTT。因此 TCP 的发送速率虽然其实很慢,但是在慢启动阶段能够以指数型增长实现速率的快速攀升。
“传输轮次”更加强调:把拥塞窗口 cwnd 所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认。例如,拥塞窗口 cwnd = 4,这时的往返时间 RTT 就是发送方连续发送 4 个报文段,并收到这 4 个报文段的确认,总共经历的时间。

拥塞避免#

慢开始门限 ssthresh#

指数型增长可以持续进行吗?答案是否定的,网络中的任何传输连接若无限制地提高发送速率,很容易导致网络拥塞。什么时候停止呢?通过维护变量 ssthresh 实现。设置慢开始门限 ssthresh(状态变量)的目的是,防止拥塞窗口 cwnd 增长过大引起网络拥塞。慢开始门限 ssthresh 的用法如下:

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

拥塞避免状态#

当 TCP 侦测到网络拥塞时,肯定是不能继续让拥塞窗口按照指数型增大了。拥塞避免状态让拥塞窗口 cwnd 缓慢地增大,即每经过一个往返时间 RTT 就把发送方的拥塞窗口 cwnd 加 1,而不是加倍,使拥塞窗口 cwnd 按线性规律缓慢增长。进入拥塞避免状态时,ssthresh 将会被更新为 cwnd 值的一半。因此在拥塞避免阶段就有“加法增大” (Additive Increase) 的特点。这表明在拥塞避免阶段,拥塞窗口 cwnd 按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢得多。
需要注意的是,丢包事件也可以被 3 个连续的 ACK 触发,但是这种丢包行为不能代表网络及其拥塞,而是还能够传输报文段。因此对于此情况 TCP 的反应不会那么剧烈,首先将 cwnd 减半,将 ssthresh 的值记录为 cwnd 的一半,进入快速恢复的阶段。
需要指出,“拥塞避免”并非指完全能够避免了拥塞,利用以上的措施要完全避免网络拥塞还是不可能的。“拥塞避免”是说在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。

快速恢复#

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

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

使用快速恢复发送方就不会误认为出现了网络拥塞,使用快重传可以使整个网络的吞吐量提高约 20%。

实例分析#


当 TCP 连接进行初始化时,将拥塞窗口置为 1,图中的窗口单位不使用字节而使用报文段。慢开始门限的初始值设置为 16 个报文段,即 ssthresh = 16,发送端的发送窗口不能超过拥塞窗口 cwnd 和接收端窗口 rwnd 中的最小值。我们假定接收端窗口足够大,因此现在发送窗口的数值等于拥塞窗口的数值。
在执行慢开始算法时,拥塞窗口 cwnd=1,发送第一个报文段。发送方每收到一个对新报文段的确认 ACK,就把拥塞窗口值加 1,然后开始下一轮的传输(请注意,横座标是传输轮次,不是时间)。因此拥塞窗口 cwnd 随着传输轮次按指数规律增长。
当拥塞窗口 cwnd 增长到慢开始门限值 ssthresh 时(图中的点 2,此时拥塞窗口cwnd = 16),就改为执行拥塞避免算法,拥塞窗口按线性规律增长。当拥塞窗口 cwnd = 24 时,网络出现了超时,发送方判断为网络拥塞。于是调整门限值 ssthresh = cwnd / 2 = 12,同时设置拥塞窗口 cwnd = 1,进入慢开始阶段。按照慢开始算法,发送方每收到一个对新报文段的确认 ACK,就把拥塞窗口值加 1。当拥塞窗口 cwnd = ssthresh = 12 时(图中的点 3,此时拥塞窗口 cwnd = 16),改为执行拥塞避免算法,拥塞窗口按线性规律增大。
当拥塞窗口 cwnd = 16时,出现了一个新的情况,就是发送方一连收到 3 个对同一个报文段的重复确认(图中记为3-ACK)。发送方改为执行快重传和快恢复算法。因此在图的点 4,发送方知道现在只是丢失了个别的报文段,于是不启动慢开始,而是执行快恢复算法。这时,发送方调整门限值 ssthresh = cwnd / 2 = 8,同时设置拥塞窗口cwnd = ssthresh = 8(见图中的点5),并开始执行拥塞避免算法。

AIMD 算法#

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

该算法最鲜明的特点,就是 cwnd 的数值会呈现锯齿状的变化趋势。设窗口长度为 w,根据上述流程当速率增长至 w/RTT 时,网络丢弃来自连接的分组。发送速率减半,进而每过一个 RTT 发送速率增加 MSS/RTT,直到 w/RTT 为止不断重复。

发送窗口的上限#

结合流量控制来考虑,发送方的发送窗口也一定不能超过接收方的接收窗口大小。发送方的发送窗口的上限值应当取为接收方窗口 rwnd 和拥塞窗口 cwnd 这两个变量中较小的一个,即应按以下公式确定:

当 rwnd < cwnd 时,是接收方的接收能力限制发送窗口的最大值。当 cwnd < rwnd 时,则是网络的拥塞限制发送窗口的最大值。也就是说 rwnd 和 cwnd 中数值较小的一个,控制了发送方发送数据的速率。

拥塞控制的公平性#

UDP 协议#

对于多媒体应用经常会在 UDP 协议上运行,因为他们不想要传输速率被限制,因为 UDP 是没有拥塞控制的。运行在 UDP 上的多媒体应用是很不公平的,它们将不会与其他连接合作,也不会适时调整传输速率。当 TCP 拥塞控制面临丢包事件时,会降低其传输速率,但是 UDP 源不会减低速率,TCP 流量可能被其压制。

并行 TCP 连接#

WEB 流量在因特网中非常普遍,因此多条并行的 TCP 连接并非不常见。例如 WEB 浏览器通常使用多个并行的 TCP 连接来传输一个 WEB 页中的多个对象。当一个应用使用多条并行连接时,就会占用一条拥塞链路中较大比例的带宽。

参考资料#

《计算机网络(第七版)》 谢希仁 著,电子工业出版社
《计算机网络 自顶向下方法》 [美] James F.Kurose,Keith W.Ross 著,陈鸣 译,机械工业出版社

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章