对于已建立连接的客户端---服务器连接来说,双方都可以主动关闭连接,下图以客户端关闭连接为例讲解TCP的四次挥手释放连接过程:
- 客户端向服务器端发送关闭请求报文,此时FIN=1,ACK=1(一次握手),客户端处于FIN-WAIT-1状态;
- 服务器端收到客户端的关闭请求后,向服客户端发送确认报文ACK=1,但是,由于TCP连接是全双工的,也就是双向连接的,当服务器端接收到关闭报文时,可能还有数据要发送给客户端,这时服务器端为CLOSE-WAIT状态,这个阶段还可以向客户端发送数据(二次握手)
- 一旦服务器端数据全部发送完之后,就向客户端发送关闭请求报文,FIN=1,ACK=1,然后处于最后确认状态。(三次握手)
- 客户端收到服务器端收到的关闭请求报文后,发送关闭确认报文ACK=1,然后客户端处于TIME-WAIT状态,该状态会等待2MSL时间(2倍最长报文寿命,4min),然后关闭连接。(四次握手)
- 服务器端收到客户端的连接关闭确认后关闭连接。
TIME-WAIT的重要性
假设客户端没有TIME-WAIT状态,如果客户端最后一次关闭确认报文丢失,则服务器端会认为是超时重传,会一直重新发送关闭请求报文,而此时客户端已经关闭连接,则会导致死锁。
保活计时器
- TCP服务器每接收到一次TCP客户进程的数据,就重新设置并启动保活计时器
- 若保活计时器定时周期内未收到TCP客户端发来的数据,则当保活计时器到时后,TCP服务器进程就向客户端进程发送一个探测报文段,以后每隔75s发送一次。若是一连发送10个探测报文段后仍然TCP客户端响应,TCP服务器就任务客户端故障,然后关闭连接。