TCP为什么需要三次握手,两次不行吗?
TCP三次握手的大至流程
- 第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
- 第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
- 第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。
TCP三次握手的目的
- 确认双方收发能力:通过三次握手,客户端和服务器能确认彼此的发送和接收功能正常。第一次握手,客户端发送 SYN 包给服务器,服务器可确认客户端有发送能力,自己有接收能力;第二次握手,服务器回复 SYN+ACK 包,客户端收到后能确认自己有接收能力,服务器有发送和接收能力;第三次握手,客户端发送 ACK 包,服务器收到后能确认自己有发送能力,客户端有接收能力 。
- 协商连接参数:在握手过程中,双方可以协商一些重要的连接参数。如获取对方报文发送的开始序号,以便后续对数据进行排序和确认;了解对方发送数据的缓冲区大小,避免发送数据过快导致对方缓冲区溢出;知晓能被接收的最大报文段长度(MSS),从而确定每次发送数据的合适大小;还能确认对方能否使用选择确认(SACK)、窗口缩放等选项,优化数据传输过程。
- 建立可靠连接:TCP 是面向连接的可靠传输协议,三次握手能在客户端和服务器之间建立起一条逻辑上的虚连接。只有在三次握手成功完成,双方进入 established(已建立连接)状态后,才开始正式的数据传输,从而为后续可靠的数据传输提供基础。
- 避免历史连接干扰:可防止旧的重复连接请求报文段在网络中滞留,影响新连接的建立。比如网络延迟导致之前的连接请求在新连接建立时才到达服务器,若没有三次握手机制,服务器可能会错误地认为是新的连接请求并建立连接,而三次握手能让双方对连接的有效性进行确认,避免这种情况发生。
假使我们使用了两次握手会导致:
- 连接建立不可靠:无法确保双方都能确认对方的接收能力。比如缺少第二次握手,客户端就不知道服务端是否收到连接请求,难以建立连接;缺少第三次握手,服务端无法确认客户端收到自己的应答,可能出现服务端认为连接已建立,但客户端实际未确认的情况,导致后续数据传输出现问题。
- 数据传输异常:由于不能确认双方的接收状态,可能会造成数据包丢失或重复接收,影响数据传输的准确性和完整性。
- 安全风险增加:减少握手次数可能会遭受攻击的风险增大,例如 SYN 洪泛攻击。攻击者可不断向服务器发送 SYN 包请求建立连接,但不完成后续握手步骤,耗尽服务器的连接资源,使其无法为正常用户提供服务。