/usr/include/ns3.26/ns3/tcp-vegas.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 | /* -*- 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: 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 TCPVEGAS_H
#define TCPVEGAS_H
#include "ns3/tcp-congestion-ops.h"
namespace ns3 {
/**
* \ingroup congestionOps
*
* \brief An implementation of TCP Vegas
*
* TCP Vegas is a pure delay-based congestion control algorithm implementing a proactive
* scheme that tries to prevent packet drops by maintaining a small backlog at the
* bottleneck queue.
*
* Vegas continuously measures the actual throughput a connection achieves as shown in
* Equation (1) and compares it with the expected throughput calculated in Equation (2).
* The difference between these 2 sending rates in Equation (3) reflects the amount of
* extra packets being queued at the bottleneck.
*
* actual = cwnd / RTT (1)
* expected = cwnd / BaseRTT (2)
* diff = expected - actual (3)
*
* To avoid congestion, Vegas linearly increases/decreases its congestion window to ensure
* the diff value fall between the 2 predefined thresholds, alpha and beta.
* diff and another threshold, gamma, are used to determine when Vegas should change from
* its slow-start mode to linear increase/decrease mode.
*
* Following the implementation of Vegas in Linux, we use 2, 4, and 1 as the default values
* of alpha, beta, and gamma, respectively.
*
* More information: http://dx.doi.org/10.1109/49.464716
*/
class TcpVegas : public TcpNewReno
{
public:
/**
* \brief Get the type ID.
* \return the object TypeId
*/
static TypeId GetTypeId (void);
/**
* Create an unbound tcp socket.
*/
TcpVegas (void);
/**
* \brief Copy constructor
* \param sock the object to copy
*/
TcpVegas (const TcpVegas& sock);
virtual ~TcpVegas (void);
virtual std::string GetName () const;
/**
* \brief Compute RTTs needed to execute Vegas algorithm
*
* The function filters RTT samples from the last RTT to find
* the current smallest propagation delay + queueing delay (minRtt).
* We take the minimum to avoid the effects of delayed ACKs.
*
* The function also min-filters all RTT measurements seen to find the
* propagation delay (baseRtt).
*
* \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);
/**
* \brief Enable/disable Vegas algorithm depending on the congestion state
*
* We only start a Vegas cycle when we are in normal congestion state (CA_OPEN state).
*
* \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 Vegas linear increase/decrease algorithm
*
* \param tcb internal congestion state
* \param segmentsAcked count of segments ACKed
*/
virtual void IncreaseWindow (Ptr<TcpSocketState> tcb, uint32_t segmentsAcked);
/**
* \brief Get slow start threshold following Vegas principle
*
* \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 ();
protected:
private:
/**
* \brief Enable Vegas algorithm to start taking Vegas samples
*
* Vegas algorithm is enabled in the following situations:
* 1. at the establishment of a connection
* 2. after an RTO
* 3. after fast recovery
* 4. when an idle connection is restarted
*
* \param tcb internal congestion state
*/
void EnableVegas (Ptr<TcpSocketState> tcb);
/**
* \brief Stop taking Vegas samples
*/
void DisableVegas ();
private:
uint32_t m_alpha; //!< Alpha threshold, lower bound of packets in network
uint32_t m_beta; //!< Beta threshold, upper bound of packets in network
uint32_t m_gamma; //!< Gamma threshold, limit on increase
Time m_baseRtt; //!< Minimum of all Vegas RTT measurements seen during connection
Time m_minRtt; //!< Minimum of all RTT measurements within last RTT
uint32_t m_cntRtt; //!< Number of RTT measurements during last RTT
bool m_doingVegasNow; //!< If true, do Vegas for this RTT
SequenceNumber32 m_begSndNxt; //!< Right edge during last RTT
};
} // namespace ns3
#endif // TCPVEGAS_H
|