/* * A timeout has occurred. * Return -1 if it's time to give up, else return 0. */ int rtt_timeout(struct rtt_info *ptr) { /* double rto with min max clamps */ ptr->rtt_rto = rtt_minmax(ptr->rtt_rto << 1); if (++ptr->rtt_nrexmt > RTT_MAXNREXMT) return(-1); /* time to give up for this packet */ return(0); }
/* include rtt_timeout */ int rtt_timeout(struct rtt_info *ptr) { ptr->rtt_rto = rtt_minmax(ptr->rtt_rto * 2); /* next RTO */ if (++ptr->rtt_nrexmt > RTT_MAXNREXMT) return(-1); /* time to give up for this packet */ return(0); }
void rtt_init(struct rtt_info *ptr) { ptr->rtt_base = 0; ptr->rtt_rtt = 0; ptr->rtt_srtt = 0; ptr->rtt_rttvar = 2000000; /* initially 2 seconds */ /* first RTO at (srtt>>3 + rttvar) = 2 seconds */ ptr->rtt_rto = rtt_minmax(RTT_RTOCALC(ptr)); ptr->rtt_nrexmt = 0; }
void rtt_init(struct rtt_info *ptr) { struct timeval tv; gettimeofday(&tv, NULL); ptr->rtt_base = tv.tv_sec; // # sec since 1/1/1970 at start ptr->rtt_rtt = 0; ptr->rtt_srtt = 0; ptr->rtt_rttvar = 0.75; ptr->rtt_rto = rtt_minmax(RTT_RTOCALC(ptr)); // first RTO at (srtt * (4 * rttvar)) = 3 seconds }
void rtt_init(struct rtt_info *ptr) { struct timeval tv; Gettimeofday(&tv, NULL); ptr->rtt_base = tv.tv_sec; /* # sec since 1/1/1970 at start */ ptr->rtt_rtt = 0; ptr->rtt_srtt = 0; ptr->rtt_rttvar = 6; ptr->rtt_rto = rtt_minmax(RTT_RTOCALC(ptr)); /* first RTO at ((srtt + (4 * rttvar)) / 8) = 3 seconds */ }
// 更新RTT估算因子并计算新的RTO void rtt_stop(struct rtt_info *ptr, uint32_t ms) { double delta; ptr->rtt_rtt = ms / 1000.0; // measured RTT in seconds // update our estimators of RTT and mean deviation of RTT. // see Jacobson's SIGCOMM '88 paper, Appendix A, for the details. // we use floating poing here for simplicity. delta = ptr->rtt_rtt - ptr->rtt_srtt; if (delta < 0.0) { delta = -delta; // |delta| } ptr->rtt_rttvar += (delta - ptr->rtt_rttvar) / 4; // h = 1/4 ptr->rtt_rto = rtt_minmax(RTT_RTOCALC(ptr)); }
/* 收到新应答之后,更新RTT估算因子并计算新的RTO */ void rtt_stop(struct rtt_info *ptr, uint32_t ms) { double delta; ptr->rtt_rtt = ms / 1000.0; /*measured RTT in seconds */ //Update our estimators of RTT and mean deviation of RTT. delta = ptr->rtt_rtt - ptr->rtt_srtt; ptr->rtt_srtt += delta / 8; /* g = 1/8 */ if (delta < 0.0) delta = -delta; /* |delta| */ ptr->rtt_rttvar += (delta - ptr->rtt_rttvar) / 4; /* h = 1/4 */ ptr->rtt_rto = rtt_minmax(RTT_RTOCALC(ptr)); }
/* include rtt_stop */ void rtt_stop(struct rtt_info* ptr, uint32_t ms) { double delta; ptr->rtt_rtt = ms / 1000.0; /* measured RTT in seconds */ /* * Update our estimators of RTT and mean deviation of RTT. * See Jacobson's SIGCOMM '88 paper, Appendix A, for the details. * We use floating point here for simplicity. */ delta = ptr->rtt_rtt - ptr->rtt_srtt; ptr->rtt_srtt += delta / 8; /* g = 1/8 */ if (delta < 0.0) delta = -delta; /* |delta| */ ptr->rtt_rttvar += (delta - ptr->rtt_rttvar) / 4; /* h = 1/4 */ ptr->rtt_rto = rtt_minmax(RTT_RTOCALC(ptr)); }
/* * A response was received. * Stop the timer and update the appropriate values in the structure * based on this packet's RTT. We calculate the RTT, then update the * estimators of the RTT and its mean deviation. * This function should be called right after turning off the * timer with alarm(0), or right after a timeout occurs. */ void rtt_stop(struct rtt_info *ptr) { /* Retransmission ambiguity problem: solved */ if(ptr->rtt_nrexmt > 0) { return; } /* Update most recent measured RTT in usec */ ptr->rtt_rtt = rtt_ts(ptr); /* * Jacobson‐Karels Algorithm * Update our estimators of RTT and mean deviation of RTT. * See Jacobson's SIGCOMM '88 paper, Appendix A, for the details. */ ptr->rtt_rtt -= ptr->rtt_srtt >> 3; ptr->rtt_srtt += ptr->rtt_rtt; if(ptr->rtt_rtt < 0) { ptr->rtt_rtt = -ptr->rtt_rtt; } ptr->rtt_rtt -= ptr->rtt_rttvar >> 2; ptr->rtt_rttvar += ptr->rtt_rtt; ptr->rtt_rto = rtt_minmax(RTT_RTOCALC(ptr)); }