欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

TCP拥塞控制原理

程序员文章站 2022-07-06 16:21:20
...

在学习TCP拥塞控制之前,我想向大家分享两个知识点。不知道大家有没有跟我一样的困惑,我们整天说着网络协议、TCP/IP协议了的,那么协议到底是什么呢? “协议栈”又是什么呢?

协议:为进行网络中的数据交换而建立的规则、标准或约定称为网络协议,简称为协议。

协议栈:网络中各层协议的总和;由于网络各层画在一起很像一个栈的结构,遂被称为协议栈。

言归正传啦!在网络协议中,TCP和UDP是经常被提及的两个概念。关于TCP与UDP的区别,也是很重要的。

1. TCP与UDP的区别:

  TCP UDP
连接性 面向连接 无连接
可靠性 可靠 不可靠
传输内容 字节流 报文段
传输效率 一般 高于TCP
流量控制 滑动窗口
拥塞控制 慢启动、拥塞避免、快重传、快恢复


2. TCP 的流量控制

 一般说来,我们总是希望数据传输得更快一些。但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失。

流量控制(flow control)就是让发送方的发送速率不要太快,要让接收方来得及接收。

在TCP中,利用滑动窗口来进行流量控制。

滑动窗口:
       TCP流量控制的一种手段。这里说的窗口是指接收通告窗口(Receiver Window, RWND)。

       它告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,对方就可以控制发送数据的速度。因此发送方的发送窗口不能超过接收方给出的接收窗口的数值。

3. TCP 的拥塞控制

在计算机网络中的链路容量( 即带宽)、交换结点中的缓存和处理机等,都是网络的资源。

在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫做拥塞(congestion)。

为了防止网络的拥塞现象,TCP提出了一系列的拥塞控制机制。

TCP拥塞控制原理

                                           拥塞控制所起的作用

(1)慢启动

慢启动算法思路:

当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么就有可能引起网络拥塞,因为现在并不清楚网络的负荷情况。经验证明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口数值。

通常在刚刚开始发送报文段时,先把拥塞窗口 cwnd 设置为1个最大报文段(MSS)的数值。而在每收到一个对新的报文段的确认后,把拥塞窗口增加至多一个MSS的数值。

用这样的方法逐步增大发送方的拥塞窗口cwnd, 可以使分组注入到网络的速率更加合理。

(2)拥塞避免

拥塞避免算法思路:

让拥塞窗口cwnd 缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口 cwnd 加1,而不是加倍。

这样,拥塞窗口cwnd 按线性规律缓慢增长,就可以避免增长过快导致网络拥塞,慢慢的增加调整到网络的最佳值。比慢开始算法的拥塞窗口增长速率缓慢得多。

注意!!!

无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有按时收到确认),就要把慢开始门限(ssthresh)设置为出现拥塞时的发送方窗口值的一半(但不能小于2)。

然后把拥塞窗口 cwnd 重新设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。

(3)快重传

快重传算法:

首先要求接收方每收到一个失序的报文段后,就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方),而不要等待自己发送数据时才进行捎带确认。

快重传做的事情有:

① 把慢开始门限ssthresh 设置为 拥塞窗口cwnd 的一半

② 把拥塞窗口cwnd 再设置为慢开始门限ssthresh 的值(具体实现有些为ssthresh+3)

③ 重新进入拥塞避免阶段。

(4)快恢复

快恢复算法是与快重传配合使用的。

快恢复算法过程要点:

① 当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把慢开始门限ssthresh减半。这是为了预防网络发生拥塞。

② 发送方认为现在网络很可能没有发生拥塞(如果网络发生了严重的拥塞,就不会一连有好几个报文段连续到达接收方,就不会导致接收方连续发送重复确认),因此,现在不执行慢开始算法(即拥塞窗口cwnd现在不设置为1),而是把 cwnd 值设置为慢开始门限ssthresh 减半后的数值,然后开始执行拥塞避免算法(“ 加法增大”),使拥塞窗口缓慢地线性增大。

总结

如下图所示,描述了从连续收到3个重复的确认转入拥塞避免

TCP拥塞控制原理

附:目前有非常多的TCP的拥塞控制协议,例如:

  • 基于丢包的拥塞控制:将丢包视为出现拥塞,采取缓慢探测的方式,逐渐增大拥塞窗口,当出现丢包时,将拥塞窗口减小,如 Reno、Cubic 等。
  • 基于时延的拥塞控制:将时延增加视为出现拥塞,延时增加时增大拥塞窗口,延时减小时减小拥塞窗口,如 Vegas、FastTCP 等。
  • 基于链路容量的拥塞控制:实时测量网络带宽和时延,认为网络上报文总量大于带宽时延乘积时出现了拥塞,如 BBR。
  • 基于学习的拥塞控制:没有特定的拥塞信号,而是借助评价函数,基于训练数据,使用机器学习的方法形成一个控制策略,如 Remy。