TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层协议,它在互联网中广泛应用于数据传输。TCP确保了数据的可靠传输,主要通过三次握手建立连接和四次挥手关闭连接来实现。
三次握手(Three-Way Handshake)
三次握手是在客户端和服务器之间建立TCP连接时所采用的步骤,具体过程如下:
-
客户端发送SYN(同步)报文: 客户端向服务器发送一个SYN报文,其中包含客户端的初始序列号(ISN),并设置SYN标志位。
-
服务器响应SYN: 服务器接收到客户端的SYN报文后,会发送一个SYN-ACK报文作为响应,其中包含了确认号(ACK),确认客户端的初始序列号,同时也发送自己的初始序列号(ISN),并设置SYN和ACK标志位。
-
客户端确认SYN-ACK: 客户端接收到服务器的SYN-ACK报文后,会发送一个ACK报文作为确认,确认服务器的初始序列号,同时也发送自己的确认号(ACK),表示已经收到了服务器的响应。
经过这三次握手,客户端和服务器建立了连接,可以开始进行数据传输。
四次挥手(Four-Way Handshake)
四次挥手是在客户端和服务器之间关闭TCP连接时所采用的步骤,具体过程如下:
-
客户端发送FIN报文: 当客户端需要关闭连接时,会发送一个FIN报文,表示客户端不再发送数据。
-
服务器响应ACK: 服务器收到客户端的FIN报文后,会发送一个ACK报文作为确认,表示已经收到了客户端的关闭请求。
-
服务器发送FIN报文: 服务器在关闭连接前,可能还有未发送完的数据需要传输完毕,传输完成后,服务器会发送一个FIN报文给客户端,表示服务器也不再发送数据。
-
客户端响应ACK: 客户端收到服务器的FIN报文后,会发送一个ACK报文作为确认,表示已经收到了服务器的关闭请求,并且客户端也不再发送数据。
总结
- 客户端发送第一次挥手,之后由
ESTABLISHED
状态转为FIN_WAIT1
状态 - 服务器收到客户端的第一次挥手之后,发送第二次挥手给服务器,服务器进入
CLOSE_WAIT
状态,等待服务器自身的SOCKET
关闭等处理 - 客户端收到服务器的第二次挥手,进入
FIN_WAIT2
状态,等待服务器关闭 - 服务器发送第三次挥手,然后进入
LAST_ACK
状态 - 客户端收到第三次挥手,发送第四次挥手,客户端进入
TIME_WAIT
状态; - 服务器收到第四次挥手,进入
CLOSED
状态,客户端等待 2MSL 后,进入CLOSED
状态
经过这四次挥手,客户端和服务器完成了关闭连接的过程,释放了资源,结束了通信。