TCP 四次挥手的过程
为什么建立连接只要三次挥手,断开连接需要四次挥手?
这是因为 TCP 四次挥手的过程,它除了确认双方都是确认关闭之后,它还会为服务端关闭提供一个异步的等待时间;就是客户端发完了最后的数据之后准备关闭连接,服务端在接受到客户端的请求后,回复客户端他已经知道了,但是这个时候服务端还是可以继续发送数据的;这个时候就处于一个半关闭的状态,客户端可以选择再接收一些数据关闭也可以直接关闭。
四次挥手的大致过程如下:
- 客户端发送 FIN 包后,进入 FIN-WAIT-1 状态之后,客户端就不会主动的给服务端发送任何的消息了
- 服务端在接收到客户端发送的请求后,回复 ACK 包,告知客户端它已经接收到请求了,然后进入 CLOSE-WAIT 状态,客户端进入 FIN-WAIT-2 状态,这个时候整个连接处于半关闭状态。为什么服务端会有这个状态呢?
- 这是因为服务端是提供服务的,服务端可能还有些没有处理完的服务,它不能立即关闭,要确保服务端要发送给客户端的数据都发送完成。
- 服务端发送 FIN 包,服务端不会给客户端发送数据了,进入 LAST-ACK 状态等待客户端确认
- 客户端发送 ACK 包后进入 TIME-WAIT 状态等待 2MS,为什么要等待这个时间呢,这是因为客户端发送的 ACK 包是可能丢失的,如果服务端没有收到这个确认包还会继续发送 FIN 包,等待这个时间就是为了确保 ACK 能够到达服务端。