3次握手:
其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包
作用:就是为了确认对方的接受能力和发送能力是否正常,指定自己的初始化序号为后面的可靠性传输做准备
首先:客户端向服务器发送一个SYN包请求连接,服务器收到后向客户端回复一个SYN+ACK,如果没有收到则不回复且客户端要重发包。服务器发送后,如果客服端的接受能力没问题,那么客户端将会回复一个ACK包。
为什么不是2次或者4次握手呢?
如果两次握手,在服务器回复之后就建立连接。那么不能确认客服端的接收能力是否正常,以及不能同步双方的状态。假如:客服端向服务器发送一个SYN包,但是在过程中出现了异常,那么此时的客户端将会重发,服务器收到后将会回复SYN+ACK包,如果是2次握手,那么此时就应该建立连接了。但是:如果第一次发送的包又恢复正常,那么服务器将会发送两个包,认为建立了两次连接,但客户端却只认为建立了一个。造成了两边的状态不一致。
至于4次握手,3次握手已经能保证了连接的可靠性。多发送一个包,浪费链路资源,是没有必要的。
4次挥手:
客户端和服务端都可以发送请求断开
以客服端为例:首先客户端向服务器发送FIN包,表示关闭连接,自己则进入终止等待1状态。服务器收到后回复ACK,表示自己进入关闭等待状态。客户端进入终止等待2状态。服务端此时还可以发送未发送的数据,客户端还可以接收数据,待服务端发送完数据后,发送一个FIN包给客服端,进入最后确认状态。客服端收到后回复ACK,进入超时等待状态,经过超时时间后关闭连接。而服务端收到ACK后立即关闭连接。
为什么客户端需要等待超时时间:为了保证对方收到ACK包
如果等待一段时间后,服务端没有收到,那么服务端将会重发FIN包,客户端收到后将会刷新等待时间,向服务端重发ACK。
过程图: