参与数据交换的双方中的任何一方(客户或服务器)都可以关闭连接,虽然一般来说这些都是由客户启动的。
半关闭
在TCP中,连接的一方可以停止发送数据,但依然可以接收数据,这就称为 半关闭(half-close)
服务器或客户都可以发出半关闭请求。如果服务器在开始对数据进行处理之前需要所有数据到齐,就会出现这种情况。
排序就是一个例子,当客户向服务器发送要求排序的数据时,服务器需要收到所有的数据之后才能开始排序。也就是说,客户在发送完所有的数据后,可以把从客户到服务器方向的连接关闭。但是,从服务器到客户方向的连接还必须是打开的,以便返回排序后的数据。服务器在接受完数据后还需要一些时间来进行排序处理,所以它的输出方向的连接必须是保持打开的。
上图是一个半关闭的例子。从客户到服务器的数据传送结束了。客户发送了FIN报文段,此连接被半关闭了。服务器通过发送ACK报文段来表示接受这个半关闭。但是,服务器仍然可以发送数据。当服务器已经把所有处理过的数据都发送完毕后,就发送一个FIN报文段,并且被客户发来的 ACK予以确认。
在连接被关闭之后,数据可以从服务器传送到客户。并且确认可以从客户传送到服务器,但客户不能再给服务器发送任何数据了。请注意我们使用的序号。第二个报文段(ACK)不消耗序号。虽然客户已经收到了序号y-1,并期望接收序号y,但服务器发送ACK报文段的序号仍然是y-1 在连接最后关闭时,最后一个ACK报文段的序号仍然是x。因为该方向的数据传送不消耗序号。
连接复位
某一端的TCP可能会拒绝一个连接请求,也可能异常终止一条在用的连接,或者可能要终止一条空闲的连接。所有这些都是通过RST(复位)标志来完成
拒绝连接请求
假定某一端的TCP向一个并不存在的端口请求连接,另一端的TCP就可以发送RST位置1的报文段来拒绝这个请求
异常终止连接
由于出现了异常情况,某一端的TCP可能希望放弃一条在用的连接。它可以发送一个RST报文段来关闭这条连接
终止空闲的连接
某一端的TCP可能发现另一端的TCP已经空闲了很长的时间,它就可以发送RST报文段来终止这个连接。该过程与异常终止连接是一样的。