TCP三次握手
为了保证客户端与服务器端能形成可靠连接,TCP协议建立连接时必须要进行三次会话,也叫TCP三次握手,进行三次握手的目的是为了确认双方的接收能力和发送能力是否正常。
- 第一次握手: 客户端向服务器端发送报文
证明客户端的发送能力正常 - 第二次握手:服务器端接收到报文并向客户端发送报文
证明服务器端的接收能力、发送能力正常 - 第三次握手:客户端向服务器发送报文
证明客户端的接收能力正常 - 三次握手的主要原因:防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误
TCP四次挥手
建立TCP连接需要三次握手,终止TCP连接需要四次挥手
第一次挥手 客户端发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态
第二次挥手 服务器端接收到连接释放报文后,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT 关闭等待状态
第三次挥手 客户端接收到服务器端的确认请求后,客户端就会进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文,服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
- 标记位为FIN,ACK,表示“已经准备好释放连接了”。注意:这里的ACK并不是确认收到服务器端报文的确认报文。
- 序号为Seq=W;
- 确认号为Ack=U+1;表示是在收到客户端报文的基础上,将其序号Seq值加1作为本段报文确认号Ack的值。
第四次挥手 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态,但此时TCP连接还未终止,必须要经过2MSL后(最长报文寿命),当客户端撤销相应的TCB后,客户端才会进入CLOSED关闭状态,服务器端接收到确认报文后,会立即进入CLOSED关闭状态,到这里TCP连接就断开了,四次挥手完成
三次握手因为建立连接需要客户端和服务器端发送的接受数据包,比二次握手只需要服务器端的接受数据包更加严谨可靠,不容易因网络延误等原因造成网络资源的浪费。
四次挥手中的第二次和第三次挥手之间可能需要发送数据,所以不一定能合并成一步,但如果没有数据需要发送其实是可以合并的。