- 某个应用进程首先调用close,我们称这一端执行主动关闭(active close)。这一端的TCP于是发送一个FIN分节,表示数据发送完毕。
- 接收到FIN的另一端执行被动关闭(passive close)。这个FIN由TCP确认。他的接受也作为文件结束符传递给接收端应用进程(放在已排队等候该应用进程接受的任何其他数据之后),因为FIN的接受意味着应用进程在相应的连接上再也接收不到额外数据。
- 一段时间后,接收到文件结束符的应用进程将调用close关闭它的套接口。这导致它的TCP也发送一个FIN。
- 接收到这个FIN的原发送端TCP(即执行主动关闭的那一端)对它进行确认。
TCP连接关闭时的分组交换
TCP状态转换图:
TCP连接中的分组交换
CLOSED状态:TCP未建立的一般状态
SYN_SENT状态:当应用进程在CLOSED状态下执行一个主动打开时(connect),TCP将发送一个SYN(J)并从CLOSED状态转换成该状态。
LISTEN状态:应用进程被动打开的状态(socket,bind,listen)。
SYN_RCVD状态:应用进程执行被动打开后,接收到一个SYN,TCP将发送一个ACK(J+1)和一个SYN(K)并从LISTEN状态转换成该状态。
ESTAB-LISHED状态:进程执行一个主动打开后,接收到一个捎带ACK的SYN,它将发送一个ACK并转换成该状态。这个最终状态是绝大多数数据传送发生的状态。
FIN_WAIT_1状态:如果应用进程在接收到文件结束符前调用close(主动关闭),发送一个FIN(M)则转换成该状态。
CLOSE_WAIT状态:如果在ESTAB-LISHED状态下,应用进程接收到FIN,并发送一个ACK(M+1),则转换成该状态。
FIN_WAIT_2状态:处在FIN_WAIT_1状态的进程收到也ACK(M+1),转换成该状态。
LAST_ACK状态:被动关闭一方也发送一个FIN(N),并从CLOSE_WAIT状态转换成该状态。
TIME_WAIT:主动关闭一方收到一个FIN(N)后,发送一个ACK(N+1),并转换成该状态。至此,整个TCP连接就完全关闭了,即重新进入CLOSED状态。