1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 // 5 // A convenience class to store rtt samples and calculate smoothed rtt. 6 7 #ifndef NET_QUIC_CONGESTION_CONTROL_RTT_STATS_H_ 8 #define NET_QUIC_CONGESTION_CONTROL_RTT_STATS_H_ 9 10 #include <algorithm> 11 12 #include "base/basictypes.h" 13 #include "net/quic/quic_protocol.h" 14 #include "net/quic/quic_time.h" 15 16 namespace net { 17 18 namespace test { 19 class RttStatsPeer; 20 } // namespace test 21 22 class NET_EXPORT_PRIVATE RttStats { 23 public: 24 RttStats(); 25 26 // Returns true if any RTT measurements have been made. 27 bool HasUpdates() const; 28 29 // Updates the RTT from an incoming ack which is received |send_delta| after 30 // the packet is sent and the peer reports the ack being delayed |ack_delay|. 31 void UpdateRtt(QuicTime::Delta send_delta, 32 QuicTime::Delta ack_delay, 33 QuicTime now); 34 35 // Causes the smoothed_rtt to be increased to the latest_rtt if the latest_rtt 36 // is larger. The mean deviation is increased to the most recent deviation if 37 // it's larger. 38 void ExpireSmoothedMetrics(); 39 40 // Forces RttStats to sample a new recent min rtt within the next 41 // |num_samples| UpdateRtt calls. 42 void SampleNewRecentMinRtt(uint32 num_samples); 43 44 QuicTime::Delta SmoothedRtt() const; 45 initial_rtt_us()46 int64 initial_rtt_us() const { 47 return initial_rtt_us_; 48 } 49 50 // Sets an initial RTT to be used for SmoothedRtt before any RTT updates. set_initial_rtt_us(int64 initial_rtt_us)51 void set_initial_rtt_us(int64 initial_rtt_us) { 52 initial_rtt_us_ = initial_rtt_us; 53 } 54 latest_rtt()55 QuicTime::Delta latest_rtt() const { 56 return latest_rtt_; 57 } 58 59 // Returns the min_rtt for the entire connection. min_rtt()60 QuicTime::Delta min_rtt() const { 61 return min_rtt_; 62 } 63 64 // Returns the min_rtt since SampleNewRecentMinRtt has been called, or the 65 // min_rtt for the entire connection if SampleNewMinRtt was never called. recent_min_rtt()66 QuicTime::Delta recent_min_rtt() const { 67 return recent_min_rtt_.rtt; 68 } 69 mean_deviation()70 QuicTime::Delta mean_deviation() const { 71 return mean_deviation_; 72 } 73 74 // Sets how old a recent min rtt sample can be. set_recent_min_rtt_window(QuicTime::Delta recent_min_rtt_window)75 void set_recent_min_rtt_window(QuicTime::Delta recent_min_rtt_window) { 76 recent_min_rtt_window_ = recent_min_rtt_window; 77 } 78 79 private: 80 friend class test::RttStatsPeer; 81 82 // Used to track a sampled RTT window. 83 struct RttSample { RttSampleRttSample84 RttSample() : rtt(QuicTime::Delta::Zero()), time(QuicTime::Zero()) { } RttSampleRttSample85 RttSample(QuicTime::Delta rtt, QuicTime time) : rtt(rtt), time(time) { } 86 87 QuicTime::Delta rtt; 88 QuicTime time; // Time the rtt sample was recorded. 89 }; 90 91 // Implements the resampling algorithm and the windowed min rtt algorithm. 92 void UpdateRecentMinRtt(QuicTime::Delta rtt_sample, QuicTime now); 93 94 QuicTime::Delta latest_rtt_; 95 QuicTime::Delta min_rtt_; 96 QuicTime::Delta smoothed_rtt_; 97 // Mean RTT deviation during this session. 98 // Approximation of standard deviation, the error is roughly 1.25 times 99 // larger than the standard deviation, for a normally distributed signal. 100 QuicTime::Delta mean_deviation_; 101 int64 initial_rtt_us_; 102 103 RttSample new_min_rtt_; 104 uint32 num_min_rtt_samples_remaining_; 105 106 // State variables for Kathleen Nichols MinRTT algorithm. 107 QuicTime::Delta recent_min_rtt_window_; 108 RttSample recent_min_rtt_; // a in the windowed algorithm. 109 RttSample half_window_rtt_; // b in the sampled algorithm. 110 RttSample quarter_window_rtt_; // c in the sampled algorithm. 111 112 DISALLOW_COPY_AND_ASSIGN(RttStats); 113 }; 114 115 } // namespace net 116 117 #endif // NET_QUIC_CONGESTION_CONTROL_RTT_STATS_H_ 118