三次握手步骤:
问题一:为什么两次握手不行?一定要三次?
如果两次握手,客户端没啥区别,仍然需要获得服务端的应答后才进入ESTABLISHED状态,而服务端在收到连接请求后就进入ESTABLISHED状态(因为此时是两次握手,必须第二次握手就要连接,所以就不能再有synrcvd步骤)。此时如果网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便超时重发请求,如果服务端正确接收并确认应答,双方便开始通信,通信结束后释放连接。此时,如果之前那个失效的连接请求抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED状态,等待发送数据或主动发送数据。但此时的客户端早已进入CLOSED状态,服务端将会一直等待下去,这样浪费服务端连接资源。
四次挥手步骤:
多了一个 服务端发送FIN包的步骤:fin=1,ack=1,seq=w,ack=u+1
- 四次握手为什么要最后等2msl?
第3次握手完成后发送了第四次握手的ACK包后客户端就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个ACK包服务端没收到。
如果没收到最后的ack包,那么对方在超时后将重发第三次握手的FIN包,服务端接到重发的后可以再重发一个ACK应答包。所以2msl可以保证时间够用