一、三次握手与四次挥手流程
1)三次握手(TCP建立连接)
1、首先客户端向被服务端发送建立连接的请求(SYN),此时客户端TCP层的状态变为SYN_SENT,等待服务端的响应;
2、服务端再收到客户端的建立连接请求后,向客户端作出应答(SYN),并且向客户端发送ACK,确认其是否具有收发数据的能力,此时服务端的状态为SYN_RCVD;
3、客户端收的到服务端的ACK后,需要向服务端表明,自己具有收发数据的能力,于是向服务端发送ACK进行反馈.此时客户端的状态变为ESTABLISHED;
4、当服务端收到客户端发送的确认应答ACK之后,服务端的状态就变为ESTABLISHED,至此,客户端与服务端的TCP连接建立成功;
2)四次挥手(TCP断开连接)
以客户端为主动断开连接的一方,服务端为被动断开连接的一方为例
1、首先,客户端向服务端发送FIN,请求断开连接,此时客户端状态为FIN-WAIT-1;
2、服务端在收到客户端的断开连接请求(FIN)之后,作出相应,向客户端发送ACK,可理解为已经收到客户端的断开连接请求,此时客户端的状态为FIN-WAIT-2,服务端的状态为CLOSE-WAIT;
3、服务端对客户端的断开连接请求做出响应,并处理完所有数据之后,会向客户端发送FIN,可理解为询问客户端是否确认要断开连接,此时服务端的状态为LAST-ACK;
4、当客户端收到服务端发送的FIN之后,会给服务端发送ACK,表明自己确定要断开连接,此时客户端的状态为TIME-WAIT,然后再等待2MSL(报文最大生存时间)的时间之后,进入CLOSED状态;
5、服务端收到客户端发送的ACK,得知客户端已确认要断开连接后,服务端进入CLOSED状态,此时,客户端与服务端的TCP连接成功断开;
3)TIME_WAIT状态必须等待2MSL的原因
1、保证主动断开连接方发送的最后一次ACK能够到达被动断开连接方;如果主动方发送的ACK报文段在传输过程中丢失,被动方在超时等待后再次发送FIN+ACK报文段;
2、防止“已失效的连接请求报文段”出现在本连接中。主动方在发送完最后一个ACK报文段后,再经过2MSL时间,就可以使得本连接持续的时间所产生的的所有报文段都从网络中消失。这样下一个新的连接不会出现旧的失效的报文段。
二、三次握手的原因
1、保证双方的收发数据能力:客户端发送的SYN请求无法保证自己具有收发数据的能力,需要服务端进行再次确认;
2、防止多次连接:两次的信息交互也是不安全的,如果客户端向服务端发送SYN请求后,出现了延迟,客户端迟迟没有收到服务端的响应,在超时一定时间后,客户端会再次向服务端发送SYN请求,在缺乏保护的情况下,若在第二个SYN到达服务端,客户端与服务端进行连接之后,第一个SYN请求也到达了,此时就会新建一个无用的连接,而之前的连接会被断开;
3、四次握手是没有必要的,因为三次握手就已经能安全的建立TCP连接
三、三次握手失败,服务器的处理策略
以客户端为主动连接方,服务端为被动连接方为例
1、如果客户端在发送建立连接请求SYN后,经过一定时间还没有收到服务端的任何响应,就会重新发送建立连接请求;
2、如果服务服务端收到客户端的建立连接请求,并作出相应(SYN+ACK)后,经过一定时间还没有收到客户端的ACK报文段,会重新向客户端发送SYN+ACK。
四、四次挥手的原因
在被动关闭方收到主动方的断开连接请求FIN后,不可以直接断开连接,因为此时可能有尚未处理完成的数据、缓冲区也可能还有数据;所以需要所有的数据处理完成后,询问客户端是否确认此时断开连接;(即被动方先向主动方发送ACK,然后再发送FIN);