TCP为什么三次握手,而不是两次

三次握手

TCP是面向连接的,发送数据前,都需要先在通信双方建立连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接通过三次握手进行初始化。
三次握手的目的是同步连接双方的***和确认号并交换TCP窗口大小信息。
TCP为什么三次握手,而不是两次

第一次握手:建立连接。

客户端发送连接请求报文段,将SYN位,置为1;将sequence number,置为x;然后,客户端进入SYN_SEND状态,等待服务器确认。

第二次握手:服务器收到SYN报文段。

服务端收到客户端的SYN报文段,需要对SYN报文段进行确认,设置acknowledgment number为x+1(sequence number+1);同时,发送SYN请求信息,将SYN位,置为1;将sequence number,置为y;服务端将上述信息放到一个报文段(SYN+ACK报文段)中,一起发送到客户端,此时服务端进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK报文段。

将acknowledgment number设置为y+1,向服务端发送ACK报文段。这个报文段发送完毕后,客户端和服务端都进入ESTABLISHED状态,完成TCP三次握手。

为什么要三次握手,而不是两次

为了防止已经失效的连接请求报文段突然又传送到服务端,导致错误发生。

“已经失效的连接请求报文段”的产生

客户端发出一个连接请求报文段,但由于在某个网络结点长时间滞留,导致延误到了连接释放后才到达服务端。

“两次握手”的影响

本来这是一个早已失效的报文段,但是服务端收到后,仍然会认为这是客户端发送的新的连接请求。于是服务端向客户端发回确认报文段,同意建立连接。如果使用的是“两次握手”,那么只要服务端发回确认,新的请求就建立了。
由于客户端并没有发出新的建立连接的请求,所以并不会理睬服务端,也不会向服务端发送数据,而服务端却会一直等待客户端发送数据,这样一来,就造成了服务端资源浪费。

三次握手的高明

幸运的是,采用“三次握手”的情况下,只要客户端不理睬服务端的确认,建立连接就会因为在第三次握手时失败而不会建立连接。避免造成造成服务端资源的浪费。