客户端和服务端都能主动发起请求
- 假设客户端主动发起连接关闭请求
- 客户端向服务端发送FIN包,同时客户端进入终止等待1状态(第一次挥手)
- 服务端收到FIN包并发送ACK包,表示服务端进入关闭等待状态
- 客户端进入终止等待2状态(第二次挥手)
- 此时,服务端还可以发送数据,客户端能够接收数据
- 等服务端发送完数据后,向客户端发送FIN包,客户端收到后回复ACK包(第三次挥手)
- 客户端进入超时等待状态,经过超时时间后关闭连接,服务端收到ACK包后立即关闭连接(第四次挥手)
为什么客户端需要等待超时时间?
为了保证对端已收到ACK包,因为假设客户端发送完ACK包后就释放了连接,一旦ACK在网络中丢失,服务端将会一直停留在最后的确认阶段,而如果客户端发送完ACK包后停留一段时间,此时如果服务端没有收到ACK包就会重发FIN包,客户端就会响应FIN包重发ACK包,还会重新刷新超时时间