过程
1、首先客户端想要释放连接,向服务器端发送一段TCP报文,报文内容:标记位FIN,序号为Seq=U,随后客户端进入<b>FIN-WAIT-1</b>阶段,即半关闭阶段。并且停止在客户端到服务器端方向上发送数据(非确认报文),但是客户端仍然能接收从服务器端传输过来的数据。
2、服务器端接收到从客户端发出的TCP报文之后,确认了客户端想要释放连接,随后服务器端结束<b>ESTABLISHED</b>阶段,进入<b>CLOSE-WAIT</b>阶段(半关闭状态)并返回一段TCP报文,报文内容:标记位ACK,序号为Seq=V,确认号为Ack=U+1。客户端收到ACK后客户端<b>结束FIN-WAIT-1</b>阶段,<b>进入FIN-WAIT-2</b>阶段
3、服务端发送报文ACK报文之后,经历<b>CLOSE-WAIT</b>阶段,做好了释放服务端到客户端连接准备。再次向客户端发出TCP报文,内容:标记位FIN,序号Seq=W,ACK=U+1,随后进入<b>LAST-ACK阶段</b>
4、客户端收到从服务器端发出的TCP报文,结束FIN-WAIT-2阶段,进入<b>TIME-WAIT阶段</b>,并向服务器端发送一段报文,内容:标记位ACK,序号Seq=U+1,Ack=W+1,随后客户端开始在<b>TIME-WAIT阶段等待2MSL</b>
过程口述
口述:如果客户端想要释放连接的时候会向服务端发送一个释放连接的报文,然后进入到一个半关闭的一个状态,这时候客户端可以接收服务端的消息,但不会再向服务端发送消息。服务端接收到释放连接报文之后,服务端也进入到半关闭的状态,同时向客户端发送确认关闭的消息。服务端经历了半关闭状态期间做好了释放连接的准备之后,会再次向客户端发送释放连接的报文,客户端接收到释放请求之后向服务端发送可以释放的报文,随后等待2MSL(最大存活时间)
为什么要四次挥手
任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。