什么是四次挥手?

16b911c618264239.jpg

  1. 客户端调用 close 方法,执行主动关闭,然后会发送一个FIN报文给服务端。从这以后客户端就不能再发送数据给服务端了。客户端进入 FIN-WAIT-1 状态。FIN报文就是把FIN置为1。

:::info FIN报文是可以携带数据的。比如可以在最后要发送的数据块中携带FIN段。当然也可以不携带数据。但不管是否携带数据,FIN都要消耗一个序列号。 ::: :::info 客户端发送完FIN包以后就不能再发送数据了,但是可以接受服务端发送的数据,这个状态叫做——半关闭(half-close)。
主动发起关闭的一方叫做主动关闭方,另外一方叫做被动关闭方。 :::

  1. 服务端收到FIN报文后发送ACK确认报文回复客户端,服务端进入 CLOSE_WAIT 状态。客户端收到ACK确认后进入 FIN_WAIT_2 状态。
  2. 当服务端也没有数据要发送的时候,发送FIN报文给客户端,然后进入 LAST_ACK 状态,等待客户端的ACK。同样,FIN也需要消耗一个序列号。
  3. 客户端收到FIN报文以后,回复ACK确认报文,进入 TIME_WAIT 状态。等待2个MSL以后,进入 CLOSED 状态。服务端收到ACK后,也进入 CLOSED 状态。