不丢数据
丢失数据需要重传,那这个重传的时间应该是多少呢?
我们来分析下这个情况:
所以我们的结论应该是
再仔细分析:
这个公式可以忽略,但需要记住一点,如果超时重发的数据,再次超时的时候,又需要重传的时候,TCP 的策略是超时间隔加倍。但是这样超时周期可能相对较长。那是不是可以有更快的方式呢?
在上图,发送方发出了 1,2,3,4,5 份数据:
第一份 Seq1 先送到了,于是就 Ack 回 2;
结果 Seq2 因为某些原因没收到,Seq3 到达了,于是还是 Ack 回 2;
后面的 Seq4 和 Seq5 都到了,但还是 Ack 回 2,因为 Seq2 还是没有收到;
发送端收到了三个 Ack = 2 的确认,知道了 Seq2 还没有收到,就会在定时器过期之前,重传丢失的 Seq2。
最后,收到了 Seq2,此时因为 Seq3,Seq4,Seq5 都收到了,于是 Ack 回 6 。
所以,快速重传的工作方式是当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。
快速重传机制只解决了一个问题,就是超时时间的问题,但是它依然面临着另外一个问题。就是重传的时候,是重传之前的一个,还是重传所有的问题。
根据 TCP 不同的实现,以上两种情况都是有可能的。
那有没有方式能直接知道那些消息需要重传呢?
这种方式需要在 TCP 头部「选项」字段里加一个 SACK 的东西,它可以将缓存的地图发送给发送方,这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数。
总结:
TCP保证消息不丢 最重要的两点: