三次握手的目的是什么:
三次握手是为了让客户端和服务端分别确认自己和对方接收和发送消息的能力是正常的
四次挥手的目的:
四次挥手的目的分为两种,一种是全加工,一种是半加工
全加工:客户端在给服务端发送消息的同时,服务端也可以给客户端发送消息
半加工:客户端可以给服务端发消息,服务端也可以给客户端发消息 ,但客户端和服务端不能同时发
三次握手的过程
1.第一次握手:客户端发送syn包到服务器,并进入SYN_SEND状态,等待服务器确认,syn:同步序列编号
2.第二次握手:服务器收到syn包,必须确认客户的syn,同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态
3.第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,此包发送完毕,客户端和服务器都进入ESTABLISHED状态,完成三次握手
四次挥手的过程
1.第一次挥手:客户端向服务器发送FIN报文,发完后进入FIN_WAIT_1状态,即主动关闭TCP连接,不再发送数据,但可以接收服务器发来报文,等待服务器回复
2.第二次挥手:服务器接收到FIN报文后,返回一个ACK报文,表名自己接收到此报文,服务器进入CLOSE_WAIT关闭等待状态,此时客户端就知道服务端接到自己的断开连接请求,进入到FIN_WAIT_2状态,TCP处于关闭状态,但服务端可能还有数据要传输
3.第三次挥手:服务器关闭客户端连接,发送FIN报文给客户端,此时服务器处于LAST_ACK状态,等待客户端回应.
4.第四次挥手:客户端收到FIN报文后发送一个ACK给服务器作为应答,此时客户端处于TIME_WAIT状态,这个状态是为了等待足够的时间以确保TCP接收到连接中断请求的确认
为什那么挥手比握手多一次
因为握手的时候并没有数据传输,所以服务端的SYN和ACK报文可以一起发送,但是挥手的时候有数据再传输,所以ACK和FIN报文不能同时发送,需要分两步,所以会比握手少一步
为什么三次挥手不行
因为服务端在接收到FIN,往往不会直接返回FIN,必须等到服务端所有的报文都发送完毕了才能发FIN,因此先发一个ACK表示已经收到客户端的FIN,延迟一段时间才发FIN这就造成了四次挥手
为什么是三次握手,两次或四次行不行?
为什么不是两次握手:
如果是两次握手的话:客户端向服务端发送请求那么服务器会直接进行实例化操作,如果中间有异常会消耗资源
为什么不是四次握手
三次握手就可以满足需求了,四次可以是可以只是没有必要了