An implementation of a stream socket using TCP. More...
#include <tcp-westwood.h>
Public Types | |
enum | FilterType { NONE, TUSTIN } |
enum | ProtocolType { WESTWOOD, WESTWOODPLUS } |
Public Types inherited from ns3::Socket | |
enum | SocketErrno { ERROR_NOTERROR, ERROR_ISCONN, ERROR_NOTCONN, ERROR_MSGSIZE, ERROR_AGAIN, ERROR_SHUTDOWN, ERROR_OPNOTSUPP, ERROR_AFNOSUPPORT, ERROR_INVAL, ERROR_BADF, ERROR_NOROUTETOHOST, ERROR_NODEV, ERROR_ADDRNOTAVAIL, ERROR_ADDRINUSE, SOCKET_ERRNO_LAST } |
enum | SocketType { NS3_SOCK_STREAM, NS3_SOCK_SEQPACKET, NS3_SOCK_DGRAM, NS3_SOCK_RAW } |
Public Member Functions | |
TcpWestwood (const TcpWestwood &sock) | |
virtual int | Connect (const Address &address) |
virtual int | Listen (void) |
Public Member Functions inherited from ns3::TcpSocketBase | |
TcpSocketBase (void) | |
TcpSocketBase (const TcpSocketBase &sock) | |
virtual int | Bind (void) |
virtual int | Bind (const Address &address) |
virtual int | Bind6 (void) |
Allocate a local IPv6 endpoint for this socket. More... | |
virtual void | BindToNetDevice (Ptr< NetDevice > netdevice) |
virtual int | Close (void) |
virtual enum SocketErrno | GetErrno (void) const |
virtual Ptr< Node > | GetNode (void) const |
virtual uint32_t | GetRxAvailable (void) const |
virtual enum SocketType | GetSocketType (void) const |
virtual int | GetSockName (Address &address) const |
virtual uint32_t | GetTxAvailable (void) const |
virtual Ptr< Packet > | Recv (uint32_t maxSize, uint32_t flags) |
virtual Ptr< Packet > | RecvFrom (uint32_t maxSize, uint32_t flags, Address &fromAddress) |
virtual int | Send (Ptr< Packet > p, uint32_t flags) |
virtual int | SendTo (Ptr< Packet > p, uint32_t flags, const Address &toAddress) |
virtual void | SetNode (Ptr< Node > node) |
virtual void | SetRtt (Ptr< RttEstimator > rtt) |
virtual void | SetTcp (Ptr< TcpL4Protocol > tcp) |
virtual int | ShutdownRecv (void) |
virtual int | ShutdownSend (void) |
Public Member Functions inherited from ns3::Socket | |
Ptr< NetDevice > | GetBoundNetDevice () |
Returns socket's bound netdevice, if any. More... | |
uint8_t | GetIpTos (void) const |
virtual uint8_t | GetIpTtl (void) const |
virtual uint8_t | GetIpv6HopLimit (void) const |
uint8_t | GetIpv6Tclass (void) const |
bool | IsIpRecvTos (void) const |
Ask if the socket is currently passing information about IP Type of Service up the stack. More... | |
bool | IsIpRecvTtl (void) const |
Ask if the socket is currently passing information about IP_TTL up the stack. More... | |
bool | IsIpv6RecvHopLimit (void) const |
Ask if the socket is currently passing information about IPv6 Hop Limit up the stack. More... | |
bool | IsIpv6RecvTclass (void) const |
Ask if the socket is currently passing information about IPv6 Traffic Class up the stack. More... | |
bool | IsRecvPktInfo () const |
Get status indicating whether enable/disable packet information to socket. More... | |
Ptr< Packet > | Recv (void) |
Read a single packet from the socket. More... | |
int | Recv (uint8_t *buf, uint32_t size, uint32_t flags) |
Recv data (or dummy data) from the remote host. More... | |
Ptr< Packet > | RecvFrom (Address &fromAddress) |
Read a single packet from the socket and retrieve the sender address. More... | |
int | RecvFrom (uint8_t *buf, uint32_t size, uint32_t flags, Address &fromAddress) |
Read a single packet from the socket and retrieve the sender address. More... | |
int | Send (Ptr< Packet > p) |
Send data (or dummy data) to the remote host. More... | |
int | Send (const uint8_t *buf, uint32_t size, uint32_t flags) |
Send data (or dummy data) to the remote host. More... | |
int | SendTo (const uint8_t *buf, uint32_t size, uint32_t flags, const Address &address) |
Send data to a specified peer. More... | |
void | SetAcceptCallback (Callback< bool, Ptr< Socket >, const Address & > connectionRequest, Callback< void, Ptr< Socket >, const Address & > newConnectionCreated) |
Accept connection requests from remote hosts. More... | |
void | SetCloseCallbacks (Callback< void, Ptr< Socket > > normalClose, Callback< void, Ptr< Socket > > errorClose) |
Detect socket recv() events such as graceful shutdown or error. More... | |
void | SetConnectCallback (Callback< void, Ptr< Socket > > connectionSucceeded, Callback< void, Ptr< Socket > > connectionFailed) |
Specify callbacks to allow the caller to determine if the connection succeeds of fails. More... | |
void | SetDataSentCallback (Callback< void, Ptr< Socket >, uint32_t > dataSent) |
Notify application when a packet has been sent from transport protocol (non-standard socket call) More... | |
void | SetIpRecvTos (bool ipv4RecvTos) |
Tells a socket to pass information about IP Type of Service up the stack. More... | |
void | SetIpRecvTtl (bool ipv4RecvTtl) |
Tells a socket to pass information about IP_TTL up the stack. More... | |
void | SetIpTos (uint8_t ipTos) |
virtual void | SetIpTtl (uint8_t ipTtl) |
virtual void | SetIpv6HopLimit (uint8_t ipHopLimit) |
void | SetIpv6RecvHopLimit (bool ipv6RecvHopLimit) |
Tells a socket to pass information about IPv6 Hop Limit up the stack. More... | |
void | SetIpv6RecvTclass (bool ipv6RecvTclass) |
Tells a socket to pass information about IPv6 Traffic Class up the stack. More... | |
void | SetIpv6Tclass (int ipTclass) |
void | SetRecvCallback (Callback< void, Ptr< Socket > >) |
Notify application when new data is available to be read. More... | |
void | SetRecvPktInfo (bool flag) |
Enable/Disable receive packet information to socket. More... | |
void | SetSendCallback (Callback< void, Ptr< Socket >, uint32_t > sendCb) |
Notify application when space in transmit buffer is added. More... | |
Public Member Functions inherited from ns3::Object | |
void | AggregateObject (Ptr< Object > other) |
void | Dispose (void) |
AggregateIterator | GetAggregateIterator (void) const |
virtual TypeId | GetInstanceTypeId (void) const |
template<typename T > | |
Ptr< T > | GetObject (void) const |
template<typename T > | |
Ptr< T > | GetObject (TypeId tid) const |
void | Initialize (void) |
Public Member Functions inherited from ns3::SimpleRefCount< Object, ObjectBase, ObjectDeleter > | |
SimpleRefCount (const SimpleRefCount &o) | |
uint32_t | GetReferenceCount (void) const |
SimpleRefCount & | operator= (const SimpleRefCount &o) |
void | Ref (void) const |
void | Unref (void) const |
Public Member Functions inherited from ns3::ObjectBase | |
void | GetAttribute (std::string name, AttributeValue &value) const |
bool | GetAttributeFailSafe (std::string name, AttributeValue &attribute) const |
void | SetAttribute (std::string name, const AttributeValue &value) |
bool | SetAttributeFailSafe (std::string name, const AttributeValue &value) |
bool | TraceConnect (std::string name, std::string context, const CallbackBase &cb) |
bool | TraceConnectWithoutContext (std::string name, const CallbackBase &cb) |
bool | TraceDisconnect (std::string name, std::string context, const CallbackBase &cb) |
bool | TraceDisconnectWithoutContext (std::string name, const CallbackBase &cb) |
Static Public Member Functions | |
static TypeId | GetTypeId (void) |
Static Public Member Functions inherited from ns3::TcpSocketBase | |
static TypeId | GetTypeId (void) |
Static Public Member Functions inherited from ns3::TcpSocket | |
static TypeId | GetTypeId (void) |
Static Public Member Functions inherited from ns3::Socket | |
static Ptr< Socket > | CreateSocket (Ptr< Node > node, TypeId tid) |
static TypeId | GetTypeId (void) |
Static Public Member Functions inherited from ns3::Object | |
static TypeId | GetTypeId (void) |
Static Public Member Functions inherited from ns3::SimpleRefCount< Object, ObjectBase, ObjectDeleter > | |
static void | Cleanup (void) |
Static Public Member Functions inherited from ns3::ObjectBase | |
static TypeId | GetTypeId (void) |
Protected Member Functions | |
virtual void | DupAck (const TcpHeader &header, uint32_t count) |
virtual void | EstimateRtt (const TcpHeader &header) |
virtual Ptr< TcpSocketBase > | Fork (void) |
virtual uint32_t | GetInitialCwnd (void) const |
virtual uint32_t | GetSSThresh (void) const |
virtual void | NewAck (SequenceNumber32 const &seq) |
virtual void | ReceivedAck (Ptr< Packet > packet, const TcpHeader &tcpHeader) |
virtual void | Retransmit (void) |
virtual void | SetInitialCwnd (uint32_t cwnd) |
virtual void | SetSegSize (uint32_t size) |
virtual void | SetSSThresh (uint32_t threshold) |
virtual uint32_t | Window (void) |
Protected Member Functions inherited from ns3::TcpSocketBase | |
virtual void | AddOptions (TcpHeader &) |
virtual uint16_t | AdvertisedWindowSize (void) |
virtual uint32_t | AvailableWindow (void) |
virtual uint32_t | BytesInFlight (void) |
void | CancelAllTimers (void) |
void | CloseAndNotify (void) |
void | CompleteFork (Ptr< Packet >, const TcpHeader &, const Address &fromAddress, const Address &toAdress) |
void | ConnectionSucceeded (void) |
void | DeallocateEndPoint (void) |
virtual void | DelAckTimeout (void) |
void | Destroy (void) |
void | Destroy6 (void) |
int | DoClose (void) |
int | DoConnect (void) |
virtual void | DoForwardUp (Ptr< Packet > packet, Ipv4Header header, uint16_t port, Ptr< Ipv4Interface > incomingInterface) |
virtual void | DoForwardUp (Ptr< Packet > packet, Ipv6Header header, uint16_t port) |
void | DoPeerClose (void) |
virtual void | DoRetransmit (void) |
void | ForwardIcmp (Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo) |
void | ForwardIcmp6 (Ipv6Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo) |
void | ForwardUp (Ptr< Packet > packet, Ipv4Header header, uint16_t port, Ptr< Ipv4Interface > incomingInterface) |
void | ForwardUp6 (Ptr< Packet > packet, Ipv6Header header, uint16_t port) |
virtual bool | GetAllowBroadcast (void) const |
Query whether broadcast datagram transmissions are allowed. More... | |
virtual uint32_t | GetConnCount (void) const |
virtual Time | GetConnTimeout (void) const |
virtual uint32_t | GetDelAckMaxCount (void) const |
virtual Time | GetDelAckTimeout (void) const |
virtual Time | GetPersistTimeout (void) const |
virtual uint32_t | GetRcvBufSize (void) const |
virtual uint32_t | GetSegSize (void) const |
virtual uint32_t | GetSndBufSize (void) const |
virtual bool | GetTcpNoDelay (void) const |
virtual void | LastAckTimeout (void) |
bool | OutOfRange (SequenceNumber32 head, SequenceNumber32 tail) const |
void | PeerClose (Ptr< Packet >, const TcpHeader &) |
virtual void | PersistTimeout (void) |
void | ProcessClosing (Ptr< Packet >, const TcpHeader &) |
void | ProcessEstablished (Ptr< Packet >, const TcpHeader &) |
void | ProcessLastAck (Ptr< Packet >, const TcpHeader &) |
void | ProcessListen (Ptr< Packet >, const TcpHeader &, const Address &, const Address &) |
void | ProcessSynRcvd (Ptr< Packet >, const TcpHeader &, const Address &, const Address &) |
void | ProcessSynSent (Ptr< Packet >, const TcpHeader &) |
void | ProcessWait (Ptr< Packet >, const TcpHeader &) |
virtual void | ReadOptions (const TcpHeader &) |
virtual void | ReceivedData (Ptr< Packet >, const TcpHeader &) |
virtual void | ReTxTimeout (void) |
uint32_t | SendDataPacket (SequenceNumber32 seq, uint32_t maxSize, bool withAck) |
void | SendEmptyPacket (uint8_t flags) |
bool | SendPendingData (bool withAck=false) |
void | SendRST (void) |
virtual bool | SetAllowBroadcast (bool allowBroadcast) |
Configure whether broadcast datagram transmissions are allowed. More... | |
virtual void | SetConnCount (uint32_t count) |
virtual void | SetConnTimeout (Time timeout) |
virtual void | SetDelAckMaxCount (uint32_t count) |
virtual void | SetDelAckTimeout (Time timeout) |
virtual void | SetPersistTimeout (Time timeout) |
virtual void | SetRcvBufSize (uint32_t size) |
virtual void | SetSndBufSize (uint32_t size) |
virtual void | SetTcpNoDelay (bool noDelay) |
int | SetupCallback (void) |
int | SetupEndpoint (void) |
int | SetupEndpoint6 (void) |
void | TimeWait (void) |
virtual uint32_t | UnAckDataCount (void) |
Protected Member Functions inherited from ns3::Socket | |
virtual void | DoDispose (void) |
bool | IsManualIpTos (void) const |
bool | IsManualIpTtl (void) const |
bool | IsManualIpv6HopLimit (void) const |
bool | IsManualIpv6Tclass (void) const |
void | NotifyConnectionFailed (void) |
bool | NotifyConnectionRequest (const Address &from) |
void | NotifyConnectionSucceeded (void) |
void | NotifyDataRecv (void) |
void | NotifyDataSent (uint32_t size) |
void | NotifyErrorClose (void) |
void | NotifyNewConnectionCreated (Ptr< Socket > socket, const Address &from) |
void | NotifyNormalClose (void) |
void | NotifySend (uint32_t spaceAvailable) |
Protected Member Functions inherited from ns3::Object | |
Object (const Object &o) | |
virtual void | DoInitialize (void) |
virtual void | NotifyNewAggregate (void) |
Protected Member Functions inherited from ns3::ObjectBase | |
void | ConstructSelf (const AttributeConstructionList &attributes) |
virtual void | NotifyConstructionCompleted (void) |
Protected Attributes | |
int | m_accountedFor |
int | m_ackedSegments |
EventId | m_bwEstimateEvent |
TracedValue< double > | m_currentBW |
TracedValue< uint32_t > | m_cWnd |
enum FilterType | m_fType |
bool | m_inFastRec |
uint32_t | m_initialCWnd |
bool | m_IsCount |
double | m_lastAck |
double | m_lastBW |
double | m_lastSampleBW |
Time | m_minRtt |
SequenceNumber32 | m_prevAckNo |
enum ProtocolType | m_pType |
uint32_t | m_ssThresh |
Protected Attributes inherited from ns3::TcpSocketBase | |
bool | m_closeNotified |
bool | m_closeOnEmpty |
uint32_t | m_cnCount |
uint32_t | m_cnRetries |
Time | m_cnTimeout |
bool | m_connected |
uint32_t | m_delAckCount |
EventId | m_delAckEvent |
uint32_t | m_delAckMaxCount |
Time | m_delAckTimeout |
uint32_t | m_dupAckCount |
Ipv4EndPoint * | m_endPoint |
Ipv6EndPoint * | m_endPoint6 |
enum SocketErrno | m_errno |
TracedValue< SequenceNumber32 > | m_highTxMark |
Callback< void, Ipv4Address, uint8_t, uint8_t, uint8_t, uint32_t > | m_icmpCallback |
Callback< void, Ipv6Address, uint8_t, uint8_t, uint8_t, uint32_t > | m_icmpCallback6 |
EventId | m_lastAckEvent |
TracedValue< Time > | m_lastRtt |
uint16_t | m_maxWinSize |
double | m_msl |
TracedValue< SequenceNumber32 > | m_nextTxSequence |
Ptr< Node > | m_node |
bool | m_noDelay |
EventId | m_persistEvent |
Time | m_persistTimeout |
EventId | m_retxEvent |
TracedValue< Time > | m_rto |
Ptr< RttEstimator > | m_rtt |
TracedValue< uint32_t > | m_rWnd |
TcpRxBuffer | m_rxBuffer |
uint32_t | m_segmentSize |
bool | m_shutdownRecv |
bool | m_shutdownSend |
TracedValue< TcpStates_t > | m_state |
Ptr< TcpL4Protocol > | m_tcp |
EventId | m_timewaitEvent |
TcpTxBuffer | m_txBuffer |
Protected Attributes inherited from ns3::Socket | |
Ptr< NetDevice > | m_boundnetdevice |
bool | m_recvPktInfo |
Private Member Functions | |
int | CountAck (const TcpHeader &tcpHeader) |
void | EstimateBW (int acked, const TcpHeader &tcpHeader, Time rtt) |
void | Filtering (void) |
void | InitializeCwnd (void) |
void | UpdateAckedSegments (int acked) |
Additional Inherited Members | |
Static Public Attributes inherited from ns3::TcpSocket | |
static const char *const | TcpStateName [LAST_STATE] = { "CLOSED", "LISTEN", "SYN_SENT", "SYN_RCVD", "ESTABLISHED", "CLOSE_WAIT", "LAST_ACK", "FIN_WAIT_1", "FIN_WAIT_2", "CLOSING", "TIME_WAIT" } |
An implementation of a stream socket using TCP.
This class contains the implementation of TCP Westwood and Westwood+.
Westwood and Westwood+ employ the AIAD (Additive Increase/Adaptive Decrease) congestion control paradigm. When a congestion episode happens, instead of halving the cwnd, these protocols try to estimate the network's bandwidth and use the estimated value to adjust the cwnd. While Westwood performs the bandwidth sampling every ACK reception, Westwood+ samples the bandwidth every RTT.
The two main methods in the implementation are the CountAck (const TCPHeader&) and the EstimateBW (int, const, Time). The CountAck method calculates the number of acknowledged segments on the receipt of an ACK. The EstimateBW estimates the bandwidth based on the value returned by CountAck and the sampling interval (last ACK inter-arrival time for Westwood and last RTT for Westwood+).
ns3::TcpWestwood is accessible through the following paths with Config::Set and Config::Connect:
Definition at line 62 of file tcp-westwood.h.
|
virtual |
Inherit from Socket class: Initiate connection to a remote address:port
Reimplemented from ns3::TcpSocketBase.
Definition at line 121 of file tcp-westwood.cc.
References ns3::TcpSocketBase::Connect(), InitializeCwnd(), and NS_LOG_FUNCTION.
|
private |
Calculate the number of acknowledged packets upon the receipt of an ACK packet
tcpHeader | the header of the received ACK packet |
Definition at line 228 of file tcp-westwood.cc.
References ns3::TcpHeader::GetAckNumber(), and NS_LOG_FUNCTION.
Referenced by ReceivedAck().
|
protectedvirtual |
Adjust the cwnd using the currently estimated bandwidth, retransmit the missing packet, and enter fast recovery if 3 DUPACKs are received
header | the TCP header of the ACK packet |
count | the number of DUPACKs |
Implements ns3::TcpSocketBase.
Definition at line 268 of file tcp-westwood.cc.
References ns3::Time::GetSeconds(), NS_LOG_FUNCTION, NS_LOG_INFO, and ns3::TcpSocketBase::SendPendingData().
Estimate the network's bandwidth
acked | the number of acknowledged packets returned by CountAck |
tcpHeader | the header of the packet |
rtt | the RTT estimation |
Definition at line 202 of file tcp-westwood.cc.
References Filtering(), ns3::Time::GetSeconds(), ns3::Simulator::Now(), and NS_LOG_FUNCTION.
Referenced by EstimateRtt(), and ReceivedAck().
|
protectedvirtual |
Estimate the RTT, record the minimum value, and run a clock on the RTT to trigger Westwood+ bandwidth sampling
Reimplemented from ns3::TcpSocketBase.
Definition at line 323 of file tcp-westwood.cc.
References ns3::EventId::Cancel(), EstimateBW(), ns3::TcpSocketBase::EstimateRtt(), NS_LOG_FUNCTION_NOARGS, and ns3::Simulator::Schedule().
|
private |
Tustin filter
Definition at line 357 of file tcp-westwood.cc.
References NS_LOG_FUNCTION.
Referenced by EstimateBW().
|
protectedvirtual |
Call CopyObject<TcpWestwood> to clone me
Implements ns3::TcpSocketBase.
Definition at line 136 of file tcp-westwood.cc.
References NS_LOG_FUNCTION.
|
protectedvirtual |
Implements ns3::TcpSocketBase.
Definition at line 404 of file tcp-westwood.cc.
References NS_LOG_FUNCTION.
|
protectedvirtual |
Implements ns3::TcpSocketBase.
Definition at line 390 of file tcp-westwood.cc.
References NS_LOG_FUNCTION.
|
private |
Initialize cwnd at the beginning of a connection
Definition at line 411 of file tcp-westwood.cc.
References NS_LOG_FUNCTION.
|
virtual |
Inherit from Socket class: Listen on the endpoint for an incoming connection
Reimplemented from ns3::TcpSocketBase.
Definition at line 113 of file tcp-westwood.cc.
References InitializeCwnd(), ns3::TcpSocketBase::Listen(), and NS_LOG_FUNCTION.
|
protectedvirtual |
Adjust the cwnd based on the current congestion control phase, and then call the TcpSocketBase::NewAck() to complete the processing
seq | the acknowledgment number |
Reimplemented from ns3::TcpSocketBase.
Definition at line 143 of file tcp-westwood.cc.
References NS_LOG_FUNCTION, NS_LOG_INFO, and NS_LOG_LOGIC.
|
protectedvirtual |
Process the newly received ACK
packet | the received ACK packet |
tcpHeader | the header attached to the ACK packet |
Reimplemented from ns3::TcpSocketBase.
Definition at line 177 of file tcp-westwood.cc.
References CountAck(), EstimateBW(), ns3::TcpHeader::GetAckNumber(), ns3::TcpHeader::GetFlags(), NS_LOG_FUNCTION, ns3::TcpSocketBase::ReceivedAck(), and UpdateAckedSegments().
|
protectedvirtual |
Upon an RTO event, adjust the cwnd using the currently estimated bandwidth, retransmit the missing packet, and exit fast recovery
Reimplemented from ns3::TcpSocketBase.
Definition at line 293 of file tcp-westwood.cc.
References ns3::Time::GetSeconds(), ns3::TcpTxBuffer::HeadSequence(), ns3::Simulator::Now(), NS_LOG_FUNCTION, NS_LOG_INFO, and NS_LOG_LOGIC.
|
protectedvirtual |
cwnd | the initial cwnd |
Implements ns3::TcpSocketBase.
Definition at line 397 of file tcp-westwood.cc.
References NS_ABORT_MSG_UNLESS.
|
protectedvirtual |
size | the segment size to be used in a connection |
Reimplemented from ns3::TcpSocketBase.
Definition at line 376 of file tcp-westwood.cc.
References NS_ABORT_MSG_UNLESS.
|
protectedvirtual |
the | slow-start threshold |
Implements ns3::TcpSocketBase.
Definition at line 383 of file tcp-westwood.cc.
References NS_LOG_FUNCTION.
|
private |
Update the total number of acknowledged packets during the current RTT
acked | the number of packets the currently received ACK acknowledges |
Definition at line 262 of file tcp-westwood.cc.
Referenced by ReceivedAck().
|
protectedvirtual |
Limit the size of outstanding data based on the cwnd and the receiver's advertised window
Reimplemented from ns3::TcpSocketBase.
Definition at line 129 of file tcp-westwood.cc.
References NS_LOG_FUNCTION.