分享

《网络协议》TCP 拥塞控制

 心不留意外尘 2017-04-11

http://blog.csdn.net/chenhanzhun/article/details/41825113

2014

概述

        TCP 拥塞控制能够提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性。拥塞控制主要有几种:慢启动拥塞避免快速重传 以及快速恢复

        拥塞控制的最终受控变量是发送端向网络一次连续写入的数据量(即收到其中第一个数据的确认应答之前的所有数据),称为发送窗口(send window,SWND)。但是发送端往往最终以 TCP 报文段来发送数据,所以 SWND 限定了发送端能够连续发送 TCP 报文段的数量。发送端应该合理的选择 SWND 的大小,若该值太小,会引起网络延迟,若太大,则容易导致网络拥塞。前面中我们知道,接收端可通过其接收通告窗口(RWND)来控制发送端的 SWND 大小,但是发送端应该引入一个拥塞窗口(Congestion Window,CWND)的状态量。实际的 SWND 值就是 RWND 和 CWND 中的较小者。


慢启动

       为了防止网络拥塞,TCP 采用了一种慢启动算法,对发送数据量进行控制。为了调节发送端的数据发送量,引入了拥塞窗口,在慢启动时,将这个拥塞窗口设为 1 个报文段发送数据,之后每收到一次确认应答,拥塞窗口的值就加 1 个报文段。在发送数据包时,将拥塞窗口的大小与接收端主机通知的窗口大小进行比较,然后选择较小的值来控制数据量的发送。拥塞窗口是发送端使用的流量控制,而通告窗口则是接收端使用的流量控制。

       慢启动算法步骤如下(cwnd全称Congestion Window):

  1. 初始化 cwnd = 1,表示可以传一个 MSS 大小的数据;
  2. 每当收到一个 ACK,cwnd++,即增加1,呈线性上升;
  3. 每当过了一个 RTT,cwnd = cwnd*2,呈指数让升;
  4.  ssthresh(slow start threshold),是一个上限,当 cwnd >= ssthresh 时,就会进入“拥塞避免算法”(后面会说这个算法);

拥塞避免

       拥塞避免算法是让拥塞窗口缓慢地增大,收到每一轮的确认后,将拥塞窗口的值加1,而不是加倍,这样拥塞窗口的值按照线性规律缓慢增长。在慢启动中,当cwnd >= ssthresh时,就会进入“拥塞避免算法”。一般来说ssthresh的值是65535,单位是字节,当cwnd达到这个值时后,算法如下:

  1. 收到一个 ACK 时,cwnd = cwnd + 1/cwnd;
  2. 当每过一个RTT时,cwnd = cwnd + 1;

快速重传与快速恢复

        快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认(重复发送对前面有序部分的确认),而不是等待自己发送数据时才进行捎带确认,也不是累积收到的报文发送累积确认,如果发送方连续收到三个重复确认,就应该立即重传对方未收到的报文段(有收到重复确认,说明后面的报文段都送达了,只有中间丢失的报文段没送达)。

         快恢复算法与快重传算法配合使用:

  1. 当发送方连续收到三个重复确认时,就把慢启动门限 ssthresh 设置为当前拥塞窗口 cwnd 的一半。重传丢失的报文段。设置 cwnd 为 ssthresh 加上3倍的报文段大小;
  2. 每次收到另一个重复的 ACK 时,cwnd 增加 1 个报文段大小并发送 1 个分组;
  3. 当下一个确认新数据的 ACK 达到时,设置 cwnd 为 ssthresh(跟第 1 步一样设置方法)。这个 ACK 应该是在进行重传之后的一个往返时间内对步骤 1 中重传的确认。另外,这个 ACK 也应该是对丢失的分组和收到的第一个重复的 ACK 之间的所以中间报文段的确认。这一步采用的是拥塞避免算法。


参考资料:

《TC/IP 详解》

TCP 的拥塞控制机制

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多