谈一谈tcp的拥塞控制

49b32e46-0dda-482d-9da9-d5400f81806f

一、引言

拥塞控制是TCP通信的每一方需要执行的一系列行为,这些行为由特定算法规定,用于防止网络因为大规模的通信负载而瘫痪。其基本方法是当网络状况出现拥塞或者由于网络拥塞而发生丢包情况时进入拥塞状态时减缓TCP传输。当TCP通信的接收方的接收速度无法匹配发送速度时,发送方会降低发送速度。TCP的流量控制机制完成了对发送速度的调节,它是基于ACK的通告窗口大小实现的,避免接收方发生缓存溢出。
当网络中大量的发送方和接收方被要求承担超负荷的通信任务时,可以考虑采取降低发送速率或者最终丢弃部分数据的方法。及时路由器能够存储一些数据,但若源源不断的数据到达速率高达发出速录,任何容量的中间存储都会溢出。简言之,当某一路由器在单位时间内接收到的数据量多余其可发送的数据量时,他就需要把多余的部分存储起来。假如这种情况持续,最终资源将被耗尽,只能丢弃部分数据。路由器因无法处理高速速率到达的流量而被迫丢弃数据信息的现象称为拥塞。即使仅为一条通信连接,也可能造成一个或多个路由器拥塞。若不采取对策,网络性能将受到很大影响以致瘫痪。在最坏的情况下,甚至形成拥塞崩溃。

二、TCP拥塞检测

如引言所说,针对丢包情况,TCP采取的首要机制是重传,包括超时重传和快速重传。当拥塞状态出现时,我们可以减缓TCP发送短的发送速率;若拥塞情况有所缓解,可以检测和使用新的可用带宽,但是很难做到,因为TCP发送方来说,没有一个精确的方法去知晓重点路由器的状态。换言之,没有一个明确的信号告知拥塞状况已发生。典型的TCP只有在断定拥塞发生的情况下,才会采取相应的行动。推断是否出现拥塞,通常看是否有丢包情况发生,丢包也被用作判断拥塞发生与否的指标,用来衡量是否实施相应的响应措施。

2.1减缓TCP发送

TCP根据接收方剩余缓存空间大小,在TCP头部设置了通知窗口大小字段,该数值是TCP发送方调节发送速率的依据,进一步讲,当接收速率或网络传输速率过慢时,我们需要降低发送速率。在这里我要要引入一个窗口控制变量确保发送窗口大小不能超过接收到的接受能力和网络传输能力,即TCP的发送端的发送速率等于接收速录和传输速率两者中的较小值。反应网络传输能力的变量成为拥塞窗口,记作cwnd。因此发送端实际可用窗口W就是接收端通知窗口awnd和拥塞窗口cwnd的较小值。TCP发送端的发送的数据中,还没有收到ACK回复的数据不能多于W。实际上并非如此简单,因为网络和接收端状况会随时间变化,awcd和cwnd也会随之改变,因缺少明确的拥塞信号,因此W,cwnd,awnd都会根据经验动态调节。关于TCP窗口和重传,会在后续文章进行介绍。

三、一些经典算法

当一个新的TCP连接建立之初,还无法获知可用的传输资源,所以cwnd的初始值也无法确定。TCP通过与接收端交换一个数据包就能获得awnd。不需要任何明确的信号,所以获取cwnd最佳值的唯一方法是越来越快的速率不断发送数据,直到出现数据包丢失或网络拥塞位置。这时考虑立即以可用的最大速率发送或是慢速启动发送。由于多个TCP连接共享一个网络传输路径,以全速启动会影响其他连接的传输性能,所以通常会有特定的算法来避免过快启动,直至稳定传输后才会运行相应的其他算法。TCP发送方的拥塞孔子操作由ACK的接收来控制的,当TCP处于稳定阶段,接收ACK回复表明发送的数据包已被成功接收,因此可以继续发送操作,据此推理,稳定状态下的TCP拥塞行为,实际是试图是在网络传输路径上的数据包守恒,守恒的意义为某个量不会在一个系统内凭空消失或出现。

3.1慢启动

当一个新的TCP连接建立或者检查到由重传超时(RTO)导致的丢包时,需要执行慢启动。TCP发送端长时间处于空闲状态也可能调用慢启动算法。慢启动的目的是使TCP在拥塞避免探寻更多可用的带宽之前得到cwnd值以及帮助TCP建立ACK时钟。通常TCP在建立新连接时执行慢启动,甚至有丢包时,执行拥塞避免算法进入稳定状态。在传输初始阶段,由于网络传输能力,需要缓慢探测可用传输资源,防止短时间内大量数据注入导致拥塞。慢启动的方法正是针对这一问题而设计。在书传输之初或者重传计时器检测丢包后,需要执行慢启动。
TCP以一定目的数据段开始慢启动,成为初始窗口IW。IW的初始设为一个SMSS,也可为更大的值,如2SMSS或者3SMSS。在这里我们以IW=1*SMSS来谈论问题,意味着初始窗口W为一个SMSS,其中SMSS为接受方MSS(由接受和发送方协商的最大段大小)和路径MTU(最大传输单元)两者中较小的值。
假设没有出现丢包情况且每个数据包都有相应的ACK,第一个数据段的ACK到达,说明可以发送一个数据段,每接受一个好的ACK相应,慢启动就会根据未经确认的数据N和SMSS中的较小值来增加cwnd的值。因此,在接收到一个数据段的ACK后,通常cwnd值都会增加到2,接着会发送两个数据段。如果成功收到相应的心的ACK,cwnd会由2变成4,由4变成8,以此类推。一般情况下,加入没有丢包且每个数据包都有相应的ACK,在k轮后W的值W=2^k,需要k个RTT时间操作窗口才能达到W大小。这种增长看似很快,但若一开始以最大可用速率(即接收方通知窗口大小)发送相比,仍先缓慢。
如果假设某个TCP连接中接收方的通知窗口非常大,这时cwnd就是影响发送速率的主要因素了。如上所述,由于cwnd指数级的增长会导致cwnd很大,W也会很大。大连数据包的发送将导致网络瘫痪,此时cwnd就会大幅度减小为上一次的一半。这是TCP由慢启动阶段至拥塞避免的转折点,与cwnd慢启动阈值有关。
如果ACK采取延时ACK的方式,那么也会产生指数级增长但是增长较慢。

3.2拥塞避免

在连接之初以及由超时判定丢包发生的情况下,需要执行慢启动操作。在慢启动阶段,cwnd会快速增长,帮他确立个慢启动阈值。一旦胆大阈值,就意味着可能有更多的传输资源。如果立即全部占用这些资源,会将使共享路由器队列的其他链接出现严重丢包或重传情况,从而导致真个网络性能不稳定。为了得到更多的传输资源而不致影响其他链接传输,TCP实现了拥塞避免算法。一旦确立慢启动阈值,TCP会进入拥塞避免阶段,cwnd每次的增长值近似于成功传输的数据段大小,这种随时间线性增长方式与慢启动的指数增长相比缓慢许多。更准确地说,每接受一个新的ACK,cwnd就会做出一下更新
new_cwnd = old_cwnd + SMSS*SMSS/old_cwnd,随着每个新的ACK到达,cwnd会有相应的小幅增长,整体增长率呈现轻微的次线性。尽管如此,我们通常认为拥塞避免阶段的窗口随时间线性增长,而慢启动阶段呈指数增长。这个函数也成为累加增长,因为每成功接收到相应数据,cwnd就会增长一个特定值(这里大约是一个包的大小)。当ACK采用延时ACK的方式时,cwnd也会呈现线性增长,只是增幅不是很大。拥塞避免算法假设由比特错误导致包丢失的概率很小,因此有丢包发生就表明聪源端到目的端必有某处出现了拥塞。如果假设不成立,比如在无线网络中,那么即使没有拥塞TCP传输也会变慢。另外cwnd的增大可能经历多个RTT,这就需要有充裕的网络资源并得到高效利用。

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

TCP总是会在慢启动和拥塞避免其中之一,不会出现同时出现两者同时进行的情况。前面起到过慢启动阈值(ssthresh),当cwnd < ssthresh时,使用慢启动算法;当cwnd >ssthresh,需要执行拥塞避免;而当两者相等时,任何一种算法都可以使用。慢启动和避免拥塞两种算法区别在于当ACK到达时,cwnd如何增长。但是慢启动阈值不是固定的,而是随时间改变的。它的主要目的是在没有丢包发生的情况下,记住上一次最好的操作窗口估计值,换言之它记录了TCP最优窗口估计值的下界。慢启动阈值的初始值可以任意设定,这会使得TCP总是以慢启动状态开始传输。当有重传发生时,无论是超市重传还是快速重传,ssthresh都会按照以下方式改变: ssthress = max(在外数据值/2,2*SMSS)。如果出现重传,TCP会认为操作窗口超出了网络传输能力范围。这时会将慢启动阈值减小至当前窗口大小的一半,但不小于2SMSS,从而减小最优窗口估计值。这样通常会导致ssthresh减小。分析TCP拥塞避免的操作流程,如果整个窗口的数据都成功传输,那么cwnd值可以近似增大1SMSS。因此,若cwnd在一段时间范围内已经增大,将ssthresh设为整个窗口大小的一半可能使其增大。这种情况发生在端TCP探测到更多可用带宽时。在慢启动和拥塞避免结合的情况下,ssthresh和cwnd的相互作用使得TCP拥塞处理行为显现其独有特性.

3.4标准TCP

在TCP建立之初是慢启动阶段,即cwnd=1W,ssthresh通常为较大的值,至少是awnd。当接收到一个好的ACK时。cwnd会做出相应的更新:
cwnd =+ SMSS (当cwnd < ssthress 即慢启动阶段)
cwnd += SMSS*SMSS/cwnd (当cwnd > ssthress 即拥塞避免阶段)
当收到三次重复ACK,即触发快速重传,会执行以下行为:

  • 1.ssthresh更新为大于 ssthress = max(在外数据值/2,2*SMSS)的值
  • 2.启用快速重传,将cwnd设为ssthress+3SMSS
  • 3.每接受一个重复ACK,cwnd的值暂时增加1SMSS
  • 4.当接收一个号的ACK,将cwnd设置为ssthresh
    以上第2和第3步构成了快速恢复,步骤2设置cwnd大小,首先cwnd通常会减少之前值的一半。然后,考虑到每接收一个重复ACK就意味着相应的数据包已成功传输,cwnd会相应增大。这一步也可能出现cwnd加速递减的情况,因为通常cwnd会乘以0.5开形成新的cwnd。步骤3维持cwnd的增大过程,使得发送方可以继续发送新的数据包。步骤4假设TCP已完成恢复阶段,所以cwnd的临时膨胀也消除了。
0
未经许可,不得转载,否则将受到作者追究,博主联系方式见首页右上角

该文章由 发布

这货来去如风,什么鬼都没留下!!!
发表我的评论
取消评论
代码 贴图 加粗 链接 删除线 签到