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 丢失,客户端不会发送数据,但服务端会一直等待,导致资源被长期占用。
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |