Connected: An Internet Encyclopedia
RFC 793 - 3.5. Closing a Connection

Top: Connected: An Internet Encyclopedia
Up: Requests For Comments
Up: RFC 793
Up: 3. FUNCTIONAL SPECIFICATION
Prev: 3.4. Establishing a connection
Next: 3.6. Precedence and Security

### 3.5. Closing a Connection

CLOSE is an operation meaning "I have no more data to send." The notion of closing a full-duplex connection is subject to ambiguous interpretation, of course, since it may not be obvious how to treat the receiving side of the connection. We have chosen to treat CLOSE in a simplex fashion. The user who CLOSEs may continue to RECEIVE until he is told that the other side has CLOSED also. Thus, a program could initiate several SENDs followed by a CLOSE, and then continue to RECEIVE until signaled that a RECEIVE failed because the other side has CLOSED. We assume that the TCP will signal a user, even if no RECEIVEs are outstanding, that the other side has closed, so the user can terminate his side gracefully. A TCP will reliably deliver all buffers SENT before the connection was CLOSED so a user who expects no data in return need only wait to hear the connection was CLOSED successfully to know that all his data was received at the destination TCP. Users must keep reading connections they close for sending until the TCP says no more data. There are essentially three cases:

        1) The user initiates by telling the TCP to CLOSE the connection

        2) The remote TCP initiates by sending a FIN control signal

        3) Both users CLOSE simultaneously

Case 1: Local user initiates the close

        In this case, a FIN segment can be constructed and placed on the
        outgoing segment queue.  No further SENDs from the user will be
        accepted by the TCP, and it enters the FIN-WAIT-1 state.  RECEIVEs
        are allowed in this state.  All segments preceding and including FIN
        will be retransmitted until acknowledged.  When the other TCP has
        both acknowledged the FIN and sent a FIN of its own, the first TCP
        can ACK this FIN.  Note that a TCP receiving a FIN will ACK but not
        send its own FIN until its user has CLOSED the connection also.

Case 2: TCP receives a FIN from the network

        If an unsolicited FIN arrives from the network, the receiving TCP
        can ACK it and tell the user that the connection is closing.  The
        user will respond with a CLOSE, upon which the TCP can send a FIN to
        the other TCP after sending any remaining data.  The TCP then waits
        until its own FIN is acknowledged whereupon it deletes the
        connection.  If an ACK is not forthcoming, after the user timeout
        the connection is aborted and the user is told.

Case 3: both users close simultaneously

        A simultaneous CLOSE by users at both ends of a connection causes
        FIN segments to be exchanged.  When all segments preceding the FINs
        have been processed and acknowledged, each TCP can ACK the FIN it
        has received.  Both will, upon receiving these ACKs, delete the
        connection.

          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

      4.                                                       (Close)
          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

                                   Figure 13.

          TCP A                                                TCP B

      1.  ESTABLISHED                                          ESTABLISHED

      2.  (Close)                                              (Close)
          FIN-WAIT-1  --> <SEQ=100><ACK=300><CTL=FIN,ACK>  ... FIN-WAIT-1
                      <-- <SEQ=300><ACK=100><CTL=FIN,ACK>  <--
                      ... <SEQ=100><ACK=300><CTL=FIN,ACK>  -->

      3.  CLOSING     --> <SEQ=101><ACK=301><CTL=ACK>      ... CLOSING
                      <-- <SEQ=301><ACK=101><CTL=ACK>      <--
                      ... <SEQ=101><ACK=301><CTL=ACK>      -->

      4.  TIME-WAIT                                            TIME-WAIT
          (2 MSL)                                              (2 MSL)
          CLOSED                                               CLOSED

                          Simultaneous Close Sequence

                                   Figure 14.

Next: 3.6. Precedence and Security

Connected: An Internet Encyclopedia
RFC 793 - 3.5. Closing a Connection