BIC congestion control algorithm. More...
#include "tcp-bic.h"
Public Member Functions | |
TcpBic () | |
Constructor. | |
TcpBic (const TcpBic &sock) | |
Copy constructor. | |
Ptr< TcpCongestionOps > | Fork () override |
Copy the congestion control algorithm across sockets. | |
std::string | GetName () const override |
Get the name of the congestion control algorithm. | |
uint32_t | GetSsThresh (Ptr< const TcpSocketState > tcb, uint32_t bytesInFlight) override |
Get the slow start threshold after a loss event. | |
void | IncreaseWindow (Ptr< TcpSocketState > tcb, uint32_t segmentsAcked) override |
Congestion avoidance algorithm implementation. | |
Public Member Functions inherited from ns3::TcpCongestionOps | |
TcpCongestionOps () | |
TcpCongestionOps (const TcpCongestionOps &other) | |
Copy constructor. | |
~TcpCongestionOps () override | |
virtual void | CongControl (Ptr< TcpSocketState > tcb, const TcpRateOps::TcpRateConnection &rc, const TcpRateOps::TcpRateSample &rs) |
Called when packets are delivered to update cwnd and pacing rate. | |
virtual void | CongestionStateSet (Ptr< TcpSocketState > tcb, const TcpSocketState::TcpCongState_t newState) |
Trigger events/calculations specific to a congestion state. | |
virtual void | CwndEvent (Ptr< TcpSocketState > tcb, const TcpSocketState::TcpCAEvent_t event) |
Trigger events/calculations on occurrence of congestion window event. | |
virtual bool | HasCongControl () const |
Returns true when Congestion Control Algorithm implements CongControl. | |
virtual void | Init (Ptr< TcpSocketState > tcb) |
Set configuration required by congestion control algorithm. | |
virtual void | PktsAcked (Ptr< TcpSocketState > tcb, uint32_t segmentsAcked, const Time &rtt) |
Timing information on received ACK. | |
Public Member Functions inherited from ns3::Object | |
Object () | |
Constructor. | |
~Object () override | |
Destructor. | |
void | AggregateObject (Ptr< Object > other) |
Aggregate two Objects together. | |
void | Dispose () |
Dispose of this Object. | |
AggregateIterator | GetAggregateIterator () const |
Get an iterator to the Objects aggregated to this one. | |
TypeId | GetInstanceTypeId () const override |
Get the most derived TypeId for this Object. | |
template<typename T > | |
Ptr< T > | GetObject () const |
Get a pointer to the requested aggregated Object. | |
template<> | |
Ptr< Object > | GetObject () const |
Specialization of () for objects of type ns3::Object. | |
template<typename T > | |
Ptr< T > | GetObject (TypeId tid) const |
Get a pointer to the requested aggregated Object by TypeId. | |
template<> | |
Ptr< Object > | GetObject (TypeId tid) const |
Specialization of (TypeId tid) for objects of type ns3::Object. | |
void | Initialize () |
Invoke DoInitialize on all Objects aggregated to this one. | |
bool | IsInitialized () const |
Check if the object has been initialized. | |
void | UnidirectionalAggregateObject (Ptr< Object > other) |
Aggregate an Object to another Object. | |
Public Member Functions inherited from ns3::SimpleRefCount< Object, ObjectBase, ObjectDeleter > | |
SimpleRefCount () | |
Default constructor. | |
SimpleRefCount (const SimpleRefCount &o) | |
Copy constructor. | |
uint32_t | GetReferenceCount () const |
Get the reference count of the object. | |
SimpleRefCount & | operator= (const SimpleRefCount &o) |
Assignment operator. | |
void | Ref () const |
Increment the reference count. | |
void | Unref () const |
Decrement the reference count. | |
Public Member Functions inherited from ns3::ObjectBase | |
virtual | ~ObjectBase () |
Virtual destructor. | |
void | GetAttribute (std::string name, AttributeValue &value, bool permissive=false) const |
Get the value of an attribute, raising fatal errors if unsuccessful. | |
bool | GetAttributeFailSafe (std::string name, AttributeValue &value) const |
Get the value of an attribute without raising errors. | |
void | SetAttribute (std::string name, const AttributeValue &value) |
Set a single attribute, raising fatal errors if unsuccessful. | |
bool | SetAttributeFailSafe (std::string name, const AttributeValue &value) |
Set a single attribute without raising errors. | |
bool | TraceConnect (std::string name, std::string context, const CallbackBase &cb) |
Connect a TraceSource to a Callback with a context. | |
bool | TraceConnectWithoutContext (std::string name, const CallbackBase &cb) |
Connect a TraceSource to a Callback without a context. | |
bool | TraceDisconnect (std::string name, std::string context, const CallbackBase &cb) |
Disconnect from a TraceSource a Callback previously connected with a context. | |
bool | TraceDisconnectWithoutContext (std::string name, const CallbackBase &cb) |
Disconnect from a TraceSource a Callback previously connected without a context. | |
Static Public Member Functions | |
static TypeId | GetTypeId () |
Get the type ID. | |
Static Public Member Functions inherited from ns3::TcpCongestionOps | |
static TypeId | GetTypeId () |
Get the type ID. | |
Static Public Member Functions inherited from ns3::Object | |
static TypeId | GetTypeId () |
Register this type. | |
Static Public Member Functions inherited from ns3::ObjectBase | |
static TypeId | GetTypeId () |
Get the type ID. | |
Protected Member Functions | |
virtual uint32_t | Update (Ptr< TcpSocketState > tcb) |
Bic window update after a new ack received. | |
Protected Member Functions inherited from ns3::Object | |
Object (const Object &o) | |
Copy an Object. | |
virtual void | DoDispose () |
Destructor implementation. | |
virtual void | DoInitialize () |
Initialize() implementation. | |
virtual void | NotifyNewAggregate () |
Notify all Objects aggregated to this one of a new Object being aggregated. | |
Protected Member Functions inherited from ns3::ObjectBase | |
void | ConstructSelf (const AttributeConstructionList &attributes) |
Complete construction of ObjectBase; invoked by derived classes. | |
virtual void | NotifyConstructionCompleted () |
Notifier called once the ObjectBase is fully constructed. | |
Private Attributes | |
uint8_t | m_b |
Binary search coefficient. | |
double | m_beta |
Beta for cubic multiplicative increase. | |
uint32_t | m_cWndCnt |
cWnd integer-to-float counter | |
Time | m_epochStart |
Beginning of an epoch. | |
bool | m_fastConvergence |
Enable or disable fast convergence algorithm. | |
uint32_t | m_lastCwnd |
Last cWnd. | |
uint32_t | m_lastMaxCwnd |
Last maximum cWnd. | |
uint32_t | m_lowWnd |
Lower bound on congestion window. | |
uint32_t | m_maxIncr |
Maximum window increment. | |
uint32_t | m_smoothPart |
Number of RTT needed to reach Wmax from Wmax-B. | |
Friends | |
class | ::TcpBicDecrementTest |
TcpBicDecrementTest friend class (for tests). | |
class | ::TcpBicIncrementTest |
TcpBicIncrementTest friend class (for tests). | |
Additional Inherited Members | |
Related Symbols inherited from ns3::ObjectBase | |
static TypeId | GetObjectIid () |
Ensure the TypeId for ObjectBase gets fully configured to anchor the inheritance tree properly. | |
BIC congestion control algorithm.
In TCP Bic the congestion control problem is viewed as a search problem. Taking as a starting point the current window value and as a target point the last maximum window value (i.e. the cWnd value just before the loss event) a binary search technique can be used to update the cWnd value at the midpoint between the two, directly or using an additive increase strategy if the distance from the current window is too large.
This way, assuming a no-loss period, the congestion window logarithmically approaches the maximum value of cWnd until the difference between it and cWnd falls below a preset threshold. After reaching such a value (or the maximum window is unknown, i.e. the binary search does not start at all) the algorithm switches to probing the new maximum window with a 'slow start' strategy.
If a loss occur in either these phases, the current window (before the loss) can be treated as the new maximum, and the reduced (with a multiplicative decrease factor Beta) window size can be used as the new minimum.
To maintain the performance of TCP Bic as close as possible with the Linux implementation, and at the same time maintain the friendliness with other TCP flavors, the cWnd is increased only after a certain number of ACKs are received, following RFC 6356. After the slow start phase, and after each new ACK, a value is calculated by the method Update. This number (m_cnt in the code) represents the ACK packets that should be received before increasing the cWnd by one segment. After a trivial check on the arrived ACKs (represented by m_cWndCnt in the code), the cWnd can be increased and m_cWndCnt can be set to zero, or otherwise m_cWndCnt can be increased by one and the cWnd can be left untouched.
The binary search on the cWnd size space is done by varying the returned cnt, depending on the internal state of the class (e.g. the last maximum and the current cWnd size).
The reference paper for BIC can be found in: https://web.archive.org/web/20220930220436/https://an.kaist.ac.kr/courses/2006/cs540/reading/bic-tcp.pdf
This model has a number of configurable parameters that are exposed as attributes of the TcpBic TypeId. This model also exports trace sources, for tracking the congestion window, slow start threshold, and the internal state of the protocol.
More information on this implementation: http://dl.acm.org/citation.cfm?id=2756518
ns3::TcpBic::TcpBic | ( | ) |
ns3::TcpBic::TcpBic | ( | const TcpBic & | sock | ) |
Copy constructor.
sock | The socket to copy from. |
Definition at line 73 of file tcp-bic.cc.
References NS_LOG_FUNCTION.
|
overridevirtual |
Copy the congestion control algorithm across sockets.
Implements ns3::TcpCongestionOps.
Definition at line 269 of file tcp-bic.cc.
References ns3::Object::CopyObject.
|
overridevirtual |
Get the name of the congestion control algorithm.
Implements ns3::TcpCongestionOps.
Definition at line 226 of file tcp-bic.cc.
|
overridevirtual |
Get the slow start threshold after a loss event.
Is guaranteed that the congestion control state (TcpAckState_t
) is changed BEFORE the invocation of this method. The implementer should return the slow start threshold (and not change it directly) because, in the future, the TCP implementation may require to instantly recover from a loss event (e.g. when there is a network with an high reordering factor).
tcb | internal congestion state |
bytesInFlight | total bytes in flight |
Implements ns3::TcpCongestionOps.
Definition at line 232 of file tcp-bic.cc.
References m_beta, m_epochStart, m_fastConvergence, m_lastMaxCwnd, m_lowWnd, ns3::Time::Min(), NS_LOG_FUNCTION, and NS_LOG_INFO.
|
static |
Get the type ID.
Definition at line 19 of file tcp-bic.cc.
References m_b, m_beta, m_fastConvergence, m_lowWnd, m_maxIncr, m_smoothPart, ns3::MakeBooleanAccessor(), ns3::MakeBooleanChecker(), ns3::MakeDoubleAccessor(), ns3::MakeDoubleChecker(), ns3::MakeUintegerAccessor(), ns3::MakeUintegerChecker(), and ns3::TypeId::SetParent().
|
overridevirtual |
Congestion avoidance algorithm implementation.
Mimic the function cong_avoid in Linux. New segments have been ACKed, and the congestion control duty is to update the window.
The function is allowed to change directly cWnd and/or ssThresh.
tcb | internal congestion state |
segmentsAcked | count of segments acked |
Reimplemented from ns3::TcpCongestionOps.
Definition at line 90 of file tcp-bic.cc.
References m_cWndCnt, NS_LOG_FUNCTION, NS_LOG_INFO, and Update().
|
protectedvirtual |
Bic window update after a new ack received.
tcb | the socket state. |
Definition at line 129 of file tcp-bic.cc.
References m_b, m_epochStart, m_lastCwnd, m_lastMaxCwnd, m_lowWnd, m_maxIncr, m_smoothPart, ns3::Time::Min(), ns3::Simulator::Now(), NS_LOG_FUNCTION, and NS_LOG_INFO.
Referenced by IncreaseWindow().
|
friend |
TcpBicDecrementTest friend class (for tests).
|
friend |
TcpBicIncrementTest friend class (for tests).
|
private |
Binary search coefficient.
Definition at line 128 of file tcp-bic.h.
Referenced by GetTypeId(), and Update().
|
private |
Beta for cubic multiplicative increase.
Definition at line 118 of file tcp-bic.h.
Referenced by GetSsThresh(), and GetTypeId().
|
private |
cWnd integer-to-float counter
Definition at line 124 of file tcp-bic.h.
Referenced by IncreaseWindow().
|
private |
Beginning of an epoch.
Definition at line 127 of file tcp-bic.h.
Referenced by GetSsThresh(), and Update().
|
private |
Enable or disable fast convergence algorithm.
Definition at line 117 of file tcp-bic.h.
Referenced by GetSsThresh(), and GetTypeId().
|
private |
|
private |
Last maximum cWnd.
Definition at line 125 of file tcp-bic.h.
Referenced by GetSsThresh(), and Update().
|
private |
Lower bound on congestion window.
Definition at line 120 of file tcp-bic.h.
Referenced by GetSsThresh(), GetTypeId(), and Update().
|
private |
Maximum window increment.
Definition at line 119 of file tcp-bic.h.
Referenced by GetTypeId(), and Update().
|
private |
Number of RTT needed to reach Wmax from Wmax-B.
Definition at line 121 of file tcp-bic.h.
Referenced by GetTypeId(), and Update().