TCP拥塞控制

1 引言

拥塞控制是TCP通信的每一方需要执行的一系列行为,这些行为由特定的算法控制,用于防止网络因为大规模的通信负载而瘫痪。TCP拥塞控制的难点在于怎样准确地判断何时需要减缓且如何减缓TCP传输,以及何时恢复其原有的速度。

1.1 TCP拥塞检测

在TCP中,丢包被用作判断拥塞发生与否的指标,用来衡量是否实施相应的措施,其他还有时延测量和显示拥塞通知的拥塞探测方法。

1.2 减缓TCP发送

TCP头部设置了通知窗口大小字段,该数值是TCP发送方调节发送速率的依据。基于网络传输能力的估计,可以在发送端引入一个窗口控制变量,确保发送窗口大小不超过接收端接收能力和网络传输能力,即TCP发送端的发送速率等于接收速率和传输速率两者中较小值。
反映网络传输能力的变量称为拥塞窗口,记作cwnd,因此,发送端实际可用窗口W就是接收通知窗口awnd和拥塞窗口cwnd的较小者:
W = min(cwnd,awnd)
TCP发送端发送的数据中,还没有收到ACK回复的数据量不能多于W,这种已经发出但还未确认的数据量大小有时称为在外数据值,它总是小于等于W。
网络和接收端状况会随时间变化,相应地,awnd和cwnd的数值也会随之改变。W的值不能过大或过小,我们希望其接近带宽延迟积BDP(Bandwidth-Delay Product)。

2 一些经典算法

TCP发送方的拥塞控制操作是由ACK的接收来驱动或控制的,当TCP传输处于稳定阶段,接收到ACK回复表明发送的数据包已被成功接收,因此可以继续发送操作。稳定状态下的TCP拥塞行为,实际是试图使在网络传输路径上的数据表守恒。
TCP的两个核心算法:慢启动和拥塞避免,这两个算法是基于包守恒和ACK时钟原理。

2.1 慢启动

当一个新的TCP连接建立或检测到由重传超时导致的丢包时,需要执行慢启动,TCP发送端长时间处于空闲状态也可能调用慢启动算法。慢启动的目的是,使TCP在用拥塞避免探寻更多可用带宽之前得到cwnd值,以及帮助TCP建立ACK时钟。通常TCP在建立新连接时执行慢启动,直至有丢包时,执行拥塞避免算法进入稳定状态。
TCP以发送一定数目的目前数据段开始慢启动,称为初始窗口(Initial Window IW),IW的值初始设置为一个SMSS(发送方的最大段大小),也有大于一个SMSS的情况。
假设没有出现丢包情况且每个数据包都有相应的ACK,第一个数据段的ACK到达,说明可发送一个新的数据段。每接收到一个好的ACK响应,慢启动算法会以min(N,SMSS)来增加cwnd值,这里的N指在未经确认的传输数据中能通过这一好的ACK确认的字节数,所谓好的ACK是指新接收的ACK号大于之前收到的ACK。
因此在慢启动阶段数据包会按照指数增长,直到慢启动阈值(slow start threshold, ssthresh)。

2.2 拥塞避免

为了得到更多的传输资源而不致影响其他连接传输,TCP实现了拥塞避免算法,一旦确立慢启动阈值,TCP会进入拥塞避免阶段,cwnd每次的增长值近似于成功传输的数据段大小,这种随时间线性增长方式与慢启动的指数增长相比缓慢许多。

2.3 慢启动和拥塞避免的选择

慢启动阈值与cwnd的关系是决定采用慢启动还是拥塞避免的界限,当cwnd<ssthresh,使用慢启动算法,当cwnd>ssthresh,需要执行拥塞避免,而两者相等时,任何一种算法都可以。
慢启动和拥塞避免之间的最大的区别在于,当新的ACK到达时,cwnd怎样增长。慢启动阈值不是固定的,而是随时间改变的,它的主要目的是,在没有丢包发生的情况下,记住上次最好的操作窗口估计值,换言之,它记录TCP最优窗口估计值的下界。
慢启动阈值的初始值可任意设定,这会使TCP总是以慢启动状态开始传输,当有重传情况发生时,ssthresh会按下式改变:
ssthresh=max(在外数据值/2, 2*SMSS)
这通常会导致ssthresh减小,但也可能会使之增大。

2.4 Tahoe、Reno以及快速恢复算法

有丢包情况发生时,Tahoe简单地将cwnd减为初始值,以达到慢启动的目的,直至cwnd增长为ssthresh,这种方法带来一个问题是,对于有较大的BDP的链路来说,会使得带宽利用率低下。为解决这一问题,针对不同的丢包情况,重新考虑是否需要重回慢启动状态,若是由重复ACK引起的丢包(引发快速重传),cwnd值将被设为上一个ssthresh。

2.5 标准TCP

尽管哪些构成了标准TCP还存在争议,但是我们讨论过的上述算法毋庸置疑都属于标准TCP。
TCP连接建立之初首先是慢启动阶段,ssthresh通常取一个较大值,当接收到一个好的ACK,cwnd会相应更新:
cwnd += SMSS(cwnd < ssthresh)慢启动
cwnd +=SMSSSMSS/cwnd(cwnd>ssthresh)拥塞避免
当收到三次重复ACK时,会执行以下行为:
1.sshtresh更新为大于max(在外数据值/2, 2
SMSS)值;
2.启用快速重传算法,将cwnd设为(ssthresh+3*SMSS)值;
3.每接收到一个重复ACK,cwnd值暂时每增加1 SMSS;
4.当接收到一个好的ACK,将cwnd重设为ssthresh;
以上第二步和第三步构成了快速恢复。步骤2设置cwnd大小,首先cwnd通常会被减为之前值得一半,然后,考虑到每接收一个重复ACK,就意味着相应的数据包已成功传输,cwnd值会相应地暂时增大。这一步也可能出现cwnd加速递减的情况,通常cwnd会乘以某个值(如0.5)来形成新的cwnd,步骤3维持cwnd增大的过程,使得发送方可以继续发送新的数据包,步骤4假设TCP已完成恢复阶段,所以cwnd的临时膨胀也消除了。
以下两种情况总会执行慢启动:新连接建立以及出现重传超时。当发送方长时间处于空闲状态,或者有理由怀疑cwnd不能精确反映网络当前拥塞状态时,也可能引发慢启动。

3 对标准算法的改进

注:本文内容主要来源于TCP/IP详解一书

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值