本文记录以下几个问题:
1、tcp连接是三次握手,而为什么关闭连接需要四次握手?
2、当发现发起关闭的一方,有大量FIN_WAIT2状态的时候(即被关闭的一方有大量的CLOSE_WAIT),这时候的问题排查方向。
1、为什么tcp关闭连接是四次挥手:
除了客户端和服务端同时发起连接关闭的情况,大部分情况下都是由一方先发起连接的关闭,由于关闭是双向,这时候另一方发起FIN的操作是在应用层发起的,因此这里回ACK和发FIN这两个步骤不是一起的,所以加起来有四次数据FIN-ACK-FIN-ACK。(客户端和服务端同时发起连接关闭的情况也是产生四次数据)。
连接时的三次握手的区别在于:三次握手一旦发起后,剩下的流程都是在传输层进行。
2、半关闭连接的问题排查方向:
这时候的状态是,客户端调用了close,发送了FIN,服务端也回应了ACK,这时,客户端处于FIN_WAIT2、服务端处于CLOSE_WAIT。接下来服务端一直没有调用close来发起另一个方向的连接关闭。所以此时要考虑的时候,服务端在清理客户端的业务数据的时候,是否存在阻塞现象。
举例:比如在即时通信系统中,在客户端关闭连接的时候,服务端要对客户端的一个状态进行数据的存储,比如把该个客户端的最后状态存入数据库,这时候必然操作一些处理的耗时,解决方法是:把数据存入到队列中,然后调用close关闭连接,然后再去处理(或者让其他线程去处理)这些关闭前的缓存数据。