我们都知道tcp发送的消息,如果没收到ack是会重传的。
具体是怎么重传的呢
比如发送1,2,3,4,5 这5个包,只有2这个包没收到,发送端要怎么重传呢?
没收到2的时候,接受方ack一直都是2,从这个角度来说,发送方其实是不知道3,4,5这个几个包的情况的,所以都会重传。
答:重传2,3,4,5这些包
但是这个很浪费啊,明明3,4,5都收到了的,发送方还要重传一遍。
所以tcp有个sack机制
接受方会返回收到了哪些包,发送方就只是发送2这个包就可以了。
答:开启sack的情况下,只是重传2这个包
还有个问题,tcp的重传默认是要等一段时间的,这个时间就是RTO,RTO的计算比较复杂,可以大概认为和rtt相关,是个相对比较长的时间了。
有不有更快的解决方法呢,毕竟丢包是比较低概率的事情。
快速重传:
发送方连续收到3次相同的ack,这个时候即使超时定时器还没有超时,也开始启动重传。