Three-Way Handshake
-
server get prepared to accept an incoming connection (passive open) by
calling socket, bind, and listen. -
client opens connection (active open) by calling connect. This causes
the client TCP to send a “synchronize” (SYN) segment, which tells the
server the client’s initial sequence number for the data that the
client will send on the connection. Normally, there is no data sent
with the SYN; it just contains an IP header, a TCP header, and
possible TCP options. -
server must acknowledge (ACK) the client’s SYN and the server must also
send its own SYN containing the initial sequence number for the data that
the server will send on the connection. The server sends its SYN and
the ACK of the client’s SYN in a single segment. -
The client must acknowledge the server’s SYN.
The minimum number of packets required for this exchange is three; hence,
this is called TCP’s three-way handshake.
TCP A TCP B
1. CLOSED LISTEN
2. SYN-SENT --> <SEQ=100><CTL=SYN> --> SYN-RECEIVED
3. ESTABLISHED <-- <SEQ=300><ACK=101><CTL=SYN,ACK> <-- SYN-RECEIVED
4. ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK> --> ESTABLISHED
5. ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK><DATA> --> ESTABLISHED
Basic 3-Way Handshake for Connection Synchronization
TCP Connection Termination
-
One application (client or server) calls close first, and we say that this
end performs the active close. This end’s TCP sends a FIN segment,
which means it is finished sending data. -
The other end that receives the FIN performs the passive close. The
received FIN is acknowledged by TCP. The receipt of the FIN is also passed
to the application as an end-of-file (after any data that may have already
been queued for the application to receive), since the receipt of the FIN
means the application will not receive any additional data on the connection. -
Sometime later, the application that received the end-of-file will close
its socket. This causes its TCP to send a FIN. -
The TCP on the system that receives this final FIN (the end that did the
active close) acknowledges the FIN.TCP A TCP B 1. ESTABLISHED ESTABLISHED 2. (Close) FIN-WAIT-1 --> <SEQ=100><ACK=300><CTL=FIN,ACK> --> CLOSE-WAIT 3. FIN-WAIT-2 <-- <SEQ=300><ACK=101><CTL=ACK> <-- CLOSE-WAIT (Close) 4. TIME-WAIT <-- <SEQ=300><ACK=101><CTL=FIN,ACK> <-- LAST-ACK 5. TIME-WAIT --> <SEQ=101><ACK=301><CTL=ACK> --> CLOSED 6. (2 MSL) CLOSED Normal Close Sequence
________________________________________________________________________________ CLIENT SERVER -+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | socket, bind, listen | | LISTEN (passive open) | | accept (blocks) socket | | connect (blocks) | | (active open) SYN_SENT |>>>>>>>>>>>>> SYN J, MSS=536 | | >>>>>>>>>>>>>>>>>>>>>| SYN_RCVD | SYN K, ACK J+1, MSS=1460<<<<<<<<<| ESTABLISHED |<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>> ACK K+1 | | >>>>>>>>>>>>>>>>>>>| ESTABLISHED | | accept return | | read (blocks) | | write |>>>>>>>>>>>>>>> data (request) | read (blocks) | >>>>>>>>>>>>>>>>>>>| read returns | | | | | date (reply), ACK (request)<<<<<<| write read returns |<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>> ACK reply | | >>>>>>>>>>>>>>>| close | | (active close) |>>>>>>>>>>>>>>>>>>> | FIN_WAIT_1 | > FIN M | | >>>>>>>>>>>>>>>>| CLOSE_WAIT (passive close) | <<<<<<<<<<<<<<<<<| read returns 0 (eof) | ACK M+1 << | FIN_WAIT_2 |<<<<<<<<<<<<<<<<< | | | close | FIN N <<<<<<<<<<<<<<<<<| LAST_ACK TIME_WAIT |<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>| CLOSED | | _________________________________________________________________________________