我们看到TCP连接的双方都包含一个接收缓冲区,一个发送缓冲区和几个变量(LastByteRead,rwnd等)。 TCP拥塞控制机制运行在发送者对拥塞窗口的跟踪上。 拥塞窗口(表示为cwnd)对TCP发送方可以发送到网络的速率施加约束。具体而言,发送者的未确认数据量不得超过cwnd和rwnd之间的较小值:
ssthresh 慢启动阈值(show start threshold)
别被“慢启动”这个名字所迷惑了,实际上这是cwnd增长最快的阶段。
在慢启动状态下,cwnd的值从1 MSS开始,并且当每个被传输的报文段第一次ACK时,cwnd都会+1MSS
在进入拥塞避免状态时,cwnd的值大约是上次遇到拥塞时的值的一半
在慢启动阶段每个RTT都会将cwnd值加倍,而在拥塞避免阶段TCP采用更保守的方法,并且每个RTT只增加cwnd一个MSS的值[RFC 5681]。 这可以通过几种方式实现。 一种常见的方法是TCP发送器在新的确认到达时通过MSS字节(MSS / cwnd)增加cwnd。 例如,如果MSS是1,460字节而cwnd是14,600字节,则在RTT内发送10个段。 每个到达的ACK(假设每个段一个ACK)将拥塞窗口大小增加1/10MSS,因此,当10个段都ACK后,cwnd才累计增加了一个MSS。
在快速恢复中,对于导致TCP进入快速恢复状态的丢失段的每个重复ACK,cwnd的值增加1 MSS。 最终,当丢失的段的ACK到达时,TCP在 放空cwnd 后进入拥塞避免状态。 如果发生超时事件,则执行与慢启动和拥塞避免相同的 *** 作后,快速恢复将转换为慢启动状态:cwnd的值设置为1 MSS,ssthresh的值设置为值的一半。
快速恢复是TCP [RFC 5681]的推荐但不是必需的组件。 有趣的是,早期版本的TCP(称为TCP Tahoe)无条件地将其拥塞窗口切换为1 MSS,并在超时指示或三重复ACK指示丢失事件后进入慢启动阶段。 较新版本的TCP,TCP Reno,整合了快速恢复。
TCP tahoe 无快速恢复
TCP reno 有快速恢复
忽略连接开始时的初始慢启动时段并假设丢失由三次重复ACK而不是超时触发的,TCP的拥塞控制包括每个RTT 1个MSS的cwnd线性(附加)增加然后减半 (三次重复ACK事件)的cwnd的(乘法减少)。 出于这个原因,TCP拥塞控制通常被称为加法增加,乘法减少(AIMD)形式的拥塞控制。AIMD拥塞控制引起了“锯齿”行为,如图3.54所示,这也很好地说明了我们早期对TCP“探测”带宽的直觉 - TCP线性增加了它的拥塞窗口大小(以及它的传输速率),直到 发生三重复ACK事件。 然后它将拥塞窗口大小减少两倍,然后再次开始线性增加,探测是否有额外的可用带宽。
如前所述,许多TCP实现使用Reno算法[Padhye 2001]。已经提出了Reno算法的许多变体[RFC 3782RFC 2018]。 TCP Vegas算法[Brakmo 1995Ahn 1995]试图在保持良好吞吐量的同时避免拥挤。 Vegas的基本思想是(1)在发生丢包之前检测源和目的地之间的路由器中的拥塞,以及(2)当检测到即将发生的丢包时,线性地降低速率。通过观察RTT预测即将发生的分组丢失。数据包的RTT越长,路由器的拥塞就越大。 Linux支持许多拥塞控制算法(包括TCP Reno和TCP Vegas),并允许系统管理员配置将使用哪个版本的TCP。 Linux版本2.6.18中的TCP的默认版本设置为CUBIC [Ha 2008],这是为高带宽应用程序开发的TCP版本。有关TCP的许多风格的最新调查,请参阅[Afanasyev 2010]。 TCP的AIMD算法是基于大量的工程洞察力和运营网络中的拥塞控制实验而开发的。
TCP拥塞控制的四种算法分别是:慢启动,和性增长/乘性降低,快速重传和快速恢复。
1、慢启动
慢启动初始启动时设置拥塞窗口值(cwnd)为1、2、4或10个MSS。拥塞窗口在每接收到一个确认包时增加,每个RTT内成倍增加,当然实际上并不完全是指数增长,因为接收方会延迟发送确认,通常是每接收两个分段则发送一次确认包。发送速率随着慢启动的进行而增加,直到遇到出现丢失、达到慢启动阈值(ssthresh)、或者接收方的接收窗口进行限制。
2、和性增长/乘性降低
和性增长/乘性降低(additive-increase/multiplicative-decrease,AIMD,)是一种反馈控制算法,其包含了对拥塞窗口线性增加,和当发生拥塞时对窗口积式减少。多个使用AIMD控制的TCP流最终会收敛到对线路的等量竞争使用。
3、快速重传
快速重传(Fast retransmit)是对TCP发送方降低等待重发丢失分段用时的一种改进。TCP发送方每发送一个分段都会启动一个超时计时器,如果没能在特定时间内接收到相应分段的确认,发送方就假设这个分段在网络上丢失了,需要重发。这也是TCP用来估计RTT的测量方法。
4、快速恢复
“快速恢复”算法是在上述的“快速重传”算法后添加的,当收到3个重复ACK时,TCP最后进入的不是拥塞避免阶段,而是快速恢复阶段。快速重传和快速恢复算法一般同时使用。快速恢复的思想是“数据包守恒”原则,即同一个时刻在网络中的数据包数量是恒定的,只有当“老”数据包离开了网络后,才能向网络中发送一个“新”的数据包。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)