tcp在kernel-4.3内核中加入了RACK机制,用从时间维度上来判断丢包,用最新被(S)ACK确认的数据包为基准,其发送时间减去一个乱序时间窗口之前的数据包如果没有收到反馈,就可以判断为丢失了。主要为了解决尾部丢包和二次重传的问题。
旧版RACK一个比较明显的缺点就是容易误判,尤其是在重传数据包被(S)ACK确认,是否更新最近被确认的数据包问题上,只是简单用判断重传到被确认的时间是否大于min_rtt。如果min_rtt很小,连接又有乱序情况,很容易误判一大片丢包,造成传输效率低下的问题。
当然,旧版的RACK还存在其他问题,比如时间窗口值为(1ms,min_rtt/4)的最大值,几乎可以认为是一个固定的值,当发现误判时,收到客户端反馈回来的D-SACK信息,并不能动态的调节这个乱序时间窗口。其次,RACK的另一个好处是解决尾部丢包问题,但是这是ack驱动的,每次丢包判断只能在更新了最近被(S)ACK之后进行。如果某一次判定,最新更新数据包的发送时间与该发送时间减去乱序时间窗口的时间区间,还剩下两三个数据包未能判断丢失,只能等下次满足判断条件的ack到来。