我是靠谱客的博主 魔幻小蘑菇,最近开发中收集的这篇文章主要介绍TCP详解之拥塞控制概述慢启动和拥塞避免超时重传快速重传和快速恢复,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

概述

  TCP模块还有一个重要任务,就是提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性,这就是所谓的拥塞控制。
  拥塞控制的四个部分:慢启动、拥塞避免、快速重传、快速恢复。拥塞控制算法在Linux下有多种实现,比如reno、vegas和cubic算法,他们部分或全部实现了上述四个部分。/proc/sys/net/ipv4/tcp_congestion_control文件指示机器当前使用的拥塞控制算法。
  拥塞控制的最终受控变量是发送端向网络一次连续写入的数据量(收到第一个确认数据报之前),我们称之为SWND(Send Window,发送窗口)。发送端最终是以TCP报文段来发送数据,所以SWND限定了发送端能连续发送的TCP报文段数量。这些TCP报文段的最大长度(仅指数据部分)称为SMSS(Sender Maximun Sefment Size,发送者最大段大小),其值一般等于MSS(最大报文长度)。
  发送端需要合理地选择SWND大小,如果SWND太小,会引起明显的网络延迟;反之太大,会导致网络拥塞。接收方可通过其接受通告窗口(RWND)来控制发送端的SWND,但这显然不够,所以发送端引入了一个称为拥塞窗口(Congestion Window,CWND)的状态变量。实际的SWND值是RWND(16位接收通告大小)和CWND(拥塞窗口)的较小值。
在这里插入图片描述
  如图所示,拥塞控制的输入和输出是一个闭环反馈控制。

慢启动和拥塞避免

  TCP连接建立好之后,CWND将被设置成初始值IW(Initial Window),其大小为2-4个SMSS。新的Linux内核提高了该初始值,以减小传输滞后。此时发送端最多可以发送IW字节的数据。此后发送端每收到接收端的一个确认,其CWND就按照下列公式增加:
在这里插入图片描述
  其中N是此次确认中包含的之前未被确认的字节数。这样一来,CWND将按照指数形式扩大,这就是所谓的慢启动。慢启动算法的理由是:TCP模块刚开始发送数据时并不知道网络的实际情况,需要一种试探的方式平滑地增加CWND的大小。
  如果不施加其他手段,慢启动必然使得CWND很快膨胀,并最终导致网络拥塞。因此TCP拥塞控制中定义了另一个重要的状态变量:慢启动门限(ssthresh)。当CWND的大小超过该值时,TCP拥塞控制将进入拥塞避免阶段。
  拥塞避免算法使得CWND按照线性方式增加,从而减缓其扩大。拥塞避免算法有如下
两种实现方式
  1.每个RTT(一个连接的往返时间,即数据发送时刻到接收到确认的时刻的差值)时间内按照上图公式计算新的CWND,而不论该RTT时间内发送端收到多少个确认。
  2.每收到一个对新数据的确认报文段,就按照CWND+=SMSS*SMSS/CWND来更新CWND。
下图粗略地描述了慢启动和拥塞避免发生的时机和区别。图中以SMSS为单位来显示CWND(实际是以字节为单位的),以次数为单位来显示RTT,为了方便讨论问题,此外,我们假设当前的慢启动门限是16SMSS大小(实际比这大得多)。

在这里插入图片描述


拥塞发生时(可能发生在慢启动阶段或者拥塞避免阶段)拥塞控制的行为。
发送端判断拥塞发生的依据有如下两个:
在这里插入图片描述
在这里插入图片描述
  其中FlightSize是已经发送但未收到确认的字节数。这样调整后,CWND将小于SMSS,那么也必然小于新的慢启动门限值,故而拥塞控制再次进入慢启动阶段。

超时重传

  TCP服务必须能够重传超时时间内未收到确认的TCP报文段。为此,TCP模块为每一个TCP报文段都维护一个重传定时器,该定时器在TCP报文段第一次被发送时启动。如果超时时间内未收到接受方的应答,TCP模块将重传TCP报文段并重置定时器。下一次的超时时间和总的重传次数是TCP的重传策略。
  TCP报文段重传的时间间隔为0.2s,0.4s,0.8s,1.6s,3.2s。可见TCP一共进行五次重传,每次重传超时时间增加一倍(和TCP超时重连策略相似)。在五次重传均失败的情况下,底层的IP和ARP开始接管,直到telnet客户端放弃连接为止。
  /proc/sys/net/ipv4/tcp_retries1指定在底层IP接管之前TCP最少执行的重传次数,默认为3,/proc/sys/net/ipv4/tcp_retries2指定连接放弃前TCP最多可以执行的重传次数,默认为15。
  虽然超时会导致TCP报文重传,但TCP报文段的重传可以发生在超时之前,即快速重传。

快速重传和快速恢复

  在很多情况下,发送端都可能接收到重复的确认报文段,比如TCP报文段丢失,或者接收端收到乱序TCP报文段并重排之等。拥塞控制算法需要判断当收到重复的确认报文段时,网络是否真的发生了拥塞,或者说TCP报文段是否真的丢失了。
  当发送端如果连续收到3个重复的确认报文段,就认为是拥塞发生了。然后它启用快速重传和快速恢复算法来处理拥塞。过程如下:
1.当收到第三个重复的确认报文段时,按照ssthresh=max(FlightSize/2,2SMSS)计算ssthresh,然后立即重传丢失的报文段,并按照CWND=ssthresh+3SMSS来设置CWND。
2.每次收到一个重复的确认时,设置CWND=CWND+SMSS,此时发送端可以发送新的TCP报文段(如果新的CWND允许的话)。
3.当收到新数据的确认时,设置CWND=ssthresh(是新的慢启动门限值,由第一步计算得到)。
  快速重传和快速恢复之后,拥塞控制将恢复到拥塞避免阶段,这一点由第三步操作可得知。

最后

以上就是魔幻小蘑菇为你收集整理的TCP详解之拥塞控制概述慢启动和拥塞避免超时重传快速重传和快速恢复的全部内容,希望文章能够帮你解决TCP详解之拥塞控制概述慢启动和拥塞避免超时重传快速重传和快速恢复所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(84)

评论列表共有 0 条评论

立即
投稿
返回
顶部