第一次握手:客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SEND 状态,等待服务器确认;
第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一个 SYN 包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP 连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开 TCP 连接的请求,断开过程需要经过“四次握手”(过程就不细写了,就是服务器和客户端交互,最终确定断开)
image.png四次挥手
CLIENT SERVER
FIN_WAIT ----------FIN M------------>
<---------ACK=1,ack=M+1------CLOSE_WAIT
TIME_WAIT<--------------FIN N----------LASK_ACK
---------ACK=1,ack=K+1----->CLOSED
问题一:为什么挥手需要四次呢?为什么不能将ACK和FIN报文一起发送?
当服务器收到FIN报文时候,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端“你发的FIN我收到了”。只有等到服务端所有的报文都发送完了,才能发FIN报文,所以要讲ACK和FIN分开发送,这就导致需要四次挥手
网友评论