TcpStateVariables

Namespace inet::tcp

TcpStateVariables

struct

Contains state variables ("TCB") for TCP.

TcpStateVariables is effectively a "struct" -- it only contains public data members. (Only declared as a class so that we can use cObject as base class and make it possible to inspect it in Tkenv.)

TcpStateVariables only contains variables needed to implement the "base" (RFC 793) TCP. More advanced TCP variants are encapsulated into TcpAlgorithm subclasses which can have their own state blocks, subclassed from TcpStateVariables. See TcpAlgorithm::createStateVariables().

Fields

Name Type Description
active bool

set if the connection was initiated by an active open

fork bool

if passive and in LISTEN: whether to fork on an incoming connection

snd_mss uint32_t

sender maximum segment size (without headers, i.e. only segment text); see RFC 2581, page 1. This will be set to the minimum of the local smss parameter and the value specified in the MSS option received during connection setup.

snd_una uint32_t

send sequence number variables (see RFC 793, "3.2. Terminology")

snd_nxt uint32_t

send next (drops back on retransmission)

snd_max uint32_t

max seq number sent (needed because snd_nxt is re-set on retransmission)

snd_wnd uint32_t

send window

snd_up uint32_t

send urgent pointer

snd_wl1 uint32_t

segment sequence number used for last window update

snd_wl2 uint32_t

segment ack. number used for last window update

iss uint32_t

initial sequence number (ISS)

rcv_nxt uint32_t

receive sequence number variables

rcv_wnd uint32_t

receive window

rcv_up uint32_t

receive urgent pointer;

irs uint32_t

initial receive sequence number

rcv_adv uint32_t

advertised window

syn_rexmit_count int

SYN, SYN+ACK retransmission variables (handled separately because normal rexmit belongs to TcpAlgorithm)

syn_rexmit_timeout simtime_t

current SYN/SYN+ACK retransmission timeout

fin_ack_rcvd bool

whether ACK of our FIN has been received. Needed in FIN bit processing to decide between transition to TIME-WAIT and CLOSING (set event code TCP_E_RCV_FIN or TCP_E_RCV_FIN_ACK).

send_fin bool

true if a user CLOSE command has been "queued"

snd_fin_seq uint32_t

if send_fin == true: FIN should be sent just before this sequence number

fin_rcvd bool

whether FIN received or not

rcv_fin_seq uint32_t

if fin_rcvd: sequence number of received FIN

nagle_enabled bool

set if Nagle's algorithm (RFC 896) is enabled

delayed_acks_enabled bool

set if delayed ACK algorithm (RFC 1122) is enabled

limited_transmit_enabled bool

set if Limited Transmit algorithm (RFC 3042) is enabled

increased_IW_enabled bool

set if Increased Initial Window (RFC 3390) is enabled

full_sized_segment_counter uint32_t

this counter is needed for delayed ACK

ack_now bool

send ACK immediately, needed if delayed_acks_enabled is set Based on [Stevens, W.R.: TCP/IP Illustrated, Volume 2, page 861]. ack_now should be set when:

  • delayed ACK timer expires
  • an out-of-order segment is received
  • SYN is received during the three-way handshake
  • a persist probe is received
  • FIN is received
afterRto bool

set at RTO, reset when snd_nxt == snd_max or snd_una == snd_max

ws_support bool

WINDOW_SCALE related variables

ws_enabled bool

set if the connection uses Window Scale (header option)

ws_manual_scale int

the value of scale parameter if it was set manually (-1 otherwise)

snd_ws bool

set if initial WINDOW_SCALE has been sent

rcv_ws bool

set if initial WINDOW_SCALE has been received

rcv_wnd_scale unsigned int

RFC 1323, page 31: "Receive window scale power"

snd_wnd_scale unsigned int

RFC 1323, page 31: "Send window scale power"

ts_support bool

TIMESTAMP related variables

ts_enabled bool

set if the connection uses Window Scale (header option)

snd_initial_ts bool

set if initial TIMESTAMP has been sent

rcv_initial_ts bool

set if initial TIMESTAMP has been received

ts_recent uint32_t

RFC 1323, page 31: "Latest received Timestamp"

last_ack_sent uint32_t

RFC 1323, page 31: "Last ACK field sent"

time_last_data_sent simtime_t

time at which the last data segment was sent (needed to compute the IDLE time for PAWS)

sack_support bool

SACK related variables

sack_enabled bool

set if the connection uses selective acknowledgment (header option)

snd_sack_perm bool

set if SACK_PERMITTED has been sent

rcv_sack_perm bool

set if SACK_PERMITTED has been received

start_seqno uint32_t

start sequence number of last received out-of-order segment

end_seqno uint32_t

end sequence number of last received out-of-order segment

snd_sack bool

set if received vaild out-of-order segment or rcv_nxt changed, but receivedQueue is not empty

snd_dsack bool

set if received duplicated segment (sequenceNo+PLength < rcv_nxt) or (segment is not acceptable)

sacks_array SackList

MAX_SACK_BLOCKS is set to 60

highRxt uint32_t

RFC 3517, page 3: ""HighRxt" is the highest sequence number which has been retransmitted during the current loss recovery phase."

pipe uint32_t

RFC 3517, page 3: ""Pipe" is a sender's estimate of the number of bytes outstanding in the network."

recoveryPoint uint32_t

RFC 3517

sackedBytes uint32_t

number of sackedBytes

sackedBytes_old uint32_t

old number of sackedBytes - needed for RFC 3042 to check if last dupAck contained new sack information

lossRecovery bool

indicates if algorithm is in loss recovery phase

sendQueueLimit uint32_t

queue management

queueUpdate bool
dupacks uint32_t

those counters would logically belong to TcpAlgorithm, but it's a lot easier to manage them here

snd_sacks uint32_t

number of sent sacks

rcv_sacks uint32_t

number of received sacks

rcv_oooseg uint32_t

number of received out-of-order segments

rcv_naseg uint32_t

number of received not acceptable segments

maxRcvBuffer uint32_t

receiver buffer / receiver queue related variables

usedRcvBuffer uint32_t

current amount of used bytes in tcp receive queue

freeRcvBuffer uint32_t

current amount of free bytes in tcp receive queue

tcpRcvQueueDrops uint32_t

number of drops in tcp receive queue

ecnEchoState bool

ECN

sndCwr bool

set if ECE was handled

gotEce bool

set if packet with ECE arrived

gotCeIndication bool

set if CE was set in controlInfo from IP

ect bool

set if this connection is ECN Capable (ECT stands for ECN-Capable transport - rfc-3168)

endPointIsWillingECN bool

set if the other end-point is willing to use ECN

ecnSynSent bool

set if ECN-setup SYN packet was sent

ecnWillingness bool

set if current host is willing to use ECN

sndAck bool

set if sending Ack packet, used to set relevant info in controlInfo.

rexmit bool

set if retransmitting data, used to send not-ECT codepoint (rfc3168, p. 20)

eceReactionTime simtime_t

records the time of the last ECE reaction

dupthresh uint32_t

used for TcpTahoe, TcpReno and SACK (RFC 3517)

Source code

//
// Contains state variables ("TCB") for TCP.
//
// TcpStateVariables is effectively a "struct" -- it only contains
// public data members. (Only declared as a class so that we can use
// cObject as base class and make it possible to inspect
// it in Tkenv.)
//
// TcpStateVariables only contains variables needed to implement
// the "base" (RFC 793) TCP. More advanced TCP variants are encapsulated
// into TcpAlgorithm subclasses which can have their own state blocks,
// subclassed from TcpStateVariables. See TcpAlgorithm::createStateVariables().
//
struct TcpStateVariables
{
    @implements(cObject);
    @descriptor(readonly);

    bool active = false;            // set if the connection was initiated by an active open
    bool fork = false;              // if passive and in LISTEN: whether to fork on an incoming connection

    uint32_t snd_mss = 0;           // sender maximum segment size (without headers, i.e. only segment text); see RFC 2581, page 1.
                                    // This will be set to the minimum of the local smss parameter and the value specified in the
                                    // MSS option received during connection setup.

    // send sequence number variables (see RFC 793, "3.2. Terminology")
    uint32_t snd_una = 0;           // send unacknowledged
    uint32_t snd_nxt = 0;           // send next (drops back on retransmission)
    uint32_t snd_max = 0;           // max seq number sent (needed because snd_nxt is re-set on retransmission)
    uint32_t snd_wnd = 0;           // send window
    uint32_t snd_up = 0;            // send urgent pointer
    uint32_t snd_wl1 = 0;           // segment sequence number used for last window update
    uint32_t snd_wl2 = 0;           // segment ack. number used for last window update
    uint32_t iss = 0;               // initial sequence number (ISS)

    // receive sequence number variables
    uint32_t rcv_nxt = 0;           // receive next
    uint32_t rcv_wnd = 0;           // receive window
    uint32_t rcv_up = 0;            // receive urgent pointer;
    uint32_t irs = 0;               // initial receive sequence number
    uint32_t rcv_adv = 0;           // advertised window

    // SYN, SYN+ACK retransmission variables (handled separately
    // because normal rexmit belongs to TcpAlgorithm)
    int syn_rexmit_count = 0;       // number of SYN/SYN+ACK retransmissions (=1 after first rexmit)
    simtime_t syn_rexmit_timeout;   // current SYN/SYN+ACK retransmission timeout

    // whether ACK of our FIN has been received. Needed in FIN bit processing
    // to decide between transition to TIME-WAIT and CLOSING (set event code
    // TCP_E_RCV_FIN or TCP_E_RCV_FIN_ACK).
    bool fin_ack_rcvd = false;

    bool send_fin = false;          // true if a user CLOSE command has been "queued"
    uint32_t snd_fin_seq = 0;       // if send_fin == true: FIN should be sent just before this sequence number

    bool fin_rcvd = false;          // whether FIN received or not
    uint32_t rcv_fin_seq = 0;       // if fin_rcvd: sequence number of received FIN

    bool nagle_enabled = false;                 // set if Nagle's algorithm (RFC 896) is enabled
    bool delayed_acks_enabled = false;          // set if delayed ACK algorithm (RFC 1122) is enabled
    bool limited_transmit_enabled = false;      // set if Limited Transmit algorithm (RFC 3042) is enabled
    bool increased_IW_enabled = false;          // set if Increased Initial Window (RFC 3390) is enabled

    uint32_t full_sized_segment_counter = 0;    // this counter is needed for delayed ACK
    bool ack_now = false;                       // send ACK immediately, needed if delayed_acks_enabled is set
                                                // Based on [Stevens, W.R.: TCP/IP Illustrated, Volume 2, page 861].
                                                // ack_now should be set when:
                                                //   - delayed ACK timer expires
                                                //   - an out-of-order segment is received
                                                //   - SYN is received during the three-way handshake
                                                //   - a persist probe is received
                                                //   - FIN is received

    bool afterRto = false;                      // set at RTO, reset when snd_nxt == snd_max or snd_una == snd_max

    // WINDOW_SCALE related variables
    bool ws_support = false;                    // set if the host supports Window Scale (header option) (RFC 1322)
    bool ws_enabled = false;                    // set if the connection uses Window Scale (header option)
    int ws_manual_scale = -1;                  // the value of scale parameter if it was set manually (-1 otherwise)
    bool snd_ws = false;                        // set if initial WINDOW_SCALE has been sent
    bool rcv_ws = false;                        // set if initial WINDOW_SCALE has been received
    unsigned int rcv_wnd_scale = 0;             // RFC 1323, page 31: "Receive window scale power"
    unsigned int snd_wnd_scale = 0;             // RFC 1323, page 31: "Send window scale power"

    // TIMESTAMP related variables
    bool ts_support = false;        // set if the host supports Timestamps (header option) (RFC 1322)
    bool ts_enabled = false;        // set if the connection uses Window Scale (header option)
    bool snd_initial_ts = false;    // set if initial TIMESTAMP has been sent
    bool rcv_initial_ts = false;    // set if initial TIMESTAMP has been received
    uint32_t ts_recent = 0;         // RFC 1323, page 31: "Latest received Timestamp"
    uint32_t last_ack_sent = 0;     // RFC 1323, page 31: "Last ACK field sent"
    simtime_t time_last_data_sent;  // time at which the last data segment was sent (needed to compute the IDLE time for PAWS)

    // SACK related variables
    bool sack_support = false;      // set if the host supports selective acknowledgment (header option) (RFC 2018, 2883, 3517)
    bool sack_enabled = false;      // set if the connection uses selective acknowledgment (header option)
    bool snd_sack_perm = false;     // set if SACK_PERMITTED has been sent
    bool rcv_sack_perm = false;     // set if SACK_PERMITTED has been received
    uint32_t start_seqno = 0;       // start sequence number of last received out-of-order segment
    uint32_t end_seqno = 0;         // end sequence number of last received out-of-order segment
    bool snd_sack = false;          // set if received vaild out-of-order segment or rcv_nxt changed, but receivedQueue is not empty
    bool snd_dsack = false;         // set if received duplicated segment (sequenceNo+PLength < rcv_nxt) or (segment is not acceptable)
    SackList sacks_array;    // MAX_SACK_BLOCKS is set to 60
    uint32_t highRxt = 0;    // RFC 3517, page 3: ""HighRxt" is the highest sequence number which has been retransmitted during the current loss recovery phase."
    uint32_t pipe = 0;    // RFC 3517, page 3: ""Pipe" is a sender's estimate of the number of bytes outstanding in the network."
    uint32_t recoveryPoint = 0;    // RFC 3517
    uint32_t sackedBytes = 0;    // number of sackedBytes
    uint32_t sackedBytes_old = 0;    // old number of sackedBytes - needed for RFC 3042 to check if last dupAck contained new sack information
    bool lossRecovery = false;    // indicates if algorithm is in loss recovery phase

    // queue management
    uint32_t sendQueueLimit = 0;
    bool queueUpdate = true;

    // those counters would logically belong to TcpAlgorithm, but it's a lot easier to manage them here
    uint32_t dupacks = 0;    // current number of received consecutive duplicate ACKs
    uint32_t snd_sacks = 0;    // number of sent sacks
    uint32_t rcv_sacks = 0;    // number of received sacks
    uint32_t rcv_oooseg = 0;    // number of received out-of-order segments
    uint32_t rcv_naseg = 0;    // number of received not acceptable segments

    // receiver buffer / receiver queue related variables
    uint32_t maxRcvBuffer = 0;    // maximal amount of bytes in tcp receive queue
    uint32_t usedRcvBuffer = 0;    // current amount of used bytes in tcp receive queue
    uint32_t freeRcvBuffer = 0;    // current amount of free bytes in tcp receive queue
    uint32_t tcpRcvQueueDrops = 0;    // number of drops in tcp receive queue

    // ECN
    bool ecnEchoState = false; // indicates if connection is in echo mode (got CE indication from IP and didn't get CWR from sender yet)
    bool sndCwr = false; // set if ECE was handled
    bool gotEce = false; // set if packet with ECE arrived
    bool gotCeIndication = false; // set if CE was set in controlInfo from IP
    bool ect = false; // set if this connection is ECN Capable (ECT stands for ECN-Capable transport - rfc-3168)
    bool endPointIsWillingECN = false; // set if the other end-point is willing to use ECN
    bool ecnSynSent = false; // set if ECN-setup SYN packet was sent
    bool ecnWillingness = false; // set if current host is willing to use ECN
    bool sndAck = false; // set if sending Ack packet, used to set relevant info in controlInfo.
    bool rexmit = false; // set if retransmitting data, used to send not-ECT codepoint (rfc3168, p. 20)
    simtime_t eceReactionTime; // records the time of the last ECE reaction

    uint32_t dupthresh = 0; // used for TcpTahoe, TcpReno and SACK (RFC 3517)
}

File: src/inet/transportlayer/tcp/TcpConnectionState.msg