1. 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
  2. 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
  3. 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

img

为什么要进行三次握手呢?

第三次握手是为了防止失效的连接请求到达服器,让服务器错误打开连接。

客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。

客户端等待一个超时重传时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,如果不进行三次握手,那么服务器就会打开两个连接。

如果有第三次握手,客户端会忽略服务器之后发送的对滞留连接请求的连接确认,不进行第三次握手,因此就不会再次打开连接。

如果此时变成两次握手行不行?

举个打电话的例子,比如:

第一次握手:A给B打电话说,你可以听到我说话吗?

第二次握手:B收到了A的信息,然后对A说:我可以听得到你说话啊,你能听得到我说话吗?

第三次握手:A收到了B的信息,然后说可以的,我要给你发信息啦!

**结论:**在三次握手之后,A和B都能确定这么一件事:我能听到你,你也能听到我。

这样,就可以开始正常通信了。如果是两次,那将无法确定。