1. 实际问题
初步查看发现,无法对外新建TCP连接时,线上服务器存在大量处于TIME_WAIT状态的TCP连接(最多的一次为单机10w+,其中引起报警的那个模块产生的TIME_WAIT约2w),导致其无法跟下游模块建立新TCP连接。
TIME_WAIT涉及到TCP释放连接过程中的状态迁移,也涉及到具体的socket api对TCP状态的影响,下面开始逐步介绍这些概念。
2. TCP状态迁移
面向连接的TCP协议要求每次peer间通信前建立一条TCP连接,该连接可抽象为一个4元组(four-tuple,有时也称socket pair):(local_ip, local_port, remote_ip,remote_port),这4个元素唯一地代表一条TCP连接。
1)TCP Connection Establishment
TCP建立连接的过程,通常又叫“三次握手”(three-way handshake),可用下图来示意:
可对上图做如下解释:
a. client向server发送SYN并约定初始包序号(sequence number)为J;
b. server发送自己的SYN并表明初始包序号为K,同时,针对client的SYNJ返回ACKJ+1(注:J+1表示server期望的来自该client的下一个包序为J+1);
c. client收到来自server的SYN+ACK后,发送ACKK+1,至此,TCP建立成功。
其实,在TCP建立时的3次握手过程中,还要通过SYN包商定各自的