有几个关键时间
3个。
- 供定时器基础模块使用的rto
- tcp控制块上记录的rtt
- bbr算法中的记录的rtt
BBR算法中rtt的更新
bbr算法中的min_rtt_us来自样本中的rtt_us,rtt_us来自ack报文中的携带的回显时间戳与中记录的当前时间(这个时间与当前时间不一定相等)
只要样本中的rtt_us小于当前bbr状态记录中的min_rtt_us,则更新min_rtt_us;或者min_rtt_us已超时,就是测得的最小值已经超过10s,则更新成当前rtt值。
tcp控制块上记录的rtt
与bbr算法更新rtt的时机一样,但是保存在minmax结构中,即保存一定时间内的三个最优minrtt值。
供定时器模块使用的rto
与上面两个时间在同一个时机,处理ack的时候。
rto的计算较为复杂,来自tcp控制块中的rttvar_us和srtt_us,= srtt_us>>3 + rttvar_us。
将上面的公式全部换算成与rtt的关系。下面是linux中换算,
static void tcp_rtt_estimator(struct sock *sk, long mrtt_us)
{
struct tcp_sock *tp = tcp_sk(sk);
long m = mrtt_us; /* RTT */
u32 srtt = tp->srtt_us;
/* The following amusing code comes from Jacobson&