TCP(传输控制协议)连接的建立和断开采用三次握手(Three-Way Handshake)和四次挥手(Four-Way Handshake)的机制,主要是为了防止旧的重复连接初始化造成混乱。
三次握手过程如下:
1. 客户端发送一个SYN报文到服务器端,请求建立连接。这时客户端处于SYN_SENT状态。
2. 服务器端回应一个SYN-ACK报文给客户端,确认收到请求。这时服务器处于SYN_RCVD状态。
3. 客户端再发送一个ACK报文给服务器端,表示客户端已准备就绪。此时客户端和服务器的连接建立成功,进入ESTABLISHED状态。
之所以采用三次握手,原因如下:
- 可靠性:通过三次握手过程,客户端和服务器之间能够确保彼此收到了对方的报文。如果只进行两次握手,那么服务器将无法确认客户端是否收到了自己的确认信息,因此无法确保连接的成功建立。
- 防止重复连接:三次握手能够避免过期的连接请求报文突然到达服务器,导致错误地建立两次连接。例如,客户端因某种原因未收到服务器端的SYN-ACK报文,于是重新发送了SYN报文。若采用二次握手,这个过期的SYN报文会直接建立连接,导致多个重复连接,浪费资源。而在三次握手中,服务器收到重复的SYN报文后需要等待客户端发送ACK报文,而客户端不会发送ACK报文,因此过期的SYN报文不会建立连接。
四次挥手过程如下:
1. 某个端点(通常是客户端)完成数据传输任务后,发送一个FIN报文,表示希望终止连接。此时该端点进入FIN_WAIT_1状态。
2. 另一个端点(通常是服务器)收到FIN报文后,发送一个ACK报文给对方,表示已经收到并理解了对方的关闭请求。此时发送FIN报文的端点进入FIN_WAIT_2状态。
3. 之后,当另一个端点(服务器)也完成它的数据传输任务后,发送一个FIN报文表示同样希望关闭连接。此时该端点进入LAST_ACK状态。
4. 发送FIN报文的端点(客户端)收到最后的FIN报文后,再发送一个ACK报文给另一个端点(服务器),表示已经收到并理解了对方的关闭请求。此时发送FIN报文的端点进入TIME_WAIT状态,经过一段时间后自动进入CLOSED状态,表示连接关闭。另一个端点收到ACK报文后也进入CLOSED状态,连接关闭。
之所以采用四次挥手,原因有:
- 全双工:TCP连接是全双工的,即双方可以同时进行数据传输。因此,需要分别终止每个方向上的数据传输。
- 优雅地关闭连接:通过四次挥手过程,双方都能确保在对方不再发送数据后,才真正关闭连接。这有助于避免数据丢失或损坏。