为什么TCP是三次握手?而不是两次或四次?

TCP连接建立的条件

我们这里从TCP连接建立的前提入手。TCP连接建立的前提,是通信的双方都要知道本方和对方的发送和接收功能,都是正常的。也就是在TCP连接建立之前,有以下八个待确认项。

服务端发送 服务端接收 客户端发送 客户端接收
服务端
客户端
图例:○:待确认,√:已确认

三次握手

第一次握手

客户端向服务端发送连接请求报文段。该报文段的头部中SYN=1,ACK=0,seq=x。
服务端接收到报文后,可以确认客户端的发送功能,服务端的接收功能,都是正常的。

服务端发送 服务端接收 客户端发送 客户端接收
服务端
客户端

第二次握手

服务端收到连接请求报文段后,如果同意连接,则会发送一个应答:SYN=1,ACK=1,seq=y,ack=x+1。
客户端接收到第二次握手报文后,可以确认服务端的发送功能,客户端的接收功能是正常的。不过,此时服务端并不知道自己的发送功能,客户端的接收功能是否正常。

服务端发送 服务端接收 客户端发送 客户端接收
服务端
客户端

第三次握手

当客户端收到连接同意的应答后,还要向服务端发送一个确认报文段,表示:服务端发来的连接同意应答已经成功收到。该报文段的头部为:ACK=1,seq=x+1,ack=y+1
此时,服务端就可以确认自己的发送功能,客户端的接收功能是正常的。

服务端发送 服务端接收 客户端发送 客户端接收
服务端
客户端

至此,八个确认项都确认完成。服务端和客户端就可以开始愉快地通信了。