TCP采用三次握手是为了确保双方的通信能够正常建立,并且在连接的过程中能够正确地同步状态。两次握手存在一些潜在的问题,导致采用三次握手是更为安全可靠的做法。
为什么需要三次握手?
- 防止已失效的连接请求报文段被服务器接受。 假设客户端发送了一个建立连接的请求,但因为某些原因导致了超时,没有到达服务器。如果只是两次握手,服务器将会以为客户端确实要建立连接,但实际上客户端并没有这个意图。这就可能导致服务器浪费资源去处理一个无效的连接请求。
- 防止网络延迟导致的旧连接请求被误认为是新连接请求。 如果有一个连接请求A到达服务器,但由于网络延迟,服务器没有及时收到。后来客户端又发起一个新的连接请求B,这次服务器正常收到。如果只是两次握手,服务器会认为B是对A的重发,而实际上它们可能是完全不同的连接请求。
- 保证双方都能同步初始序列号。 在三次握手中,客户端和服务器都能够交换彼此的信息,包括初始序列号。这样在连接建立后,双方就能够正确同步序列号,保证后续的数据传输正确有序。
两次握手的问题
在两次握手的情况下,如果只有客户端向服务器发送建立连接的请求,而服务器没有办法告诉客户端连接已经建立(因为第二次握手没有),那么客户端就无法确定连接是否真的建立成功。这可能导致一些问题,例如:
- 客户端一直在等待服务器的确认,而服务器已经成功接收到了请求,但无法告诉客户端。
- 如果客户端没有收到服务器的响应,它会一直尝试重新发送请求,从而可能导致重复建立连接。
因此,为了解决上述问题,引入了三次握手机制,确保了双方都能够正确地确认连接的建立。