NS-3 based Named Data Networking (NDN) simulator
ndnSIM 2.0: NDN, CCN, CCNx, content centric networks
API Documentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
ndn-rtt-mean-deviation.cpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 //
3 // Copyright (c) 2006 Georgia Tech Research Corporation
4 // (c) 2013 University of Arizona
5 // (c) 2013 University of California, Los Angeles
6 //
7 // This program is free software; you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License version 2 as
9 // published by the Free Software Foundation;
10 //
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
15 //
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 //
20 // Author: Rajib Bhattacharjea<raj.b@gatech.edu>
21 // Cheng Yi <yic@email.arizona.edu>
22 // Alexander Afanasyev <alexander.afanasyev@ucla.edu>
23 //
24 
25 // Georgia Tech Network Simulator - Round Trip Time Estimation Class
26 // George F. Riley. Georgia Tech, Spring 2002
27 
29 #include "ns3/simulator.h"
30 #include "ns3/double.h"
31 #include "ns3/integer.h"
32 #include "ns3/uinteger.h"
33 #include "ns3/log.h"
34 
35 NS_LOG_COMPONENT_DEFINE("ndn.RttMeanDeviation");
36 
37 namespace ns3 {
38 namespace ndn {
39 
40 //---------------------------------------------------------------------------------
41 // A modified version of Mean-Deviation Estimator optimized for NDN packet delivery
42 
44 
45 TypeId
47 {
48  static TypeId tid =
49  TypeId("ns3::ndn::RttMeanDeviation")
50  .SetParent<RttEstimator>()
51  .AddConstructor<RttMeanDeviation>()
52  .AddAttribute("Gain", "Gain used in estimating the RTT (smoothed RTT), must be 0 < Gain < 1",
53  DoubleValue(0.125), MakeDoubleAccessor(&RttMeanDeviation::m_gain),
54  MakeDoubleChecker<double>())
55  .AddAttribute("Gain2", "Gain2 used in estimating the RTT (variance), must be 0 < Gain2 < 1",
56  DoubleValue(0.25), MakeDoubleAccessor(&RttMeanDeviation::m_gain2),
57  MakeDoubleChecker<double>());
58  return tid;
59 }
60 
62  : m_variance(0)
63 {
64  NS_LOG_FUNCTION(this);
65 }
66 
68  : RttEstimator(c)
69  , m_gain(c.m_gain)
70  , m_gain2(c.m_gain2)
71  , m_variance(c.m_variance)
72 {
73  NS_LOG_FUNCTION(this);
74 }
75 
76 TypeId
78 {
79  return GetTypeId();
80 }
81 
82 void
84 {
85  NS_LOG_FUNCTION(this << m);
86  if (m_nSamples) { // Not first
87  Time err(m - m_currentEstimatedRtt);
88  double gErr = err.ToDouble(Time::S) * m_gain;
89  m_currentEstimatedRtt += Time::FromDouble(gErr, Time::S);
90  Time difference = Abs(err) - m_variance;
91  NS_LOG_DEBUG(
92  "m_variance += " << Time::FromDouble(difference.ToDouble(Time::S) * m_gain2, Time::S));
93  m_variance += Time::FromDouble(difference.ToDouble(Time::S) * m_gain2, Time::S);
94  }
95  else { // First sample
96  m_currentEstimatedRtt = m; // Set estimate to current
97  // variance = sample / 2; // And variance to current / 2
98  // m_variance = m; // try this why????
99  m_variance = Seconds(m.ToDouble(Time::S) / 2);
100  NS_LOG_DEBUG("(first sample) m_variance += " << m);
101  }
102  m_nSamples++;
103 }
104 
105 Time
107 {
108  NS_LOG_FUNCTION(this);
109 
110  double retval = std::min(m_maxRto.ToDouble(Time::S),
111  std::max(m_multiplier * m_minRto.ToDouble(Time::S),
112  m_multiplier * (m_currentEstimatedRtt.ToDouble(Time::S)
113  + 4 * m_variance.ToDouble(Time::S))));
114 
115  NS_LOG_DEBUG("RetransmitTimeout: return " << retval);
116 
117  return Seconds(retval);
118 }
119 
120 Ptr<RttEstimator>
122 {
123  NS_LOG_FUNCTION(this);
124  return CopyObject<RttMeanDeviation>(this);
125 }
126 
127 void
129 {
130  NS_LOG_FUNCTION(this);
131  // Reset to initial state
132  m_variance = Seconds(0);
134 }
135 
136 void
138 {
139  NS_LOG_FUNCTION(this);
140  NS_ASSERT_MSG((g > 0) && (g < 1),
141  "RttMeanDeviation: Gain must be less than 1 and greater than 0");
142  m_gain = g;
143 }
144 
145 void
146 RttMeanDeviation::SentSeq(SequenceNumber32 seq, uint32_t size)
147 {
148  NS_LOG_FUNCTION(this << seq << size);
149 
150  RttHistory_t::iterator i;
151  for (i = m_history.begin(); i != m_history.end(); ++i) {
152  if (seq == i->seq) { // Found it
153  i->retx = true;
154  break;
155  }
156  }
157 
158  // Note that a particular sequence has been sent
159  if (i == m_history.end())
160  m_history.push_back(RttHistory(seq, size, Simulator::Now()));
161 }
162 
163 Time
164 RttMeanDeviation::AckSeq(SequenceNumber32 ackSeq)
165 {
166  NS_LOG_FUNCTION(this << ackSeq);
167  // An ack has been received, calculate rtt and log this measurement
168  // Note we use a linear search (O(n)) for this since for the common
169  // case the ack'ed packet will be at the head of the list
170  Time m = Seconds(0.0);
171  if (m_history.size() == 0)
172  return (m); // No pending history, just exit
173 
174  for (RttHistory_t::iterator i = m_history.begin(); i != m_history.end(); ++i) {
175  if (ackSeq == i->seq) { // Found it
176  if (!i->retx) {
177  m = Simulator::Now() - i->time; // Elapsed time
178  Measurement(m); // Log the measurement
179  ResetMultiplier(); // Reset multiplier on valid measurement
180  }
181  m_history.erase(i);
182  break;
183  }
184  }
185 
186  return m;
187 }
188 
189 } // namespace ndn
190 } // namespace ns3
void SentSeq(SequenceNumber32 seq, uint32_t size)
Note that a particular sequence has been sent.
virtual TypeId GetInstanceTypeId(void) const
The modified version of "Mean--Deviation" RTT estimator, as discussed by Van Jacobson that better sui...
NS_OBJECT_ENSURE_REGISTERED(ContentStore)
Time RetransmitTimeout()
Returns the estimated RTO.
Ptr< RttEstimator > Copy() const
virtual void Reset()
Resets the estimation to its initial state.
void Reset()
Resets the estimation to its initial state.
virtual void ResetMultiplier()
Resets the estimation multiplier to 1.
ndn RttMeanDeviation
Time AckSeq(SequenceNumber32 ackSeq)
Note that a particular ack sequence has been received.
Base class for all RTT Estimators.
Helper class to store RTT measurements.
void Measurement(Time measure)
Add a new measurement to the estimator.