当出现丢包的时候,我们将重新执行慢启动,此时意味着拥塞窗口大幅度下降发送速率也会大幅度下降,当丢包场景并不是很严重的时候,我们还可以采用快速重传,与快速恢复这样一个阶段。
可以看到其实pkt1是丢失了的,那么接收方收到pkt2就是失序报文段,因为pkt0和pkt2之间一定是有pkt1,当没有快速重传机制的时候,那么会回复ack2,然后rto没有超时触发的时候不会发送,当超时触发的时候重新发送pkt1,这种效率是比较低的,。
为什么收到失序的数据段
如果我们的报文丢失了,后续发送的报文,都会到达接收端,这样接收端会发送连续的ack,这些ACK都是确认的丢失的报文段。
同时网络路由器可能基于不同的端口,队列的长度不一样,最后可以导致在没有丢包的情况下,但是我们的顺序发生了错乱,这样在接收端只会收到少量的失序报文,所以会产生少量失序的ACK。
还有一种情况是很有可能在网络中将报文重发了一次,这样也会导致产生少量的ACK。
连续发送了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,网络仍然在流动,此时没有必要进入慢启动。