TCP建立连接为什么是三次握手,而不是两次或四次?

TCP建立连接为什么是三次握手,而不是两次或四次?

首先应该清楚一点:不论握手多少次都不能确认一条信道一定是“可靠”的,但通过3次握手可以至少确认它是“可用”的,再往上加握手次数不过是提高它是“可用”的这个结论的可信度。

也就是说任意次的握手都是“不可靠”的,握手成功只能说明握手时的通信是正常的,并不能保证握手后的通信是正常的。握手只能保证尽可能的可靠,而不可能保证绝对可靠。

1.那为什么不是两次握手?

是为了防止已失效的连接请求报文段突然又传送到了服务端,造成服务端资源的浪费。

这句话怎样理解?

在一次TCP连接中,客户端A向服务端B发送连接请求SYN报文段,假如这个报文段没有及时被服务端B接收,而是滞留在网络的某处,于是客户端A超时重传,再次发送请求连接并且顺利与服务端B建立了连接,交换数据后断开连接。

滞留在网络中的某处的陈旧报文就变成了失效的连接请求报文。

但如果这个失效的请求SYN报文段,现在又突然传送到了服务端B处,设想这时是使用两次握手而不是三次握手,服务端B就以为客户端A现在建立请求连接,于是服务端B发出确认,新的连接就建立了,服务端B分配资源,等待客户端A传送数据,但客户端A并没有想要建立TCP连接,不会理会服务端B发送的应答,也不会向服务端B传送数据,于是服务端B就白白等待,空耗资源。

使用三次握手可以避免这个情况。服务端B收到客户端A的失效的陈旧SYN报文段,向客户端A发送SYN报文段,选择自己的序号seq=y,确认收到客户端A的SYN报文段,确认号ack=x+1。第三次握手客户端A收到B的SYN报文段后,从确认号就可得知不应理睬这个SYN报文段(因为A现在并没有发送seq=x的报文段)。

这时,客户端A会发送复位报文段,这个复位报文段中,RST=1,ACK=1,确认号ack=y+1。

服务端B收到A的复位报文,就知道不建立TCP连接,不会分配资源等待A发送数据。

TCP建立连接为什么是三次握手,而不是两次或四次?

2.为什么不是四次握手?

既然两次握手不可以,那四次握手,五次握手呢?

因为三次握手已经能说明握手时的通信是正常的,四次握手、五次握手就显得浪费了。