TCP协议的三次握手和四次挥手
1.1 三次握手
三次握手(three-way handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息。
- 客户端向服务器:SYN=1,seq=m;客户端状态为:SYN_SENT
- 服务器向客户端:SYN=1,ACK=1,seq=n,ack=m+1;服务器状态为:SYN_RCVD
- 客户端向服务器:ACK=1,seq=m+1,ack=n+1;客户端状态为:ESTABLISHED
第三次握手的意义是:若没有第三次握手,当客户端没有收到服务器端确认时会再次发送一个连接请求,导致服务器和一个客户端之间存在多条连接,导致资源浪费。
1.2 四次挥手
客户端和服务器均可主动发起挥手动作。
- 客户端向服务器端:FIN=1,seq=m,客户端状态为:FIN_WAIT_1
- 服务器端向客户端:ACK=1,seq=n,ack=m+1,服务器状态为:CLOSE_WAIT,客户端状态为:FIN_WAIT_2
- 服务器端向客户端:FIN=1,ACK=1,seq=k,ack=m+1,服务器状态为:LAST_ACK,客户端状态为:TIME_WAIT
- 客户端向服务器端:ACK=1,seq=m+1,ack=k+1,进入CLOSED状态
- 为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
为了确保服务器端能收到客户端的最后一个ACK信号!若客户端不等待2MSL直接关闭,当服务器端没有收到最后一个ACK时,会再次重传FIN包,此时客户端已经关闭,会导致连接没有完全断开。
- 为什么连接时三次握手,关闭却要四次?
因为TCP是全双工的,每个方向的连接断开都需要发送和应答两次挥手,所以需要四次。
1.3 TCP状态转换图