TCP连接三次握手的过程,为什么是三次,可以是两次或者更多吗?

5 分钟阅读 745 字 + 558 词
  1. 首先假设客户端进行连接, 发送一个SYN报文到服务端 ,请求建立连接, 客户端进入SYN_SENT状态
  2. 服务端收到SYN报文后呢,会 从LISTEN状态转变为SYN_RCVD状态 。并会 发送一个ACK-SYN报文作为回应 ,此时这个连接是一个 半连接状态,服务端会将它存到半连接队列中。
  3. 客户端收到这个报文后,会 返回一个ACK报文作为回应 ,然后客户端进入了ESTABLISHED状态,而服务端收到ACK后也会进入ESTABLISHED状态,并且之后就可以 利用accept方法将全连接队列中的连接拿出并生成对应的连接fd了
为什么要三次握手呢?
因为 只有三次握手才可以确认双方的接收能力和发送能力 第一次握手保证了客户端到服务端的通道是开放的 第二次握手是保证了服务端到客户端的通道是开放的 第三次握手保证了客户端能够接收到服务端的确认 ,这样才可以确保双方的通道是可用的。
如果只使用两次握手的话,服务端没法确认客户端的接收能力是否正常 ,客户端可能已经连接关闭了,但是服务端接收到了之前的连接报文,然后建立了连接,这就导致了资源的浪费。
参考答案:
(1) 三次握手的过程
  1. 第一次握手 :客户端向服务器发送一个 SYN (同步序列编号)报文,请求建立连接,客户端进入 SYN_SENT 状态。
  2. 第二次握手 :服务器收到 SYN 报文后,如果同意建立连接,则会发送一个 SYN-ACK (同步确认)报文作为响应,同时进入 SYN_RCVD 状态。
  3. 第三次握手 :客户端收到服务器的 SYN-ACK 报文后,会发送一个 ACK (确认)报文作为最终响应,之后客户端和服务器都进入 ESTABLISHED 状态,连接建立成功。
(2)为什么需要三次握手
通过三次握手,客户端和服务器都能够确认对方的接收和发送能力。 第一次握手确认了客户端到服务器的通道是开放的;第二次握手确认了服务器到客户端的通道是开放的;第三次握手则确认了客户端能够接收到服务器的确认,从而确保了双方的通道都是可用的。
而如果仅使用两次握手, 服务器可能无法确定客户端的接收能力是否正常,比如客户端可能已经关闭了连接,但之前发送的连接请求报文在网络上延迟到达了服务器,服务器就会主动去建立一个连接,但是客户端接收不到,导致资源的浪费 。而四次握手可以优化为三次。
image-20240920102706907