Skip to content

TCP链接为什么会采用三次握手,而不是两次或者四次呢?

参考答案:

建立连接的过程是利用客户服务器模式,假设主机A为客户端,主机B为服务器端。

采用三次握手是为了防止失效的连接请求报文段突然又传送到主机B,因而产生错误。

失效的连接请求报文段是指:主机A发出的连接请求没有收到主机B的确认,于是经过一段时间后,主机A又重新向主机B发送连接请求,且建立成功,顺序完成数据传输。

考虑这样一种特殊情况,主机A第一次发送的连接请求并没有丢失,而是因为网络节点导致延迟达到主机B,主机B以为是主机A又发起的新连接,于是主机B同意连接,并向主机A发回确认,但是此时主机A根本不会理会,主机B就一直在等待主机A发送数据,导致主机B的资源浪费。

采用两次握手不行,原因就是上面说的失效的连接请求的特殊情况。

而在三次握手中,client和server都有一个发syn和收ack的过程,双方都是发后能收,表明通信则准备工作OK。

为什么不是四次握手呢?

因为通信不可能100%可靠,而上面的三次握手已经做好了通信的准备工作,再增加握手,并不能显著提高可靠性,而且也没有必要。

题目要点:

建立TCP连接的过程采用三次握手是为了确保通信双方都准备好进行数据传输,并防止失效的连接请求报文段对网络造成影响。

三次握手的过程如下:

  1. 第一次握手:客户端发送一个SYN(同步序列编号)报文到服务器,并进入SYN_SENT状态,等待服务器确认。
  2. 第二次握手:服务器收到SYN报文,必须确认客户的SYN(即发送一个SYN+ACK报文),同时自己也发送一个SYN报文,即SYN+ACK报文,此时服务器进入SYN_RECV状态。
  3. 第三次握手:客户端收到服务器的SYN+ACK报文后,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

这种三次握手的方式可以有效防止失效的连接请求报文段在网络中滞留,造成资源浪费。如果采用两次握手,可能会出现上述失效的连接请求报文段突然到达服务器的情况,导致服务器错误地认为客户端又发起了一个新的连接请求。

而采用四次握手并不是必须的,因为三次握手已经确保了双方都准备好进行通信,增加握手次数并不能显著提高通信的可靠性,反而可能增加额外的开销。因此,三次握手是建立TCP连接的可靠且高效的方式。