*You can see definitions below directly by placing your cursor on corresponding tags on the picture.
Label |
Event / Action |
Label |
Event / Action |
a |
Active OPEN / create TCB, snd SYN |
e' |
rcv FIN / snd SYN,ACK(FIN) |
a' |
Active OPEN / snd SYN |
e'' |
rcv FIN / snd FIN,ACK(FIN) |
b |
rcv SYN [no TAO] / snd ACK(SYN) |
e''' |
rcv FIN / snd SYN,FIN,ACK(FIN) |
b' |
rcv SYN [no TAO] / snd SYN,ACK(SYN) |
f |
rcv ACK(FIN) / |
b'' |
rcv SYN [no TAO] / snd SYN,FIN,ACK(SYN) |
f ' |
rcv ACK(FIN) / delete TCB |
c |
rcv ACK(SYN) |
f'' |
rcv ACK(FIN) / ACK(SYN) |
c' |
rcv ACK(SYN) / snd FIN |
g |
CLOSE / delete TCB |
c'' |
rcv ACK(SYN) / snd FIN,ACK(SYN) |
h |
passive OPEN / create TCB |
d |
CLOSE / snd FIN |
i (=b') |
rcv SYN [no TAO] / snd SYN,ACK(SYN) |
d' |
CLOSE / snd SYN,FIN,ACK(FIN) |
j |
rcv SYN [TAO OK] / snd SYN,ACK(SYN) |
d'' |
CLOSE / snd SYN,FIN,ACK(SYN) |
k |
rcv SYN [TAO OK] / snd SYN,FIN,ACK(SYN) |
e |
rcv FIN / snd ACK(FIN) |
T |
timeout=2MSL / delete TCB |
T/TCP requires new connection states and state transitions. Each of the new states in the figure above bears a starred name, created by suffixing a star onto a standard TCP state. Each "starred" state bears a simple relationship to the corresponding "unstarred" state:
SYN-SENT* and SYN-RECEIVED* differ from the SYN-SENT and SYN-RECEIVED state, respectively, in recording the fact that a FIN needs to be sent.
The other starred states indicate that the connection is half-synchronized (hence, a SYN bit needs to be sent).
This simple correspondence leads
to an alternative state model, which makes it easy to incorporate the new states
in an existing implementation. Each state in the extended FSM (Finite State
Machine) is defined by the triplet:
(old_state, SENDSYN, SENDFIN)
where 'old_state' is a standard TCP state and SENDFIN and SENDSYN are Boolean
flags. The SENDFIN flag is turned on (on the client side) by a SEND(... EOF=YES)
call, to indicate that a FIN should be sent in a state which would not otherwise
send a FIN. The SENDSYN flag is turned on when the TAO test succeeds to indicate
that the connection is only half synchronized; as a result, a SYN will be sent
in a state which would not otherwise send a SYN.
Here is a more complete description of these boolean variables:
SENDFIN
SENDFIN is turned on by the SEND(...EOF=YES) call, and turned off when FIN-WAIT-1
state is entered. It may only be on in SYN-SENT* and SYN-RECEIVED* states.
SENDFIN has two effects. First, it causes a FIN to be sent on the last segment
of data from the user. Second, it causes the SYN-SENT* and SYN-RECEIVED*
states to transition directly to FIN-WAIT-1, skipping ESTABLISHED state.
SENDSYN
SENDSYN is turned on when an initial SYN segment is received and passes
the TAO test. SENDSYN is turned off when the SYN is acknowledged (specifically,
when there is no RST or SYN bit and SEG.UNA < SND.ACK).
SENDSYN has three effects. First, it causes the SYN bit to be set in segments
sent with the initial sequence number (ISN). Second, it causes a transition
directly from LISTEN state to ESTABLISHED*, if there is no FIN bit, or otherwise
to CLOSE-WAIT*. Finally, it allows data to be received and processed (passed
to the application) even if the segment does not contain an ACK bit.