• 传输层 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)


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

  • 相关阅读:
    基于二维切片图序列的三维立体建模MATLAB仿真
    list[dict]类型数据如何提取和储存?
    Kubernetes v1.25 搭建单节点集群用于Debug K8S源码
    javaH5女娲宫旅游网站设计与实现计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
    服务器git安装python包失败,如何手动下载github项目包并安装到虚拟环境中(简单易懂)
    docker&kubernets篇(二十三)
    Debug Information
    python播放声音库playsound以及获取路径以及修改库源码
    周老师话职称(陕西省职称申报好处)
    uniapp自定义顶部导航栏
  • 原文地址:https://blog.csdn.net/qq_34556414/article/details/126700579