运输层:TCP 拥塞控制

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

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 著,陈鸣 译,机械工业出版社

posted @ 2020-07-24 09:50  乌漆WhiteMoon  阅读(855)  评论(0编辑  收藏  举报