NS-3 based Named Data Networking (NDN) simulator
ndnSIM 2.0: NDN, CCN, CCNx, content centric networks
API Documentation
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 
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.
Copyright (c) 2011-2015 Regents of the University of California.
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.
Table::const_iterator iterator
Definition: cs-internal.hpp:41
virtual void ResetMultiplier()
Resets the estimation multiplier to 1.
ndn RttMeanDeviation
Copyright (c) 2011-2015 Regents of the University of California.
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.