No buffer space available tcp协议无法释放问题

No buffer space available

今天碰到一个登录接口异常的问题,远程服务器发现日志报错No buffer space available,今天来分析下问题原因
理解这个问题原因我们必须知道tcp协议4次挥手的原理
No buffer space available tcp协议无法释放问题

tcp协议4次挥手的步骤

释放一个TCP连接,需要客户端和服务器总共发送4个包。客户端和服务器端均可主动发起挥手动作。在socket编程中,任何一方执行close()操作即可产生挥手操作。 这里以服务端首次挥手举例

  1. 第一次挥手
    服务端发送FIN=1和seq(序号)=x到客户端告诉客户端我要断开链接了,自己没有数据发送了,但是仍然可以接受数据
    进入FIN-WAIT-1状态
  2. 第二次挥手(ACK=1,ack=x+1,seq=v)
    客户端确定了服务端的FIN包,发送一个确认包,表明自己接受到了服务端关闭链接的请求,但还没有准备好关闭连接
    发送完毕后进入CLOSE_WAIT状态,服务端受到这个确定包之后进入FIN_WAIT_2状态,等待服务端关闭连接
  3. 第三次挥手(FIN=1 seq=y)
    客户端准备好关闭连接时,向服务端发送结束连接请求,FIN置为1
    发送完毕后,客户端进入LAST_ACK状态,服务端接受到这个确认包之后进入FIN_WAIT状态,等待服务端关闭连接
  4. 第四次挥手(ACK=1,ack=y+1)
    服务端收到来自客户端的端的关闭请求,发送一个确定包,并进入TIME_WAIT状态,等待可能出现的要重传的ACK包
    客户端接收到这个确定包后,关闭连接进入CLOSE状态。
    服务端等待了某个固定时间(两个最大端生命周期 2MSL,2Maximum Segment Lifetime)之后,没有收到客户端的ACK,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入CLOSE状态

我们知道了TIME_WAIT的由来,TIME_WAIT状态最大保持时间是2*MSL,在1-4分钟内,所以当系统并发过大,Client_Server链接数过多,Server端会在1-4分钟之内积累大量处于TIME_WAIT状态的无法释放的socket连接,导致服务器效率急剧下降,甚至耗完服务器所以资源 最终导致No buffer space available (maximum connections reached?): connect

一般问题原因是资源没有正常释放导致的入HttpClient请求链接没有正常关闭,程序上出现大量重复读取插入数据库等操作等待