若要关闭连接,数据段报头必须设置完成 (FIN) 控制标志。 为终止每个单向 TCP 会话,需采用包含 FIN 数据段和 ACK 数据段的二次握手。 因此,若要终止 TCP 支持的整个会话过程,需要实施四次交换,以终止两个双向会话,如图 1 所示。

注意:在本部分中,为了更容易理解,采用了客户端和服务器这两个术语进行说明。实际上,终止的过程可以在任意两台具有开放会话的主机之间展开:

第 1 步:当客户端的数据流中没有其他数据要发送时,它将发送带 FIN 标志设置的数据段;

第 2 步:服务器发送 ACK 信息,确认收到从客户端发出的请求终止会话的 FIN 信息;

第 3 步:服务器向客户端发送 FIN 信息,终止从服务器到客户端的会话;

第 4 步:客户端发送 ACK 响应信息,确认收到从服务器发出的 FIN 信息。

当客户端没有其他要传输的数据时,它将在数据段报头中设置 FIN 标志。 然后,会话中的服务器端发送包含 ACK 标志设置的一般数据段信息,通过确认号确认已经收到所有数据。 当所有数据段得到确认后,会话关闭。

另一方向的会话采用相同的方式关闭。 接收方在数据段的报头中设置 FIN 标志,然后发送到发送方,表明没有其他需要发送的数据。 返回的确认信息确定已接收所有数据,随即该方向的会话关闭。

请参阅图 2 和图 3,查看数据段报头中的 FIN 和 ACK 控制标志,从而关闭 HTTP 会话。

也可以通过三次握手方式关闭连接。 当客户端没有其他要传输的数据时,它将向服务器发送 FIN 信息。 如果服务器也没有其他要传输的数据,它将发送同时包含 FIN 和 ACK 标志设置的响应信息,将两步并作一步。 最后,客户端返回 ACK 信息。