(1) 三次握手的过程
- 第一次握手:客户端向服务器发送一个包含
SYN
(同步序列编号)和初始序列号(ISN)的报文,请求建立连接,客户端进入SYN_SENT
(同步已发送)状态。 - 第二次握手:服务器收到客户端的SYN段后,如果同意建立连接,会发送一个带有SYN和ACK标志位的TCP段作为响应。服务器也会发送自己的初始序列号,并确认客户端的序列号,同时进入
SYN_RCVD
(同步已接收)状态。 - 第三次握手:客户端收到服务器的SYN-ACK段后,会发送一个带有ACK标志位的TCP段来确认服务器的序列号,之后客户端和服务器都进入
ESTABLISHED
(连接已建立)状态,连接建立成功。
(2)为什么需要三次握手
通过三次握手,客户端和服务器都能够确认对方的接收和发送能力。第一次握手确认了客户端到服务器的通道是开放的;第二次握手确认了服务器到客户端的通道是开放的;第三次握手则确认了客户端接收到服务器的确认,从而确保了双方的通道都是可用的。
在两次握手的情况下,如果客户端发送了一个连接请求(SYN),但因为网络延迟或其他原因,这个请求没有立即到达服务器。客户端可能会因为超时而重新发送相同的连接请求,导致服务器收到多个相同的连接请求。如果服务器在收到重复的连接请求后都尝试建立连接,这将导致服务器资源的浪费,并且可能会创建多个不必要的连接实例,这些实例之间可能会相互干扰,导致数据传输错误。
三次握手客户端确实可以通过上下文信息来避免服务器创建多个连接