在TCP(Transmission Control Protocol,传输控制协议)的三次握手和四次断开是其建立连接和关闭连接的重要机制。
三次握手是在建立连接时进行的,顺序依次完成。而四次断开是在关闭连接时发生的,只有在连接已经建立并完成数据传输等操作后,才会按照特定的四次断开顺序来关闭连接。
也就是说,三次握手全部完成,连接建立成功,之后才会在需要关闭连接时按照四次断开的顺序来操作。
三次握手:
第一次握手:
客户端向服务器发送一个同步包,其中包含客户端选择的初始序列号。此时客户端进入 SYN_SENT(同步 发送)状态。
第二次握手:
服务器收到客户端的 同步包后,向客户端发送一个同步确认包(SYN/ACK),其中包含服务器选择的初始序列号,以及对客户端同步包的确认(ACK)。此时服务器进入 SYN_RECV (同步 接收)状态。
第三次握手:
客户端收到服务器的 同步确认包 后,向服务器发送一个 确认包 ,确认服务器的 同步包。此时客户端和服务器进入 ESTABLISHED(确立) 状态,连接建立成功。
三次握手的主要目的是:
- 确认双方的接收和发送能力是否正常。
- 协商初始序列号,为后续的数据传输做准备。
四次断开:
1. 第一次断开:
客户端向服务器发送一个 结束包(FIN),表示客户端没有数据要发送了,想要关闭连接。此时客户端进入 FIN_WAIT_1(等待结束1) 状态。
2. 第二次断开:
服务器收到客户端的 FIN 包后,向客户端发送一个 确认包,表示已经收到客户端的关闭请求。此时服务器进入 CLOSE_WAIT(等待关闭) 状态,客户端进入 FIN_WAIT_2 (等待结束2)状态。
3. 第三次断开:
服务器处理完剩余的数据后,向客户端发送一个 结束包,表示服务器也没有数据要发送了,想要关闭连接。此时服务器进入 LAST_ACK(最后确认) 状态。
4. 第四次断开:客户端收到服务器的 结束包后,向服务器发送一个 确认包,表示已经收到服务器的关闭请求。此时客户端进入 TIME_WAIT(时间等待) 状态,经过一段时间后进入 CLOSED(关闭) 状态,服务器收到客户端的 ACK 包后直接进入 CLOSED 状态,连接关闭。
四次断开的原因是:
- 由于 TCP 是全双工的,即双方可以同时进行数据的发送和接收,所以关闭连接时需要分别关闭发送和接收通道。
- 确保数据能够完整传输和接收,避免出现数据丢失或混乱的情况。
在 TIME_WAIT 状态中,客户端会等待一段时间,这是为了确保服务器能够收到最后一个 确认包,如果服务器没有收到,会重发 结束包,客户端在这段时间内还能够进行处理。