NS-3 based Named Data Networking (NDN) simulator
ndnSIM 2.5: 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
28
#include "
ndn-rtt-mean-deviation.hpp
"
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
43
NS_OBJECT_ENSURE_REGISTERED
(
RttMeanDeviation
);
44
45
TypeId
46
RttMeanDeviation::GetTypeId
(
void
)
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
61
RttMeanDeviation::RttMeanDeviation
()
62
: m_variance(0)
63
{
64
NS_LOG_FUNCTION(
this
);
65
}
66
67
RttMeanDeviation::RttMeanDeviation
(
const
RttMeanDeviation
& c)
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
77
RttMeanDeviation::GetInstanceTypeId
(
void
)
const
78
{
79
return
GetTypeId
();
80
}
81
82
void
83
RttMeanDeviation::Measurement
(Time m)
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
106
RttMeanDeviation::RetransmitTimeout
()
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>
121
RttMeanDeviation::Copy
()
const
122
{
123
NS_LOG_FUNCTION(
this
);
124
return
CopyObject<RttMeanDeviation>(
this
);
125
}
126
127
void
128
RttMeanDeviation::Reset
()
129
{
130
NS_LOG_FUNCTION(
this
);
131
// Reset to initial state
132
m_variance = Seconds(0);
133
RttEstimator::Reset
();
134
}
135
136
void
137
RttMeanDeviation::Gain
(
double
g)
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
ns3::ndn::RttMeanDeviation::Measurement
void Measurement(Time measure)
Add a new measurement to the estimator.
Definition:
ndn-rtt-mean-deviation.cpp:83
ns3::ndn::RttEstimator::m_nSamples
uint32_t m_nSamples
Definition:
ndn-rtt-estimator.hpp:182
ns3::ndn::RttEstimator
Base class for all RTT Estimators.
Definition:
ndn-rtt-estimator.hpp:61
ns3::ndn::RttEstimator::m_multiplier
uint16_t m_multiplier
Definition:
ndn-rtt-estimator.hpp:183
ns3::ndn::RttEstimator::m_maxRto
Time m_maxRto
Definition:
ndn-rtt-estimator.hpp:181
ns3
Copyright (c) 2011-2015 Regents of the University of California.
Definition:
ndn-app-link-service.cpp:32
ns3::ndn::RttMeanDeviation::RetransmitTimeout
Time RetransmitTimeout()
Returns the estimated RTO.
Definition:
ndn-rtt-mean-deviation.cpp:106
ns3::ndn::RttEstimator::m_history
RttHistory_t m_history
Definition:
ndn-rtt-estimator.hpp:184
ndn-rtt-mean-deviation.hpp
ns3::ndn::RttEstimator::m_currentEstimatedRtt
Time m_currentEstimatedRtt
Definition:
ndn-rtt-estimator.hpp:179
ns3::ndn::RttMeanDeviation
The modified version of "Mean--Deviation" RTT estimator, as discussed by Van Jacobson that better sui...
Definition:
ndn-rtt-mean-deviation.hpp:47
ns3::ndn::NS_OBJECT_ENSURE_REGISTERED
NS_OBJECT_ENSURE_REGISTERED(GlobalRouter)
ns3::ndn::RttMeanDeviation::Copy
Ptr< RttEstimator > Copy() const
Definition:
ndn-rtt-mean-deviation.cpp:121
ns3::ndn::RttMeanDeviation::AckSeq
Time AckSeq(SequenceNumber32 ackSeq)
Note that a particular ack sequence has been received.
Definition:
ndn-rtt-mean-deviation.cpp:164
ns3::ndn::RttEstimator::Reset
virtual void Reset()
Resets the estimation to its initial state.
Definition:
ndn-rtt-estimator.cpp:244
ns3::ndn::RttMeanDeviation::Gain
void Gain(double g)
Definition:
ndn-rtt-mean-deviation.cpp:137
ns3::ndn::RttMeanDeviation::Reset
void Reset()
Resets the estimation to its initial state.
Definition:
ndn-rtt-mean-deviation.cpp:128
ns3::ndn::RttEstimator::m_minRto
Time m_minRto
Definition:
ndn-rtt-estimator.hpp:180
ns3::ndn::RttMeanDeviation::SentSeq
void SentSeq(SequenceNumber32 seq, uint32_t size)
Note that a particular sequence has been sent.
Definition:
ndn-rtt-mean-deviation.cpp:146
ns3::ndn::RttHistory
Helper class to store RTT measurements.
Definition:
ndn-rtt-estimator.hpp:43
ns3::ndn::RttMeanDeviation::GetTypeId
static TypeId GetTypeId(void)
Definition:
ndn-rtt-mean-deviation.cpp:46
ns3::ndn::RttMeanDeviation::GetInstanceTypeId
virtual TypeId GetInstanceTypeId(void) const
Definition:
ndn-rtt-mean-deviation.cpp:77
ndn
Copyright (c) 2011-2015 Regents of the University of California.
Definition:
ndn-strategy-choice-helper.hpp:34
ns3::ndn::RttMeanDeviation::RttMeanDeviation
RttMeanDeviation()
Definition:
ndn-rtt-mean-deviation.cpp:61
ns3::ndn::RttEstimator::ResetMultiplier
virtual void ResetMultiplier()
Resets the estimation multiplier to 1.
Definition:
ndn-rtt-estimator.cpp:237
ndnSIM
utils
ndn-rtt-mean-deviation.cpp
Generated on Mon Jun 1 2020 22:32:16 for ndnSIM by
1.8.18