TCP三次握手
TCP三次握手
两个核心概念 SYN包:SYN=1,表示请求建立连接(相当于说“我要和你通话!”)。 ACK包:ACK=1,表示确认收到数据(相当于说“我收到了!”)。 三次握手 第一次握手:客户端发一个 SYN=1 的包给服务端 目的:“我要和你建立连接!” 第二次握手:服务端发送SYN+ACK包给客户端 目的: ACK=1:“我收到你的请求了!” SYN=1:“我也要和你建立连接!” 第三次握手:客户端发一个 ACK=1 的包给服务端 目的:“我收到你的回应了,连接正式建立!” 一句话总结流程 客户端:SYN(我要连接) → 服务端:ACK+SYN(同意+我也要连接) → 客户端:ACK(同意) → 开始传数据!
为什么TCP要三次握手,两次却不可以
- 两次握手时,服务端发送完SYN-ACK后,无法确认客户端是否真的收到了。如果这个包丢失,服务端会以为连接已建立(开始浪费资源),但客户端实际没收到,导致服务端空等。三次握手的最后一次ACK就是让服务端明确知道:“客户端已准备好,双方可以可靠通信了。
核心问题(两次握手的致命缺陷): 无法验证客户端的接收能力 服务端发送 SYN+ACK 后,若客户端未返回 ACK,服务端无法确定客户端是否能正常接收数据,可能建立“半开连接”(服务端以为连接成功,客户端实际未建立)。 无法抵抗网络丢包和延迟干扰 若服务端的 SYN+ACK 丢失,客户端不会发送数据,但服务端会一直等待,导致资源被长期占用。