为什么需要三次握手而不是两次握手
为了防止已经失效的连接请求报文段被服务端接受,从而产生错误。
失效的连接请求:发生超时的”第一个“连接请求。
若客户端向服务端发送的连接请求发生超时,客户端在等待应答丢失后,就会再次发送连接请求,此连接请求正常发送至服务器端,服务器端也正常做出应答,并将响应发送回客户端。
假如此时采用的是两次握手,此时客户端—服务器端已经成功建立起TCP连接,假设在通信完成并通信结束后,已经失效到达服务器端,此时连接就建立了,服务器端会一直等待客户端发送数据,从而白白浪费服务器的资源
而如果采用的是三次握手,每一步中都需要确认ACK,失效的请求触发TCP重传机制,在未到达前不会建立TCP连接,因此不会产生已经失效的连接请求报文段被服务器端接受的情况。
为什么需要四次挥手
因为在Linux操作系统中,允许TCP采用半关闭,允许连接的双方只有一方关闭,FIN、ACK半关闭完成。理论上此时关闭的一方不能发送数据,但是任然可接受数据
为什么客户端要先TIME-WAIT状态,等待后才进入CLOSED状态
第四次挥手:假设客户端为A,服务器端为B。A收到释放请求,向B发送确认应答,A进入TIME-WAIT状态,持续2MSL时间,若该时间无B重发请求,再进入CLOSED状态,撤销TCP。当B收到确认应答后,也进入CLOSED状态,撤销TCP。
若A直接进入CLOSED状态,加入此时向B发送的应答丢失,B等待超时,重发连接释放请求,但此时A已经CLOSED,不会响应,导致B永远无法正常关闭,所以需要先进入TIME-CLOSED状态。