TcpStateVariables
struct(no description)
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:
|
| 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) |
| highRxt | uint32_t |
FIXME show it SackList sacks_array; // MAX_SACK_BLOCKS is set to 60 |
| 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
struct TcpStateVariables { @existingClass; @descriptor(readonly); bool active; // set if the connection was initiated by an active open bool fork; // if passive and in LISTEN: whether to fork on an incoming connection uint32_t snd_mss; // 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; // send unacknowledged uint32_t snd_nxt; // send next (drops back on retransmission) uint32_t snd_max; // max seq number sent (needed because snd_nxt is re-set on retransmission) uint32_t snd_wnd; // send window uint32_t snd_up; // send urgent pointer uint32_t snd_wl1; // segment sequence number used for last window update uint32_t snd_wl2; // segment ack. number used for last window update uint32_t iss; // initial sequence number (ISS) // receive sequence number variables uint32_t rcv_nxt; // receive next uint32_t rcv_wnd; // receive window uint32_t rcv_up; // receive urgent pointer; uint32_t irs; // initial receive sequence number uint32_t rcv_adv; // advertised window // SYN, SYN+ACK retransmission variables (handled separately // because normal rexmit belongs to TcpAlgorithm) int syn_rexmit_count; // 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; bool send_fin; // true if a user CLOSE command has been "queued" uint32_t snd_fin_seq; // if send_fin == true: FIN should be sent just before this sequence number bool fin_rcvd; // whether FIN received or not uint32_t rcv_fin_seq; // if fin_rcvd: sequence number of received FIN bool nagle_enabled; // set if Nagle's algorithm (RFC 896) is enabled bool delayed_acks_enabled; // set if delayed ACK algorithm (RFC 1122) is enabled bool limited_transmit_enabled; // set if Limited Transmit algorithm (RFC 3042) is enabled bool increased_IW_enabled; // set if Increased Initial Window (RFC 3390) is enabled uint32_t full_sized_segment_counter; // this counter is needed for delayed ACK bool ack_now; // 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; // set at RTO, reset when snd_nxt == snd_max or snd_una == snd_max // WINDOW_SCALE related variables bool ws_support; // set if the host supports Window Scale (header option) (RFC 1322) bool ws_enabled; // set if the connection uses Window Scale (header option) int ws_manual_scale; // the value of scale parameter if it was set manually (-1 otherwise) bool snd_ws; // set if initial WINDOW_SCALE has been sent bool rcv_ws; // set if initial WINDOW_SCALE has been received unsigned int rcv_wnd_scale; // RFC 1323, page 31: "Receive window scale power" unsigned int snd_wnd_scale; // RFC 1323, page 31: "Send window scale power" // TIMESTAMP related variables bool ts_support; // set if the host supports Timestamps (header option) (RFC 1322) bool ts_enabled; // set if the connection uses Window Scale (header option) bool snd_initial_ts; // set if initial TIMESTAMP has been sent bool rcv_initial_ts; // set if initial TIMESTAMP has been received uint32_t ts_recent; // RFC 1323, page 31: "Latest received Timestamp" uint32_t last_ack_sent; // 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; // set if the host supports selective acknowledgment (header option) (RFC 2018, 2883, 3517) bool sack_enabled; // set if the connection uses selective acknowledgment (header option) bool snd_sack_perm; // set if SACK_PERMITTED has been sent bool rcv_sack_perm; // set if SACK_PERMITTED has been received uint32_t start_seqno; // start sequence number of last received out-of-order segment uint32_t end_seqno; // end sequence number of last received out-of-order segment bool snd_sack; // set if received vaild out-of-order segment or rcv_nxt changed, but receivedQueue is not empty bool snd_dsack; // set if received duplicated segment (sequenceNo+PLength < rcv_nxt) or (segment is not acceptable) //FIXME show it SackList sacks_array; // MAX_SACK_BLOCKS is set to 60 uint32_t highRxt; // RFC 3517, page 3: ""HighRxt" is the highest sequence number which has been retransmitted during the current loss recovery phase." uint32_t pipe; // RFC 3517, page 3: ""Pipe" is a sender's estimate of the number of bytes outstanding in the network." uint32_t recoveryPoint; // RFC 3517 uint32_t sackedBytes; // number of sackedBytes uint32_t sackedBytes_old; // old number of sackedBytes - needed for RFC 3042 to check if last dupAck contained new sack information bool lossRecovery; // indicates if algorithm is in loss recovery phase // queue management uint32_t sendQueueLimit; bool queueUpdate; // those counters would logically belong to TcpAlgorithm, but it's a lot easier to manage them here uint32_t dupacks; // current number of received consecutive duplicate ACKs uint32_t snd_sacks; // number of sent sacks uint32_t rcv_sacks; // number of received sacks uint32_t rcv_oooseg; // number of received out-of-order segments uint32_t rcv_naseg; // number of received not acceptable segments // receiver buffer / receiver queue related variables uint32_t maxRcvBuffer; // maximal amount of bytes in tcp receive queue uint32_t usedRcvBuffer; // current amount of used bytes in tcp receive queue uint32_t freeRcvBuffer; // current amount of free bytes in tcp receive queue uint32_t tcpRcvQueueDrops; // number of drops in tcp receive queue // ECN bool ecnEchoState; // indicates if connection is in echo mode (got CE indication from IP and didn't get CWR from sender yet) bool sndCwr; // set if ECE was handled bool gotEce; // set if packet with ECE arrived bool gotCeIndication; // set if CE was set in controlInfo from IP bool ect; // set if this connection is ECN Capable (ECT stands for ECN-Capable transport - rfc-3168) bool endPointIsWillingECN; // set if the other end-point is willing to use ECN bool ecnSynSent; // set if ECN-setup SYN packet was sent bool ecnWillingness; // set if current host is willing to use ECN bool sndAck; // set if sending Ack packet, used to set relevant info in controlInfo. bool rexmit; // 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; // used for TcpTahoe, TcpReno and SACK (RFC 3517) }File: src/inet/transportlayer/tcp/TcpConnection.msg