TCP流量控制与拥塞控制

一、TCP流量控制

TCP提供了流量控制服务以消除发送方使接收方缓存区溢出的可能性,因此可以说流量控制是一个速度匹配服务(匹配发送方的发送速率与接收方的读取速率)

TCP提供一种基于滑动窗口协议的流量控制机制,滑动窗口的基本原理已在数据链路层介绍过了,这里要介绍的是TCP是如何使用窗口机制来实现流量控制的。

TCP 中采用滑动窗口来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。当滑动窗口为 0 时,发送方一般不能再发送数据报,但有两种情况除外,一种情况是可以发送紧急数据,例如,允许用户终止在远端机上的运行进程。另一种情况是发送方可以发送一个 1 字节的数据报来通知接收方重新声明它希望接收的下一字节及发送方的滑动窗口大小。

在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,这就是接收窗口rwnd,即调整TCP报文段首部中的“窗口”字段值,来限制发送方向网络注入报文的速率。同时,发送方根据其对当前网络拥塞程序的估计而确定的窗口值,称为拥塞窗口cwnd(后面会讲到),其大小与网络的带宽和时延密切相关。

例如,在通信中,有效数据只从A发往B,而B仅向A发送确认报文,这时,B就可以通过设置确认报文段首部的窗口字段来将rwnd通知给 rwnd即接收方允许连续接收的最大能力,单位是字节。发送方A总是根据最新收到的rwnd值来限制自己发送窗口的大小,这样可以将未确认的数据量控制在rwnd大小之内,保证了A不会使B的接收缓存溢出。当然,A的发送窗口的实际大小是取rwnd和cwnd中的最小值。

如图1的例子说明了如何利用滑动窗口机制进行流量控制。设主机A向主机B发送数据,在连接建立时,B告诉A:“我的接收窗口rwnd=400(字节)”

图1 利用可变窗口进行流量控制举例
在这里插入图片描述
传输层和数据链路层的流量控制的区别在于:传输层定义了端到端用户之间的流量控制,数据链路层定义了两个中间的相邻结点的流量控制另外,数据链路层的滑动窗口协议的窗口大小不能动态变化,传输层则可以动态变化。

二、TCP拥塞控制

所谓拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载。当出现拥塞时,端点并不能了解到拥塞发生的细节,对通信连接的端点来说,拥塞往往表现为通信时延的增加。当然拥塞控制和流量控制也有相似的地方,都是通过控制发送方发送数据的速率来达到效果的。

拥塞控制与流量控制的区别:拥塞控制是让网络能够承受现有的网络负荷,它是一个全局性的过程,涉及所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。相反,流量控制往往是指点对点的通信量的控制,即接收端控制发送端,它所要做的就是抑制发送端发送数据的速率,以便便接收端来得及接收。

例如,某个链路传输 速率为10Gb/s, 某巨型机向一个 PC以1Gb/s 的速率传送文件, 显然网络的带宽是足够大的,即不存在拥塞问题,但如此高的发送速率将导致PC可能来不及接收,因此流量控制是必需的。但若有100万个PC在此链路上以1Mb/s的速率传送文件,则现在的问题就变成了网络的负载是否超过了现有网络所能承受的范围。

为了更好地对传输层进行拥塞控制,因特网建议标准定义了以下四种算法:慢开始、拥塞避免、快重传、快恢复。

发送方 在确定发送报文段的速率时,既要根据接收方的接收能力,又要从全局考虑不要使网络发生拥塞。因此,TCP 协议要求发送方维护以下两个窗口:

  1. 接收窗口rwnd,接收方根据目前接收缓存大小所许诺的最新的窗口值,反映了接收方的溶量。由接收方根据其放在TCP报文的首部的窗口字段通知发送方。
  2. 拥塞窗口cwnd,发送方根据自己估算的网络拥塞程度而设置的窗口值, 反映了网络的当演容量。只要网络没有出现拥塞,拥塞窗口就再增大些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入网络中的分组数。

发送窗口的上限值应当取接收窗口rwnd和拥塞窗口cvnd中较小的一个,即:发送窗口的上限值=Min[rwnd, cwnd]

注意:接收方总是有足够大的缓存空间,因而发送窗 口大小由网络的拥塞程度来决定,也就是说可以将发送窗口等同于为拥塞窗口。

接收窗口的大小可以根据TCP报文首部的窗口字段通知发送方, 而发送方怎么去维护拥塞窗口呢?这就是下面讲解的慢开始和拥塞避免算法。

1.慢开始和拥塞避免

1.1 慢开始算法

在TCP刚刚连接好,开始发送 TCP报文段时, 先令拥塞窗口 cwnd=1, 即一个最大报文段长度MSS而在每收到一个对新的报文段的确认后 将cwnd加1,即增大一个MSS。用这样的方法逐步增大发送方的拥塞窗口cwnd,可以使分组注入到网络 各的速率更加合理。

例如,A向B发送数据,当发送时A的拥塞窗口为2,那么A一次可以发送两个TCP报文段,当经过一个RTT后(也称为一个传输轮次),A收到B 对刚才两个报文的确认,于是就把拥塞窗口调整为4,下一次发送时就可以一次发 4个报文段。

使用慢开始算法后,每经过一个传输轮次(即往返时延RTT),拥塞窗口cwnd就会加倍,即cwnd的大小呈指数形式增长。这样慢开始一直把拥塞窗口cwnd增大到一个规定的慢开始门限ssthresh (阈值),然后改用拥塞避免算法。

1.2 拥塞避免算法

拥塞避免的做法是:发送端的拥塞窗口cwnd每经过一个往返时延RTT就增加一个MSS的大小,而不是加倍,使cwnd按线性规律缓慢增长(即加法增大),而当出现一次超时(网络拥塞)时,则令慢开始门限ssthresh等于当前cwnd的一半(即乘法减小)。

根据cwnd的大小执行不同的算法,可归纳如下:

  • 当cwnd<ssthresh时,使用慢开始算法。
  • 当cwnd>ssthresh时,停止使用慢开始算法而改用拥塞避免算法。
  • 当cwnd=ssthresh时,既可使用慢开始算法,也可使用拥塞避免算法(通常做法)。

1.3 网络拥塞的处理

当网络出现拥塞时,无论在慢开始阶段还是在拥塞避免阶段,只要发送方检测到超时事件的发生(没有按时收到确认,重传计时器超时), 就要把慢开始门限ssthresh 设置为出现拥塞时的发送方(cwnd值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。

拥塞避免并非完全能避免拥塞。利用以上措施要完全避免网络拥塞是不可能的。拥塞避免是指在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。

慢开始和拥塞避免算法的实现过程如图2所示。

  • 初始时,拥塞窗口置为1,即cwnd=1,慢开始门限置为16,即ssthresh=16。慢开始阶段,cwnd初值为1,以后发送方每收到一个确认ACK,cwnd 值加1,也即经过每个传输轮次(RTT),cwnd 呈指数规律增长。
  • 当拥塞窗口 cwnd增长到慢开始门限ssthresh时(即当cwnd=16时),就改用拥塞避免算法,cwnd按线性规律加性增长。
  • 假定cwnd=24时,网络发生拥塞,更新ssthresh值为12 (即变为超时cwnd值24的一半),cwnd重置1,并执行慢开始算法, 当cwnd=12时,改为拥塞避免算法。

图2 慢开始和拥塞避免算法的现实举例
在这里插入图片描述
注意, 在慢开始(指数级增长)阶段,若2 * cwnd>ssthresh,则下一个RTT的cwnd应等于ssthresh,而不是2 * cwnd,即cwnd不能跃过ssthresh值。如图2中,在第16个轮次时,cwnd=8、ssthresh=12,第17个轮次时,cwnd=12,而不是16。

在慢开始和拥塞 避免算法中使用了“乘法减小”和“加法增大”方法。“乘法减小”是指不论在慢开始阶段还是拥塞避免阶段,只要出现一次超时(即很可能出现了网络拥塞),就把慢开始门限值ssthresh设置为当前的拥塞窗口值的一半。当网络频繁出现拥塞时,ssthresh值就下降得很快,以大大减少注入到网络中的分组数。而“加法增大”是指执行拥塞避免算法后,在收到对所有报文段的确认后( 即经过一个RTT),就把拥塞窗口cwnd增加一个MSS大小,使拥塞窗口缓慢增大以防止网络过早出现拥塞。

2.快重传和快恢复

快重传和快恢复算法是对慢开始和拥塞避免算法的改进。

2.1 快重传

在上一节TCP可靠传输机制中,快速重传技术使用了用冗余ACK来检测丢包的发生。同样,冗余ACK也用于网络拥塞的检测(丢了包当然意味着网络可能出现了拥塞)。快重传并非取消重传计时器,而是在某些情况下可更早地重传丢失的报文段。

当发送方连续收到三个重复的ACK报文时,直接重传对方尚未收到的报文段,而不必等待那个报文段设置的重传计时器超时。

2.2 快恢复

快恢复算法原理:当发送端收到连续三个冗余ACK (即重复确认)时,就执行“乘法减小”算法,把慢开始门限ssthresh设置为出现拥塞时发送方cwnd的一半。与慢开始(慢开始算法将拥塞窗口cwnd设置为1)不同之处是它把cwnd的值设置为慢开始门限ssthresh改变后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。

由于跳过了cwnd从1起始的慢开始过程,所以被称为快恢复。快恢复算法的实现过程如图3所示,作为对比,虚线为慢开始的处理过程。

图3 快恢复算法的实现过程
在这里插入图片描述
在流量控制中,发送方发送数据的量由接收方决定,而在拥塞控制中,由发送方自己通过检测网络状况而决定。实际上,慢开始、拥塞避免算法、快重传和快恢复几种算法应该是同时应用在拥塞控制机制之中的,当发送方检测到超时的时候就采用慢开始和拥塞避免,当发送方接收到冗余ACK的时候就采用快重传和快恢复。

最后,再次提醒读者:发送方发送窗口的实际大小由流量控制和拥塞控制共同决定。因此,当中同时出现了接收端窗口(rwnd)和拥塞窗口(cwnd)时,发送方实际的发送窗口大小是由rwnd和cwnd中较小的那一个确定的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值