由于TCP通信是全双工的,断开连接比建立连接要复杂
- 客户端向服务端发送FIN报文,请求断开TCP连接
客户端状态:FIN_WAIT1
- 服务端收到FIN,向客户端发送ACK
服务端状态:CLOSE_WAIT
- 客户端收到ACK后,此刻连接其实已经断开一半了,若服务器还有数据要传输,则继续传输
客户端状态:FIN_WAIT2
- 当服务端数据传输完毕,发送FIN报文给客户端
服务端状态:LAST_ACK
- 客户端收到服务端的第二个FIN后,回复ACK
客户端状态:TIME_WAIT
- 经过2MSL时间后,客户端关闭
客户端状态:CLOSED
- 服务端收到客户端的ACK后关闭
服务端状态:CLOSED
补充:CLOSEING状态
当客户端发送FIN请求断开TCP连接后,并没有收到客户端的ACK,而是直接收到了FIN,即跳过了第二阶段!!!!这是由于网络传输意外发送,ACK包丢失了,则此刻客户端进入CLOSEDING状态
客户端状态:CLOSEDING