TCP 协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保 证连接的可靠。
三次握手和四次握手描述(来自尚硅谷)
1、客户端会随机一个初始序列号 seq=x,设置 SYN=1 ,表示这是 SYN 握手报文。然后就可以把这个 SYN 报文发送给服务端了,表示 向服务端发起连接,之后客户端处于同步已发送状态。 2、服务端收到客户端的 SYN 报文后,也随机一个初始序列号 (seq=y),设置 ack=x+1,表示收到了客户端的 x 之前的数据,希望客 户端下次发送的数据从 x+1 开始。 设置 SYN=1 和 ACK=1。表示这 是一个 SYN 握手和 ACK 确认应答报文。最后把该报文发给客户端,该 报文也不包含应用层数据,之后服务端处于同步已接收状态。
3、客户端收到服务端报文后,还要向服务端回应最后一个应答报文, 将 ACK 置为 1 ,表示这是一个应答报文 ack=y+1 ,表示收到了服务 器的 y 之前的数据,希望服务器下次发送的数据从 y+1 开始。 最后 把报文发送给服务端,这次报文可以携带数据,之后客户端处于 连接 已建立 状态。服务器收到客户端的应答报文后,也进入连接已建立状 态。
完成三次握手,连接建立后,客户端和服务器就可以开始进行数据传输了。由 于这种面向连接的特性,TCP 协议可以保证传输数据的安全,所以应用十分广 泛,例如下载文件、浏览网页等。
TCP 协议中,在发送数据结束后,释放连接时需要经过四次挥手。
1、客户端打算断开连接,向服务器发送 FIN 报文(FIN 标记位被设置为 1,1 表示为 FIN,0 表示不是),FIN 报文中会指定一个序列号,之后 客户端进入 FINWAIT1 状态。也就是客户端发出连接释放报文段(FIN 报文),指定序列号 seq = u,主动关闭 TCP 连接,等待服务器的确 认。
2、服务器收到连接释放报文段(FIN 报文)后,就向客户端发送 ACK 应 答报文,以客户端的 FIN 报文的序列号 seq+1 作为 ACK 应答报文段 的确认序列号 ack = seq+1 = u + 1。接着服务器进入 CLOSEWAIT(等 待关闭)状态,此时的 TCP 处于半关闭状态(下面会说什么是半关闭状 态),客户端到服务器的连接释放。客户端收到来自服务器的 ACK 应答 报文段后,进入 FINWAIT_2 状态。
3、服务器也打算断开连接,向客户端发送连接释放(FIN)报文段,之后 服务器进入 LASK_ACK(最后确认)状态,等待客户端的确认。服务器的 连接释放(FIN)报文段的 FIN=1,ACK=1,序列号 seq=m,确认序列号 ack=u+1。
4、客户端收到来自服务器的连接释放(FIN)报文段后,会向服务器发送 一个 ACK 应答报文段,以连接释放(FIN)报文段的确认序号 ack 作为 ACK 应答报文段的序列号 seq,以连接释放(FIN)报文段的序列号 seq+1 作为确认序号 ack。
之后客户端进入 TIMEWAIT(时间等待)状态,服务器收到 ACK 应答报文 段后,服务器就进入 CLOSE(关闭)状态,到此服务器的连接已经完成 关闭。客户端处于 TIMEWAIT 状态时,此时的 TCP 还未释放掉,需要 等待 2MSL 后,客户端才进入 CLOSE 状态。
总体来说,三次握手和四次握手是TCP连接的建立和关闭的标准过程,确保通信双方的状态同步和数据的可靠传输。