建立一个TCP链接需要三次握手,断开一个连接要经过四次挥手。这由TCP的半关闭(half-close)造成的。所谓的半关闭,其实就是TCP提供了连接的一端在结束的发送后还能接收来自另一端数据的能力。
TCP的链接拆除需要发送四个包,因此成为四次挥手(Four-way handshake),客户端和服务器军和主动发起挥手动作。
上述符号的意思
FIN:连接终止位
seq:发送的第一个字节的序号
ACK:确认报文段
ack:确认号,希望收到的下一个数据的第一个字节的序号
刚开始双发都处于ESTABLISHED状态,假设是客户端先发起的关闭请求,四次挥手的过程如下:
第一次握手
客户端发送一个FIN报文(请求链接终止:FIN=1),报文中会制定一个序列号seq=u。并停止在发送数据,主动关闭TCP连接。此时客户端处于FIN_WAIT1状态,等待服务端的确认。
FIN-WAIT1 等待远程TCP连接中断请求,或先前的链接中断请求的确认。
第二次握手
服务端收到FIN之后,会发送ACK报文,且把客户端的序列号+1作为ACK报文的序列号值,表明已经收到客户端的报文了,此时服务器处理CLOSE_WAIT状态。
CLOSE_WAIR 等待从本地用户发来的链接中断请求;
此时的TCP处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认号,进入FIN_WAIT2(终止等待2)状态,等待服务端发胡的连接释放报文段
FIN-WAIT2从远程TCP等待连接中断请求
第三次挥手
如果服务端也想断开连接(没有要向客户端发出的数据),和客户端的第一次挥手一样,发送FIN报文段,指定一个序列号。此时服务端处于LAST_ACK的状态,等待客户端确认
LAST_ACK 等待原来发向远程TCP的连接中断请求的确认
第四次挥手
客户端收到FIN之后,一样发送一个ACK报文作为应答(ack=w+1),并且把服务端的序列值+1作为自己ACK报文序列号值(seq=u+1),此时客户端处于TIME_WAIT(时间等待)状态
TIME-WAIT等待足够的时间以确认远程TCP连接接收到连接中断请求的确认