1、建立一个连接需要三次握手,而终止一个连接要经过四次挥手。
2、原因:这由TCP的半关闭(half-close)造成的。所谓的半关闭,其实就是TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。
TCP 的连接的拆除需要发送四个包,因此称为四次挥手(Four-way handshake),客户端或服务器均可主动发起挥手动作。
3、具体内容:
■ 初始状态:客户端和服务端都在连接状态,接下来开始进行四次分手断开连接操作。
■ 第一次挥手:第一次分手无论是客户端还是服务端都可以发起,因为 TCP 是全双工的。 假如客户端发送的数据已经发送完毕,发送FIN = 1 告诉服务端,客户端所有数据已经全发完了, 服务端你可以关闭接收了,但是如果你们服务端有数据要发给客户端,客户端照样可以接收的。此时客户端处于FIN = 1等待服务端确认释放连接状态。
■第二次挥手:服务端接收到客户端的释放请求连接之后,知道客户端没有数据要发给自己了,然后服 务端发送ACK =1告诉客户端收到你发给我的信息,此时服务端处于 CLOSE_WAIT 等待关闭状态。 (服务端先回应给客户端一声,我知道了,但服务端的发送数据能力即将等待关闭,于是接下来第三次就来了。)
■ 第三次挥手:此时服务端向客户端把所有的数据发送完了,然后发送一个FIN = 1,用于告诉客户 端,服务端的所有数据发送完毕,客户端你也可以关闭接收数据连接了。此时服务端状态处于LAST_ACK状态,来等待确认客户端是否收到了自己的请求。(服务端等客户端回复是否收到呢, 不收到的话,服务端不知道客户端是不是挂掉了还是咋回事呢,所以服务端不敢关闭自己的接收能 力,于是第四次就来了。)
■第四次挥手:此时如果客户端收到了服务端发送完的信息之后,就发送ACK = 1,告诉服务端,客户 端已经收到了你的信息。有一个 2 MSL的延迟等待。
4、需要四次挥手的原因:
因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四次挥手。