TCP拥塞控制

这篇具有很好参考价值的文章主要介绍了TCP拥塞控制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


本作是自己看书总结出来的,如有不正,请各位大佬指点一二

所谓拥塞控制,就是防止过多的数据注入到网络,使得网络中的通信设备和通信线缆不会因为过载而导致网络性能大大下降。

网络中通信设备具有数据处理转发性能、通信链路具有的传输带宽,而其中某台性能差的设备包处理性能或链路的最小带宽就是这个网络可用来传输数据的最大带宽。如果传输的数据量过大,超过网络的承载范围,那么不可避免的会出现网络拥塞,从而导致丢包现象。拥塞控制就是通过调节网络中传输的数据量使其在最大传输带宽以下,保证数据的正常传输。

TCP的拥塞控制有以下四种方法:

  1. 慢启动
  2. 拥塞避免
  3. 快速重传
  4. 快速恢复

1.慢启动

慢启动是基于发送端所做的拥塞控制,大致思想是试探性的发送数据,由小逐渐增大数据的发送量。而发送方发送数据是通过发送窗口发送的,一次性可发送多少数据是由发送窗口的大小决定的。这个窗口在这里有个特殊名词——拥塞窗口(cwnd)。RFC5681规定,cwnd的初始值不超过2-4个SMSS(发送方最大报文段)。

cwnd计算公式如下(适用于拥塞避免):
c w n d + = M S S ∗ M S S / c w n d cwnd += MSS*MSS/cwnd cwnd+=MSSMSS/cwnd
解释一下就是,发送方发出去n个数据包的同时期望收到n个ACK确认报文。在收到ACK确认报文的同时增大cwnd大小,假设cwnd当前值是n个MSS,那么在其发送出n个MSS后,每收到一个ACK报文cwnd就增加MSS*MSS/cwnd,当收到n个ACK报文后增加n*(MSS*MSS/cwnd)

慢启动的运行原理是通过设置一个初始cwnd大小为m,先尝试发送m个MSS,当收到来自接收方回复的m个ACK确认包则会将原来的cwnd增大,增大过程其实就是进行加1操作,即每收到一个ACK确认包就进行加1,当收到m个确认包后原cwnd的大小就会增长到2m。

说明:实际上发送窗口的传输单位是字节,这里便于解释说明采用MSS为单位,设MSS=1460bytes,在经过底层封装后(封装20字节的TCP头部和20字节的IP头部)数据包大小达到1500字节,假设中间所有设备以及接收端都能接收转发该大小的MSS。

TCP拥塞控制

如上图所示:

  1. cwnd的初始值为1,发送方发送出去一个报文段并成功接收到来自接收方回复的ACK确认包。当发送方收到确认报文后就可以知道当前网络是能承载一个MSS,因此发送方尝试加大报文段发送量,于是将cwnd窗口进行加1操作,cwnd大小由起始的1变成了2;
  2. 继续传送剩下的数据包,此时由于cwnd=2因此发送端会发出2个MSS,当发送方接收到接收方回复的2个ACK确认包时,又将尝试增加数据发送量,再次进行加1操作,cwnd大小由2变成了4;
  3. 由于cwnd=4,此时将发出4个MSS,发送方接收到接收方回复的4个ACK确认包时,又将尝试增加数据发送量,再次进行加1操作,cwnd大小由4变成了8;
  4. 当网络没有出现丢包情况,该操作就会一直持续到cwnd=ssthresh(慢启动门限)为止,然后进行线性增长。

那么如果在cwnd增长过程中网络质量差,出现了丢包的情况怎么办呢?

通过超时重传和快速重传,重新调整cwnd大小以及慢启动门限值。

2.拥塞避免

前面介绍的慢启动算法虽然名字中有个“慢”,但并不代表它启动慢。此“慢”非彼“慢”,慢启动算法的这个“慢”是指它的初始值设置的小,最大只有4个MSS最小只有1个MSS,相对一开始就将所有的数据包都注入网络要来的慢。慢启动算法在网络无故障时cwnd的增长都是乘2增长的,这也意味着cwnd发送的报文段也是成倍增长的,因此会导致传输量一下就达到最大承载量从而造成网络拥塞。然后cwnd会调整到初始值,又开始执行慢启动算法,当达到最大承载量又调整cwnd大小,如此周而复始导致网络速率及其不稳定,时大时小,严重影响网络性能。

因此出现了拥塞避免算法,它的增长量相对于慢启动的指数增长要平缓的多,它是按RTT缓慢增长的,每经过一个RTT cwnd就增长1,当cwnd达到慢启动门限时就开始启用拥塞避免算法。

cwnd和ssthresh的关系:

cwnd < ssthresh:执行慢启动算法

cwnd = ssthresh:慢启动算法和拥塞避免算法都可

cwnd > ssthresh:执行拥塞避免算法

TCP拥塞控制

上图反应了cwnd的大小与RTT之间的变化:

cwnd的初始值设置为1,ssthresh的初始值设置为16

  1. cwnd的初始值为1,ssthresh=12,cwnd < ssthresh,执行慢启动算法,经过4个RTT的增长,cwnd增长到16;
  2. 此时cwnd = ssthresh,cwnd的继续增长并开始执行拥塞避免算法,cwnd开始平缓增长。
  3. 随着cwnd增长到24,此时网络出现了丢包触发了超时重传机制,cwnd调整为1,ssthresh=cwnd/2=12
  4. 此时cwnd=1,ssthresh=12,cwnd < ssthresh;又开始执行慢启动算法
  5. 当cwnd=ssthresh=12时,开始执行拥塞避免算法
  6. 当cwnd = 16时,此时发送方收到了3个连续duplicated ACK报文,触发快速重传机制
  7. 快速重传调整ssthresh=cwnd/2,cwnd=ssthresh后直接进入拥塞避免,这就是快速恢复算法

拥塞控制的各个状态之间的转换图

TCP拥塞控制

3.快速重传和快速恢复

TCP传输数据时,发送端发送一个数据包给接收端,当接收端收到该数据包时需要给发送端回复一个ACK确认包以告诉发送方收到了该数据包。快速重传算法就是利用了TCP的这个特点,它在发送方发送的报文有丢失或报文未按序到达的情况下,而又收到了该数据包的下个包,那么接收方主动发送ACK报文确认已经收到该报文之前的上一个报文,当发送方连续收到三个(也称作duplicated ACK)ACK报文时,发送方就知道了该报文没有被接收端接收,于是重传该报文。

TCP拥塞控制
上图指证个错误,ack7确认包没有,这条线去掉,由于之前的重复确认包已经确认了d6,因此只会发出ack8确认7号包
如上图所示,发送方向接收方发送了2个包D1、D2,接收方正常接收并向发送方回复了ACK报文,接下来继续发送D3、D4,但是D3在传输过程中丢失了,因此接收方收不到D3,在收到D4时接收方发现不是D3,于是并向接收方回复duplicated ACK3重复确认收到D2报告D3没有收到。发送方收到第1个重复确认包不予理会,继续发送D5、D6,当D5、D6到达接收方时,接收方发现还不是D3,于是继续回复duplicated ACK3报告D3未收到,由于此时收到了D5、D6两个包,因此会回复2个duplicated ACK3,此时发送方总共收到3个连续的duplicated ACK3,因此立即重传D3,当接收方收到D3后正常回复ACK7,因为前6个报文都已收到。

为什么需要重传3次,而不是2次、4次?

还是拿上面的图来分析,当接收端没有收到D3,此时有3种情况:

  • D3传输乱序,导致后续的包先于D3到达
  • D3传输延时
  • D3在传输过程中被丢弃了

那么我们就需要判断到底是哪种情况导致的D3没有到达,判断依据就是发送duplicated ACK

1)发送方收到1个D2 duplicated ACK

此时接收方收到的包顺序可能是如下顺序:

  • D1、D2、D4、D3、D5、D6 、D7
  • D1、D2、D5、D3、D4、D6 、D7
  • D1、D2、D6、D3、D5、D4、D7

2)发送方收到2个D2 duplicated ACK

  • D1、D2、D5、D4、D3、D6 、D7
  • D1、D2、D5、D6、D3、D4、D7
  • D1、D2、D6、D7、D3、D5、D4

3)发送方收到3个D2 duplicated ACK

  • D1、D2、D5、D4、D6 、D3、D7
  • D1、D2、D5、D7、D4、D3、D4
  • D1、D2、D6、D7、D4、D3、D5

4)发送方收到4个D2 duplicated ACK

  • D1、D2、D5、D4、D6 、D7、D3
  • D1、D2、D5、D7、D4、D4、D3
  • D1、D2、D6、D7、D4、D5、D3

当发送方接收到1个duplicated ACK一定是传输乱序,2个duplicated ACK大概率是乱序,而3个duplicated ACK就可能是超时或者丢包了,4个duplicated ACK就更不用说了基本是丢包了。因此采用3次最好,这也是实际运用中测试总结出来的。不过有没有可能在接收方回复了3个duplicated ACK之后收到了原来的包,这个是有可能的,当网络过于拥塞或者QOS策略导致该包的转发时延过长,但是这个概率是很低的。

最后再来说说快速恢复,当拥塞窗口由于快速重传导致重新调整,由于快速重传并没有发生拥塞,它只是由单个包丢失引起的。因此所作调整也不一样,此时重新调整后的sshthresh = cwnd/2,cwnd = ssthresh。然后直接进入拥塞避免阶段(cwnd = ssthresh)。也有的快速恢复是把cwnd = ssthresh + 3*MSS,原理是在快速重传阶段由于接收方发送了3个重复ACK,会使得网络中有3个包离开进入到接收方的缓存,因此可以将其适当的扩大。

超时重传和快速重传:

超时重传是发送端主动进行的的重传,基于收不到ACK报文。当数据包经由发送端发送出去以后,超过了一个RTO后还未收到接收端的ACK报文,就认为数据包丢失,随即在重传一次

快速重传是由接收端主动进行的,基于能收到ACK报文,但是需要后续报文做辅助,如果发送的报文恰好是最后一个那么只能等到RTO计时器耗尽后,发送端进行重传。数据包经由发送端发送出去以后,当第N个报文被收到而第N-1个报文乱序或者丢失导致报文没有被收到,接收方每收到一个后续报文就重传一次duplicated ACK,报告未收到第N个报文,发送方收到前两个duplicated ACK会再“等等”以防止是乱序或者延时导致的,当收到第3个duplicated ACK时,发送方就会立即重传第N个报文。

乱序或者丢失导致报文没有被收到,接收方每收到一个后续报文就重传一次duplicated ACK,报告未收到第N个报文,发送方收到前两个duplicated ACK会再“等等”以防止是乱序或者延时导致的,当收到第3个duplicated ACK时,发送方就会立即重传第N个报文。文章来源地址https://www.toymoban.com/news/detail-512010.html

到了这里,关于TCP拥塞控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • TCP拥塞控制详解 | 7. 超越TCP

    网络传输问题本质上是对网络资源的共享和复用问题,因此拥塞控制是网络工程领域的核心问题之一,并且随着互联网和数据中心流量的爆炸式增长,相关算法和机制出现了很多创新,本系列是免费电子书《TCP Congestion Control: A Systems Approach》的中文版,完整介绍了拥塞控制的

    2024年02月11日
    浏览(43)
  • TCP重传, 滑动窗口, 流量控制, 拥塞控制

    1. 重传机制 TCP 实现可靠传输的方式之一,是通过 序列号与确认应答 。 在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回一个确认应答消息,表示已收到消息。 针对数据可能丢失的情况, 用重传机制来解决, 四种常见的重传机制: 超时重传 快速重传 SACK D-SACK 1.

    2024年01月22日
    浏览(48)
  • TCP拥塞控制

    本作是自己看书总结出来的,如有不正,请各位大佬指点一二 所谓拥塞控制,就是防止过多的数据注入到网络,使得网络中的通信设备和通信线缆不会因为过载而导致网络性能大大下降。 网络中通信设备具有数据处理转发性能、通信链路具有的传输带宽,而其中某台性能差

    2024年02月11日
    浏览(40)
  • 运输层:TCP拥塞控制

    笔记来源: 湖科大教书匠:TCP的拥塞控制 声明:该学习笔记来自湖科大教书匠,笔记仅做学习参考 网络资源:在计算机网络中的链路容量(即带宽)、交换结点中的缓存和处理机等 拥塞:在某段时间,若对网络中某一资源的 需求超过 了该资源所能提供的 可用 部分,网络

    2024年02月12日
    浏览(52)
  • TCP_拥塞控制

    24年春节马上就要到了,作为开车党,最大的期盼就是顺利回家过年不要堵车。梦想是美好的,但现实是骨感的,拥堵的道路让人苦不堪言。 在网络世界中,类似于堵车的问题也存在,而TCP(Transmission Control Protocol)的拥塞控制机制就是为了解决这一问题而设计的。 前面介绍

    2024年02月21日
    浏览(37)
  • TCP/IP(十五)拥塞控制

    一  拥塞控制 ①    拥塞控制 必要性 ②  拥赛窗口 cwnd ③  如何知道当前网络 是否出现 了拥塞呢? ④   拥塞控制有 哪些控制算法 ? ⑤  慢启动 ⑥   那慢启动 涨到什么时候 是个头呢? ⑦   拥塞避免算法 ⑧  拥塞发生   ⑨  快速恢复  

    2024年02月08日
    浏览(41)
  • 《利息理论》指导 TCP 拥塞控制

    欧文费雪《利息原理》第 10 章,第 11 章对利息的几何说明是普适的,任何一个负反馈系统都能引申出新结论。给出原书图示,本文依据于此,详情参考原书: 将 burst 看作借贷是合理的,它包含成本(报文),收益(传输吞吐),时间转移(burst or pacing),以及风险(丢包-耗能 or 丢包

    2024年02月08日
    浏览(40)
  • TCP滑动窗口、流量控制及拥塞控制详解

    TCP虽然是面向字节流的,但是TCP传输的单元确实报文段。一个TCP报文段分为首部和数据部分。TCP首部前20个字节是固定的,后面有4N个字节是可选的。因此,TCP首部最小字节数是20个字节。 下面我们看下一TCP首部中几个重要的字段: 源端口 和 目的端口 各占两个字节 序号 ,占

    2024年02月02日
    浏览(38)
  • TCP的拥塞控制算法:慢启动、拥塞避免、快重传、快恢复

    一、前言:什么是拥塞?什么是拥塞控制? 拥塞 :随着网络中的主机增加其发送速率并使网络变得十分拥挤,此时会经常发生丢包现象,导致网络的传输效率急剧降低。 分组的超时重传通常被作为网络拥塞的标志 。 如果不对网络拥塞进行控制,整个网络的吞吐量将随着输

    2024年02月02日
    浏览(42)
  • TCP之超时重传、流量控制和拥塞控制

    TCP超时重传是TCP协议中的一种机制,用于在发生丢包或数据包未及时确认的情况下,重新发送未确认的数据段。 当发送方发送一个数据段后,会启动一个定时器(称为超时计时器),等待接收方的确认。如果在超时时间内未收到确认,发送方就会认为该数据段已经丢失,并进

    2024年02月10日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包