淘先锋技术网

首页 1 2 3 4 5 6 7

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

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

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

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

1. TCP与UDP的区别:

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


2. TCP 的流量控制

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

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

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

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

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

3. TCP 的拥塞控制

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

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

为了防止网络的拥塞现象,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的拥塞控制协议,例如:

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