/usr/include/ns3.26/ns3/tcp-illinois.h is in libns3-dev 3.26+dfsg-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 | /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2016 ResiliNets, ITTC, University of Kansas
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author: Keerthi Ganta <keerthiganta@ku.edu>
* Truc Anh N. Nguyen <annguyen@ittc.ku.edu>
*
* James P.G. Sterbenz <jpgs@ittc.ku.edu>, director
* ResiliNets Research Group http://wiki.ittc.ku.edu/resilinets
* Information and Telecommunication Technology Center (ITTC)
* and Department of Electrical Engineering and Computer Science
* The University of Kansas Lawrence, KS USA.
*/
#ifndef TCPILLINOIS_H
#define TCPILLINOIS_H
#include "ns3/tcp-congestion-ops.h"
namespace ns3 {
/**
* \ingroup congestionOps
*
* \brief An implementation of TCP Illinois algorithm
*
* TCP Illinois is a hybrid congestion control algorithm designed for
* high-speed networks. Illinois implements a Concave-AIMD (or C-AIMD)
* algorithm that uses packet loss as the primary congestion signal to
* determine the direction of window update and queueing delay as the
* secondary congestion signal to determine the amount of change.
*
* The additive increase and multiplicative decrease factors (denoted as
* alpha and beta, respectively) are functions of the current average queueing
* delay da as shown in Equations (1) and (2). To improve the protocol
* robustness against sudden fluctuations in its delay sampling,
* Illinois allows the increment of alpha to alphaMax
* only if da stays below d1 for a some (theta) amount of time.
*
* / alphaMax if da <= d1
* alpha = (1)
* \ k1 / (k2 + da) otherwise
*
* / betaMin if da <= d2
* beta = k3 + k4da if d2 < da < d3 (2)
* \ betaMax otherwise
*
* where the calculations of k1, k2, k3, and k4 are shown in Equations (3), (4),
* (5), and (6).
*
* k1 = (dm - d1)(alphaMin)alphaMax / (alphaMax - alphaMin) (3)
*
* k2 = ((dm - d1)alphaMin / (alphaMax - alphaMin)) - d1 (4)
*
* k3 = ((alphaMin)d3 - (alphaMax)d2) / (d3 - d2) (5)
*
* k4 = (alphaMax - alphaMin) / (d3 - d2) (6)
*
* with da the current average queueing delay calculated in Equation (7) where:
* Ta is the average RTT (sumRtt / cntRtt in the implementation) and
* Tmin (baseRtt in the implementation) is the minimum RTT ever seen
* dm the maximum (average) queueing delay calculated in Equation (8) where
* Tmax (maxRtt in the implementation) is the maximum RTT ever seen
*
* da = Ta - Tmin (7)
*
* dm = Tmax - Tmin (8)
*
* di (i = 1,2,3) are calculated in Equation (9) (0 <= eta_1 < 1, and
* 0 <= eta_2 <= eta_3 <=1)
*
* di = (eta_i)dm (9)
*
* Illinois only executes its adaptation of alpha and beta when cwnd exceeds a
* threshold called winThresh. Otherwise, it sets alpha and beta to the base
* values of 1 and 0.5, respectively.
*
* Following the implementation of Illinois in the Linux kernel, we use the following
* default parameter settings:
*
* alphaMin = 0.3 (0.1 in the Illinois paper)
* alphaMax = 10.0
* betaMin = 0.125
* betaMax = 0.5
* winThresh = 15 (10 in the Illinois paper)
* theta = 5
* eta1 = 0.01
* eta2 = 0.1
* eta3 = 0.8
*
* More information: http://www.doi.org/10.1145/1190095.1190166
*/
class TcpIllinois : public TcpNewReno
{
public:
/**
* \brief Get the type ID.
* \return the object TypeId
*/
static TypeId GetTypeId (void);
/**
* Create an unbound tcp socket.
*/
TcpIllinois (void);
/**
* \brief Copy constructor
* \param sock the object to copy
*/
TcpIllinois (const TcpIllinois& sock);
virtual ~TcpIllinois (void);
virtual std::string GetName () const;
/**
* \brief Get slow start threshold after congestion event
*
* \param tcb internal congestion state
* \param bytesInFlight bytes in flight
*
* \return the slow start threshold value
*/
virtual uint32_t GetSsThresh (Ptr<const TcpSocketState> tcb,
uint32_t bytesInFlight);
virtual Ptr<TcpCongestionOps> Fork ();
/**
* \brief Reset Illinois parameters to default values upon a loss
*
* \param tcb internal congestion state
* \param newState new congestion state to which the TCP is going to switch
*/
virtual void CongestionStateSet (Ptr<TcpSocketState> tcb,
const TcpSocketState::TcpCongState_t newState);
/**
* \brief Adjust cwnd following Illinois congestion avoidance algorithm
*
* \param tcb internal congestion state
* \param segmentsAcked count of segments ACKed
*/
virtual void IncreaseWindow (Ptr<TcpSocketState> tcb, uint32_t segmentsAcked);
/**
* \brief Measure RTT for each ACK
* Keep track of min and max RTT
*
* \param tcb internal congestion state
* \param segmentsAcked count of segments ACKed
* \param rtt last RTT
*/
virtual void PktsAcked (Ptr<TcpSocketState> tcb, uint32_t segmentsAcked,
const Time& rtt);
protected:
private:
/**
* \brief Recalculate alpha and beta every RTT
*
* \param cWnd current Cwnd (in bytes)
*/
void RecalcParam (uint32_t cWnd);
/**
* \brief Calculate additive increase factor alpha
*
* If average queueing delay is at minimum, then alpha is set to alphaMax.
* Otherwise, alpha is a decreasing function of average queueing delay.
*
* \param da current average queueing delay
* \param dm maximum average queueing delay
*
*/
void CalculateAlpha (double da, double dm);
/**
* \brief Calculate multiplicative decrease factor beta
*
* If the current average queueing delay is <= 10% of max. (average) queueing delay,
* beta is set to betaMin, which equals to 1/8 by default.
* If the current average queueing delay is >= 80% of max. (average) queueing delay,
* beta is set to betaMax, which equals to 1/2 by default.
* Otherwise, beta is an increasing function of average queueing delay.
*
* \param da current average queueing delay
* \param dm maximum average queueing delay
*
*/
void CalculateBeta (double da, double dm);
/**
* \brief Calculate average queueing delay
*
* \return average queueing delay da
*/
Time CalculateAvgDelay () const;
/**
* \brief Calculate maximum queueing delay
*
* \return maximum average queueing delay dm
*/
Time CalculateMaxDelay () const;
/**
* \brief Reset Illinois parameters
*
* \param nextTxSequence Next sequence to transmit
*/
void Reset (const SequenceNumber32 &nextTxSequence);
private:
Time m_sumRtt; //!< Sum of all RTT measurements during last RTT
uint32_t m_cntRtt; //!< Number of RTT measurements during last RTT
Time m_baseRtt; //!< Minimum of all RTT measurements
Time m_maxRtt; //!< Maximum of all RTT measurements
SequenceNumber32 m_endSeq; //!< Right edge of current RTT
bool m_rttAbove; //!< True when da > d1
uint8_t m_rttLow; //!< Number of RTTs da has stayed below d1
double m_alphaMin; //!< Minimum alpha threshold
double m_alphaMax; //!< Maximum alpha threshold
double m_alphaBase; //!< Base value of alpha for standard AIMD
double m_alpha; //!< Additive increase factor
double m_betaMin; //!< Minimum beta threshold
double m_betaMax; //!< Maximum beta threshold
double m_betaBase; //!< Base value of beta for standard AIMD
double m_beta; //!< Multiplicative decrease factor
uint32_t m_winThresh; //!< Window threshold for adaptive sizing
uint32_t m_theta; //!< Number of RTTs required before setting alpha to its max
uint32_t m_ackCnt; //!< Number of received ACK
};
} // namespace ns3
#endif // TCPILLINOIS_H
|