A Discrete-Event Network Simulator
API
ns3::TcpBic Class Reference

BIC congestion control algorithm. More...

#include "tcp-bic.h"

+ Inheritance diagram for ns3::TcpBic:
+ Collaboration diagram for ns3::TcpBic:

Public Member Functions

 TcpBic ()
 Constructor. More...
 
 TcpBic (const TcpBic &sock)
 Copy constructor. More...
 
virtual Ptr< TcpCongestionOpsFork ()
 Copy the congestion control algorithm across sockets. More...
 
virtual std::string GetName () const
 Get the name of the congestion control algorithm. More...
 
virtual uint32_t GetSsThresh (Ptr< const TcpSocketState > tcb, uint32_t bytesInFlight)
 Get the slow start threshold after a loss event. More...
 
virtual void IncreaseWindow (Ptr< TcpSocketState > tcb, uint32_t segmentsAcked)
 Congestion avoidance algorithm implementation. More...
 
- Public Member Functions inherited from ns3::TcpCongestionOps
 TcpCongestionOps ()
 
 TcpCongestionOps (const TcpCongestionOps &other)
 Copy constructor. More...
 
virtual ~TcpCongestionOps ()
 
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. More...
 
virtual void CongestionStateSet (Ptr< TcpSocketState > tcb, const TcpSocketState::TcpCongState_t newState)
 Trigger events/calculations specific to a congestion state. More...
 
virtual void CwndEvent (Ptr< TcpSocketState > tcb, const TcpSocketState::TcpCAEvent_t event)
 Trigger events/calculations on occurrence of congestion window event. More...
 
virtual Ptr< TcpCongestionOpsFork ()=0
 Copy the congestion control algorithm across sockets. More...
 
virtual std::string GetName () const =0
 Get the name of the congestion control algorithm. More...
 
virtual uint32_t GetSsThresh (Ptr< const TcpSocketState > tcb, uint32_t bytesInFlight)=0
 Get the slow start threshold after a loss event. More...
 
virtual bool HasCongControl () const
 Returns true when Congestion Control Algorithm implements CongControl. More...
 
virtual void IncreaseWindow (Ptr< TcpSocketState > tcb, uint32_t segmentsAcked)
 Congestion avoidance algorithm implementation. More...
 
virtual void Init (Ptr< TcpSocketState > tcb)
 Set configuration required by congestion control algorithm. More...
 
virtual void PktsAcked (Ptr< TcpSocketState > tcb, uint32_t segmentsAcked, const Time &rtt)
 Timing information on received ACK. More...
 
- Public Member Functions inherited from ns3::Object
 Object ()
 Constructor. More...
 
virtual ~Object ()
 Destructor. More...
 
void AggregateObject (Ptr< Object > other)
 Aggregate two Objects together. More...
 
void Dispose (void)
 Dispose of this Object. More...
 
AggregateIterator GetAggregateIterator (void) const
 Get an iterator to the Objects aggregated to this one. More...
 
virtual TypeId GetInstanceTypeId (void) const
 Get the most derived TypeId for this Object. More...
 
template<>
Ptr< ObjectGetObject () const
 Specialization of () for objects of type ns3::Object. More...
 
template<typename T >
Ptr< T > GetObject (TypeId tid) const
 Get a pointer to the requested aggregated Object by TypeId. More...
 
template<>
Ptr< ObjectGetObject (TypeId tid) const
 Specialization of (TypeId tid) for objects of type ns3::Object. More...
 
template<typename T >
Ptr< T > GetObject (void) const
 Get a pointer to the requested aggregated Object. More...
 
void Initialize (void)
 Invoke DoInitialize on all Objects aggregated to this one. More...
 
bool IsInitialized (void) const
 Check if the object has been initialized. More...
 
- Public Member Functions inherited from ns3::SimpleRefCount< Object, ObjectBase, ObjectDeleter >
 SimpleRefCount ()
 Default constructor. More...
 
 SimpleRefCount (const SimpleRefCount &o)
 Copy constructor. More...
 
uint32_t GetReferenceCount (void) const
 Get the reference count of the object. More...
 
SimpleRefCountoperator= (const SimpleRefCount &o)
 Assignment operator. More...
 
void Ref (void) const
 Increment the reference count. More...
 
void Unref (void) const
 Decrement the reference count. More...
 
- Public Member Functions inherited from ns3::ObjectBase
virtual ~ObjectBase ()
 Virtual destructor. More...
 
void GetAttribute (std::string name, AttributeValue &value) const
 Get the value of an attribute, raising fatal errors if unsuccessful. More...
 
bool GetAttributeFailSafe (std::string name, AttributeValue &value) const
 Get the value of an attribute without raising erros. More...
 
virtual TypeId GetInstanceTypeId (void) const =0
 Get the most derived TypeId for this Object. More...
 
void SetAttribute (std::string name, const AttributeValue &value)
 Set a single attribute, raising fatal errors if unsuccessful. More...
 
bool SetAttributeFailSafe (std::string name, const AttributeValue &value)
 Set a single attribute without raising errors. More...
 
bool TraceConnect (std::string name, std::string context, const CallbackBase &cb)
 Connect a TraceSource to a Callback with a context. More...
 
bool TraceConnectWithoutContext (std::string name, const CallbackBase &cb)
 Connect a TraceSource to a Callback without a context. More...
 
bool TraceDisconnect (std::string name, std::string context, const CallbackBase &cb)
 Disconnect from a TraceSource a Callback previously connected with a context. More...
 
bool TraceDisconnectWithoutContext (std::string name, const CallbackBase &cb)
 Disconnect from a TraceSource a Callback previously connected without a context. More...
 

Static Public Member Functions

static TypeId GetTypeId (void)
 Get the type ID. More...
 
- Static Public Member Functions inherited from ns3::TcpCongestionOps
static TypeId GetTypeId (void)
 Get the type ID. More...
 
- Static Public Member Functions inherited from ns3::Object
static TypeId GetTypeId (void)
 Register this type. More...
 
- Static Public Member Functions inherited from ns3::ObjectBase
static TypeId GetTypeId (void)
 Get the type ID. More...
 

Protected Member Functions

virtual uint32_t Update (Ptr< TcpSocketState > tcb)
 Bic window update after a new ack received. More...
 
- Protected Member Functions inherited from ns3::Object
 Object (const Object &o)
 Copy an Object. More...
 
virtual void DoDispose (void)
 Destructor implementation. More...
 
virtual void DoInitialize (void)
 Initialize() implementation. More...
 
virtual void NotifyNewAggregate (void)
 Notify all Objects aggregated to this one of a new Object being aggregated. More...
 
- Protected Member Functions inherited from ns3::ObjectBase
void ConstructSelf (const AttributeConstructionList &attributes)
 Complete construction of ObjectBase; invoked by derived classes. More...
 
virtual void NotifyConstructionCompleted (void)
 Notifier called once the ObjectBase is fully constructed. More...
 

Private Attributes

uint8_t m_b
 Binary search coefficient. More...
 
double m_beta
 Beta for cubic multiplicative increase. More...
 
uint32_t m_cWndCnt
 cWnd integer-to-float counter More...
 
Time m_epochStart
 Beginning of an epoch. More...
 
bool m_fastConvergence
 Enable or disable fast convergence algorithm. More...
 
uint32_t m_lastCwnd
 Last cWnd. More...
 
uint32_t m_lastMaxCwnd
 Last maximum cWnd. More...
 
uint32_t m_lowWnd
 Lower bound on congestion window. More...
 
uint32_t m_maxIncr
 Maximum window increment. More...
 
uint32_t m_smoothPart
 Number of RTT needed to reach Wmax from Wmax-B. More...
 

Friends

class ::TcpBicDecrementTest
 TcpBicDecrementTest friend class (for tests). More...
 
class ::TcpBicIncrementTest
 TcpBicIncrementTest friend class (for tests). More...
 

Additional Inherited Members

Detailed Description

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: http://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

Config Paths

ns3::TcpBic is accessible through the following paths with Config::Set and Config::Connect:

  • "/NodeList/[i]/$ns3::TcpL4Protocol/SocketList/[i]/CongestionOps/$ns3::TcpBic"

Attributes

  • FastConvergence: Turn on/off fast convergence.
    • Set with class: BooleanValue
    • Underlying type: bool
    • Initial value: true
    • Flags: constructwriteread
  • Beta: Beta for multiplicative decrease
    • Set with class: ns3::DoubleValue
    • Underlying type: double 0:1.79769e+308
    • Initial value: 0.8
    • Flags: constructwriteread
  • MaxIncr: Limit on increment allowed during binary search
    • Set with class: ns3::UintegerValue
    • Underlying type: uint32_t 1:4294967295
    • Initial value: 16
    • Flags: constructwriteread
  • LowWnd: Threshold window size (in segments) for engaging BIC response
    • Set with class: ns3::UintegerValue
    • Underlying type: uint32_t 0:4294967295
    • Initial value: 14
    • Flags: constructwriteread
  • SmoothPart: Number of RTT needed to approach cWnd_max from cWnd_max-BinarySearchCoefficient. It can be viewed as the gradient of the slow start AIM phase: less this value is, more steep the increment will be.
    • Set with class: ns3::UintegerValue
    • Underlying type: uint32_t 1:4294967295
    • Initial value: 5
    • Flags: constructwriteread
  • BinarySearchCoefficient: Inverse of the coefficient for the binary search. Default 4, as in Linux
    • Set with class: ns3::UintegerValue
    • Underlying type: uint8_t 2:255
    • Initial value: 4
    • Flags: constructwriteread

No TraceSources are defined for this type.
Size of this type is 80 bytes (on a 64-bit architecture).

Definition at line 81 of file tcp-bic.h.

Constructor & Destructor Documentation

◆ TcpBic() [1/2]

ns3::TcpBic::TcpBic ( )

Constructor.

Definition at line 68 of file tcp-bic.cc.

References NS_LOG_FUNCTION.

◆ TcpBic() [2/2]

ns3::TcpBic::TcpBic ( const TcpBic sock)

Copy constructor.

Parameters
sockThe socket to copy from.

Definition at line 78 of file tcp-bic.cc.

References NS_LOG_FUNCTION.

Member Function Documentation

◆ Fork()

Ptr< TcpCongestionOps > ns3::TcpBic::Fork ( )
virtual

Copy the congestion control algorithm across sockets.

Returns
a pointer of the copied object

Implements ns3::TcpCongestionOps.

Definition at line 277 of file tcp-bic.cc.

◆ GetName()

std::string ns3::TcpBic::GetName ( ) const
virtual

Get the name of the congestion control algorithm.

Returns
A string identifying the name

Implements ns3::TcpCongestionOps.

Definition at line 233 of file tcp-bic.cc.

◆ GetSsThresh()

uint32_t ns3::TcpBic::GetSsThresh ( Ptr< const TcpSocketState tcb,
uint32_t  bytesInFlight 
)
virtual

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 implementator 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).

Parameters
tcbinternal congestion state
bytesInFlighttotal bytes in flight
Returns
Slow start threshold

Implements ns3::TcpCongestionOps.

Definition at line 239 of file tcp-bic.cc.

References m_beta, m_epochStart, m_fastConvergence, m_lastMaxCwnd, m_lowWnd, max, ns3::Time::Min(), NS_LOG_FUNCTION, and NS_LOG_INFO.

+ Here is the call graph for this function:

◆ GetTypeId()

TypeId ns3::TcpBic::GetTypeId ( void  )
static

Get the type ID.

Returns
the object TypeId

Definition at line 29 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::MakeUintegerAccessor(), and ns3::TypeId::SetParent().

+ Here is the call graph for this function:

◆ IncreaseWindow()

void ns3::TcpBic::IncreaseWindow ( Ptr< TcpSocketState tcb,
uint32_t  segmentsAcked 
)
virtual

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.

Parameters
tcbinternal congestion state
segmentsAckedcount of segments acked

Reimplemented from ns3::TcpCongestionOps.

Definition at line 96 of file tcp-bic.cc.

References ns3::TcpSocketState::m_cWnd, m_cWndCnt, ns3::TcpSocketState::m_segmentSize, ns3::TcpSocketState::m_ssThresh, NS_LOG_FUNCTION, NS_LOG_INFO, and Update().

+ Here is the call graph for this function:

◆ Update()

uint32_t ns3::TcpBic::Update ( Ptr< TcpSocketState tcb)
protectedvirtual

Bic window update after a new ack received.

Parameters
tcbthe socket state.
Returns
The number of segments acked since the last cwnd increment.

Definition at line 134 of file tcp-bic.cc.

References ns3::TcpSocketState::GetCwndInSegments(), 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().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Friends And Related Function Documentation

◆ ::TcpBicDecrementTest

friend class ::TcpBicDecrementTest
friend

TcpBicDecrementTest friend class (for tests).

Definition at line 127 of file tcp-bic.h.

◆ ::TcpBicIncrementTest

friend class ::TcpBicIncrementTest
friend

TcpBicIncrementTest friend class (for tests).

Definition at line 122 of file tcp-bic.h.

Member Data Documentation

◆ m_b

uint8_t ns3::TcpBic::m_b
private

Binary search coefficient.

Definition at line 141 of file tcp-bic.h.

Referenced by GetTypeId(), and Update().

◆ m_beta

double ns3::TcpBic::m_beta
private

Beta for cubic multiplicative increase.

Definition at line 131 of file tcp-bic.h.

Referenced by GetSsThresh(), and GetTypeId().

◆ m_cWndCnt

uint32_t ns3::TcpBic::m_cWndCnt
private

cWnd integer-to-float counter

Definition at line 137 of file tcp-bic.h.

Referenced by IncreaseWindow().

◆ m_epochStart

Time ns3::TcpBic::m_epochStart
private

Beginning of an epoch.

Definition at line 140 of file tcp-bic.h.

Referenced by GetSsThresh(), and Update().

◆ m_fastConvergence

bool ns3::TcpBic::m_fastConvergence
private

Enable or disable fast convergence algorithm.

Definition at line 130 of file tcp-bic.h.

Referenced by GetSsThresh(), and GetTypeId().

◆ m_lastCwnd

uint32_t ns3::TcpBic::m_lastCwnd
private

Last cWnd.

Definition at line 139 of file tcp-bic.h.

Referenced by Update().

◆ m_lastMaxCwnd

uint32_t ns3::TcpBic::m_lastMaxCwnd
private

Last maximum cWnd.

Definition at line 138 of file tcp-bic.h.

Referenced by GetSsThresh(), and Update().

◆ m_lowWnd

uint32_t ns3::TcpBic::m_lowWnd
private

Lower bound on congestion window.

Definition at line 133 of file tcp-bic.h.

Referenced by GetSsThresh(), GetTypeId(), and Update().

◆ m_maxIncr

uint32_t ns3::TcpBic::m_maxIncr
private

Maximum window increment.

Definition at line 132 of file tcp-bic.h.

Referenced by GetTypeId(), and Update().

◆ m_smoothPart

uint32_t ns3::TcpBic::m_smoothPart
private

Number of RTT needed to reach Wmax from Wmax-B.

Definition at line 134 of file tcp-bic.h.

Referenced by GetTypeId(), and Update().


The documentation for this class was generated from the following files: