时间记录:2019-6-2
问题描述:笔者在进行压力测试的时候遇到了奇怪的问题,压力机的环境是win7的环境,在进行压力测试的时候发现了系统的端口一直被占用,无法释放开来,进行了接口的查找发现了大量的端口处于time_wait的状态,处于未被释放的状态,在这里进行总结下,以后续出现相关问题的查找。
从如下的几个问题下进行总结:
握手协议的状态,握手协议的链接过程,相关系统参数的调整以适应要求。
1:握手协议
握手协议包括三次握手和四次握手,三次握手协议是进行连接,四次握手是进行终止的,这里描述的是TCP的连接和断开的握手。
三次握手协议(连接)
指的是在发送数据的准备阶段,服务器端和客户端之间需要进行三次交互
第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的syn(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手,连接建立后,客户端和服务器就可以开始进行数据传输了。
注意: 这里如果只发送SYN报文后结束其余的握手不执行那么会造成队列的拥挤形成了
四次握手(终止):
由于TCP的半关闭(half-close)造成的,既然一个TCP连接是全双工的(即数据在两个方向上能同同时传递),因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
2:握手协议的链接过程
三次握手过程
1)请求端(通常被称为客户)发送一个SYN段指明客户打算连接的服务器的端口,以及初始序号(INS)
2)服务器发回包含服务器的出事序号的SYN报文段作为应答。同时,将确认序列号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个SYN将占用一个序号。
3)客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认。
注意:这里有个小细节问题,在服务端接收到了客户端发送的SYN报文的时候,那么需要去处理这个问题,那么这时候服务器接收到了大量的连接请求的时候需要将需要处理的请求放置到一个队列中,如果队列超出了限制那么将请求失败,同样的请求连接结束的时候需要将这个连接放置到一个队列中。这里有一个半连接和全连接的说法。这里就要提及到backlog somaxconn 问题了,在linux内核参数中进行调整(一般情况下linux的初始参数设置是不满足要求的,需要自己进行调整),在后续介绍具体的调整。