F-RTO(ForwardRTORecovery)
根据TCP采取的拥塞控制机制,如果出现了超时,则就会进入拥塞避免算法,而且对于超时的情形会执行“慢启动”,这会极大的降低TCP的吞吐量。但是由于TCP是建立在IP之上的,IP是无连接的,不同的IP数据报可能走不同的路径,因而属于一个TCP连接的不同的报文段可能走的是不同的路径,这意味着它们可能乱序到达。因此超时可能是因为报文段在IP中走了一条低速路径,并不是真的出现了丢包。考虑以下情景,两个主机A和B之间进行TCP通信,A要发送TCP报文段a,b,c,d,e到B:
- A发送报文段a,这时候IP网络选择的路径是path1,它是一个“正常”的路径
- IP网络路由发生变化,A和B之间的路径变成了path2,它是一个“低速”路径
- A发送报文段b,这时候IP网络使用新的“低速”路径path2
- IP网络路由发生变化,A和B之间的路径又变回了path1,它是一个“正常”路径
- A发送报文段c,这时候IP网络选择的路径是path1
- B收到报文段a,并对它进行确认
- A发送报文段d,并使用路径path1
- A发送报文段e,并使用路径path1
- B收到报文段c,报文乱序,不进行确认
- A发现报文段b超时,并开始执行拥塞算法
- B收到报文段b,并对报文段b和c进行确认
- B收到报文段d,并对它进行确认
- B收到报文段e,并对它进行确认
F-RTO的基本思想是判断RTO是否正常,从而决定是否执行拥塞避免算法。方法是观察RTO之后的两个ACK。如果ACK不是冗余ACK,并且确认的包不是重传的,会认为RTO是虚假的就不执行拥塞避免算法。