什么是四次挥手?

- 客户端调用
close方法,执行主动关闭,然后会发送一个FIN报文给服务端。从这以后客户端就不能再发送数据给服务端了。客户端进入FIN-WAIT-1状态。FIN报文就是把FIN置为1。
:::info
FIN报文是可以携带数据的。比如可以在最后要发送的数据块中携带FIN段。当然也可以不携带数据。但不管是否携带数据,FIN都要消耗一个序列号。
:::
:::info
客户端发送完FIN包以后就不能再发送数据了,但是可以接受服务端发送的数据,这个状态叫做——半关闭(half-close)。
主动发起关闭的一方叫做主动关闭方,另外一方叫做被动关闭方。
:::
- 服务端收到FIN报文后发送ACK确认报文回复客户端,服务端进入
CLOSE_WAIT状态。客户端收到ACK确认后进入FIN_WAIT_2状态。 - 当服务端也没有数据要发送的时候,发送FIN报文给客户端,然后进入
LAST_ACK状态,等待客户端的ACK。同样,FIN也需要消耗一个序列号。 - 客户端收到FIN报文以后,回复ACK确认报文,进入
TIME_WAIT状态。等待2个MSL以后,进入CLOSED状态。服务端收到ACK后,也进入CLOSED状态。
