首先简述一下 TPC连接建立的过程中,“三次握手” 的过程:


第一次:客户端像服务器端发送连接请求

第二次:服务器收到请求后,向客户端发送回应和连接请求

第三次:客户端收到后,对服务器的请求发送应答

wKiom1eTb3nAmFTHAAE4wfb_cAk708.png





其中总共发送了3条消息,因此该过程也称作“三次握手”

而这其中 3次握手 也是建立连接过程中需要发送的最少的消息数目


wKioL1eTb76T8wLLAAIjmL_sZbY842.png


这样来看:

1:

一次握手 仅仅由客户端发送一次请求,肯定是无法建立可靠的TCP连接的



2:

两次握手:服务器端 在发出消息后,并不知道自己能否发送,以及对面的客户端能否接收。也就是说,如果在两次握手的状态下建立连接,很可能建立的连接是从客户端到服务器端单向的,也就是客户端一直发消息,服务器端一直收消息。


此外,两次握手建立的连接,服务器端如果向客户端发消息,不能保证能正常发出,也不能保证客户端能正常收到。所以二次握手可能会造成这两种情况:(C表示客户端,S表示服务器端)

    1、建立连接的过程中,C向S发送请求,但由于某些原因,S并没有收到请求,于是C又发了一条请        求。

       S向C回应并发出请求。这时候认为连接建立,开始通信,结束后断开连接。这时,一开始那条

       S没有收的请求突然传到了S端,于是S对这条请求回应后,由于假定“二次握手”,这时候

       S认为自己和C建立连接了,但C不认为自己和S建立连接,这就导致已经失效的请求重新建立了错误的连接



    2、如果服务器发出并且客户端收不到消息,服务器会重复发送消息直到得到回应,浪费很多资源


3:

4、5、6、7次握手:由于3次握手已经能确保建立可靠的连接,所以不需要多次握手