TCP建立为什么是三次握手,而不是二次握手或者四次握手?

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 [1] 定义。位于传输层

三次握手过程:所谓的“三次握手”:为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所接收到的数据量而确认数据发送、接收完毕后何时撤消联系,并建立虚连接。

第一次
第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。
第三次
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
TCP建立为什么是三次握手,而不是二次握手或者四次握手?
那么问题来了,为什么不是二次握手或者四次握手?

如果是二次握手的话:
情况1:

  • 第一次握手
    客户端说:你是男的吗?
  • 第二次握手
    服务器端说:我是男的,你是吗?

导致结果就是:客户端知道服务器端有接收能力和发送能力,但是服务器端不知道客户端是否有接收能力。导致TCP不可靠。

情况2:

  • 第一次握手:
    客户端:你是男的吗? (阻塞)
    TCP建立为什么是三次握手,而不是二次握手或者四次握手?

超时重传

  • 第一次握手:
    客户端重新发送:你是男的吗?
  • 第二次握手
    服务器端说:我是男的,你是吗?
    --------------双方建立连接----------------
    TCP建立为什么是三次握手,而不是二次握手或者四次握手?

如果第一次握手阻塞之后又畅通了,服务器也返回二次握手了,但是客户端以及认为此次连接建立失败,而不理服务器了,但是服务器不知道,一直保持着等待状态。但是如果有第三次握手的话,服务器就知道客户端已经不理他了,他就不会等待客户端了(不会给客户端预留资源)
TCP建立为什么是三次握手,而不是二次握手或者四次握手?

所以:TCP的建立需要三次握手。

为什么不需要四次握手?
TCP建立为什么是三次握手,而不是二次握手或者四次握手?
从图中可知:服务器在第二次握手的时候已经确认建立连接了。第四次握手再次确认建立就多余了。