在学习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提出了一系列的拥塞控制机制。
拥塞控制所起的作用
(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。