• 传输层 TCP 拥塞控制(3):快速重传与快速恢复


    当出现丢包的时候,我们将重新执行慢启动,此时意味着拥塞窗口大幅度下降发送速率也会大幅度下降,当丢包场景并不是很严重的时候,我们还可以采用快速重传,与快速恢复这样一个阶段。

    为何会接收到一个失序数据段?


    可以看到其实pkt1是丢失了的,那么接收方收到pkt2就是失序报文段,因为pkt0和pkt2之间一定是有pkt1,当没有快速重传机制的时候,那么会回复ack2,然后rto没有超时触发的时候不会发送,当超时触发的时候重新发送pkt1,这种效率是比较低的,。

    为什么收到失序的数据段

    若报文丢失,将会产生连续的失序 ACK 段
    若网络路径与设备导致数据段失序,将会产生少量的失序 ACK 段
    若报文重复,将会产生少量的失序 ACK 段

    如果我们的报文丢失了,后续发送的报文,都会到达接收端,这样接收端会发送连续的ack,这些ACK都是确认的丢失的报文段。

    同时网络路由器可能基于不同的端口,队列的长度不一样,最后可以导致在没有丢包的情况下,但是我们的顺序发生了错乱,这样在接收端只会收到少量的失序报文,所以会产生少量失序的ACK。

    还有一种情况是很有可能在网络中将报文重发了一次,这样也会导致产生少量的ACK。

    快速重传(RFC2581)


    连续发送了pkt 3 4 5 6,其中第5个报文丢失了,我们收到ACK4的时候这不是一个失序的,当收到ACK5的时候,它已经重复了一次,当发pkt7 pkt8的时候,我们再次接收到了ACK5,除了第一次正常的接收到之外,后面还重复了三次,从重复三次以后,我们将进入快速重传,所谓快速重传就是将连续三次重复丢失了ACK5,我们就重发pkt5。

    快速重传包含了两个部分,第一个首先针对于接收方,当收到失序的数据段的时候,必须立刻发送期待缺口ACK序列号。

    比如receiver收到了pkt6,但是它要的是pkt5,就要立刻发送pkt5,不能使用延时确认确认等等。

    receiver缺失了pkt5,后面又收到了pkt 6 7 8,当他再次收到pkt5的时候,那么发送下一个ACK9,需要pkt9。

    超时不会启动快速重传


    重传定时器到达之后,是不会启动我们快速重传的,必须是收到连续的三个重复的ack才会启动。

    快速重传下一定要进入慢启动吗?


    快速重传意味着丢包,慢启动会突然减少数据流。但是在快速重传场景下,整个网络还是通的,我们还是频繁的收到ACK,网络仍然在流动,此时没有必要进入慢启动。

    快速恢复(RFC2581)


    针对在快速重传场景下,我们不需要进入慢启动,而只是适当的将网速降下来一点。

  • 相关阅读:
    选硬币该用动态规划
    [GAN]老照片修复Bringing Old Photos Back to Life论文总结
    SSM项目 - Online Music Player(在线音乐播放器)- 前端页面设计 - 细节狂魔
    正厚知识 | 超算“超”在何处
    Linux应用 防止程序重复发起
    Vue-CLI的安装、使用及环境配置(超详细)
    OEEL高阶图表——对比2000和2017年全球不同类型发电占比柱状图
    【Shell编程】快速入门变量、字符串、传递参数
    Spring Boot面试必问:启动流程
    微服务架构演进
  • 原文地址:https://blog.csdn.net/qq_34556414/article/details/126700579