TCP 的三次握手和四次挥手是为了可靠地建立和终止连接而设计的机制,其核心目的是确保通信双方能够同步状态并避免资源浪费。以下是具体原因:
一、三次握手(建立连接)
三次握手过程:SYN
→ SYN-ACK
→ ACK
目的:确保双方发送和接收能力正常,并协商初始序列号(ISN)。 为什么需要三次?
-
防止历史连接的误建立: 如果客户端发送的旧
SYN
(因网络延迟滞留)到达服务器,服务器会响应SYN-ACK
。通过第三次握手,客户端可以判断这是否是历史连接,并发送RST
终止,避免服务器浪费资源维护无效连接。 -
避免资源浪费: 如果只有两次握手,服务器在发送
SYN-ACK
后即认为连接建立。若客户端的ACK
丢失,服务器会一直等待数据,导致资源被占用。三次握手确保双方都确认对方的收发能力,只有客户端最后发送ACK
后,双方才正式建立连接。 -
同步初始序列号(ISN): 序列号是TCP可靠传输的关键。三次握手确保双方初始序列号被正确同步,避免数据错乱。
二、四次挥手(终止连接)
四次挥手过程:FIN
→ ACK
→ FIN
→ ACK
目的:确保双方数据完全传输完毕,并安全关闭连接。 为什么需要四次?
-
TCP是全双工协议: 通信双方可以独立发送和接收数据。一方发送
FIN
表示自己不再发送数据,但仍可以接收数据。因此,连接的关闭需要两个方向的独立终止。 -
处理未发送完的数据: 当一方发送
FIN
后,另一方可能还有数据需要发送。此时会先回复ACK
确认收到FIN
,继续发送剩余数据,最后再发送自己的FIN
。这导致FIN
和ACK
不能合并为一次(即四次挥手)。 -
TIME_WAIT状态的作用: 主动关闭方在发送最后一个
ACK
后进入TIME_WAIT
状态,等待2MSL(Maximum Segment Lifetime)。这是为了:-
确保对方收到最终的
ACK
(若丢失,对方会重传FIN
)。 -
防止旧连接的报文干扰新连接(如延迟的报文被新连接误接收)。
-
三、常见疑问
-
为什么不能三次挥手? 如果服务器收到客户端的
FIN
后,可以同时回复ACK
和自己的FIN
(合并为三次),但这要求服务器立即关闭,不能处理剩余数据。实际场景中,服务器可能需要时间处理数据后再关闭,因此通常需要四次。 -
是否存在三次挥手的情况? 如果服务器没有数据要发送,可能将
ACK
和FIN
合并为一次,变为三次挥手。但这是特例,协议设计需兼容最通用的情况。
总结
-
三次握手:解决信道不可靠和初始序列号同步问题,确保双方收发能力正常。
-
四次挥手:因TCP的全双工特性,需独立关闭两个方向的数据流,并处理未完成的数据传输。
这些机制共同保障了TCP连接的可靠性和有序性,是互联网通信的基石。