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

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

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


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

为什么收到失序的数据段

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

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

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

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

扫描二维码关注公众号,回复: 14520635 查看本文章

快速重传(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)


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

猜你喜欢

转载自blog.csdn.net/qq_34556414/article/details/126700579
今日推荐