TCP三次握手

最近在看《图解HTTP》这本书,对于其中的一点我很疑惑,TCP为什么要握三次手,两次不行吗?两次不就可以建立连接了吗?

介绍:

 

 

 

TCP三次握手的流程就如上图所示:

首先,我们明确下主动发送请求的就叫客户端,像浏览器、APP等,而响应请求的就叫服务端。

客户端首先发送一个带有SYN(synchronize建立联机)标志的数据包给服务端。服务端接受到了后,返回一个带有SYN/ACK(acknowledgement确认)标志的数据包以示确认传达信息。最后,客户端再传回一个带有ACK标志的数据包,代表‘握手’结束。

 

原因一:

接下来我们分析下为什么要‘握’三次手:简而言之TCP要在不可靠的通道上建立可靠的连接

第一次握手:

可得:客户端的发送能力正常、服务端的接收能力正常。服务端此时可以得出自己的接收能力正常,客户端的发送能力正常,但是客户端并不知道,所以需要服务端给它一个爱的肯定,发送一个带有SYN/ACK标志的数据包给客服端。

第二次握手:

可得:客户端收到了服务端带有SYN/ACK标志的数据包,客户端可以得知自己的发送和接收数据包的能力正常,还有服务端的接收和发送都是正常的。但是,服务端并不清楚它的发送能力是正常的,服务端需要客户端给它来个爱的反馈。那还说什么呢,客户端赶紧得发送ACK数据包来帮助服务端确认自己的发送能力。

第三次握手:

服务端得到了客户端带有ACK标志的数据包,说明它的的发送和接收功能都是正常的。

那么:你正常,我正常,TCP连接就正常,我们开始数据传输吧~

 

原因二

其实在第二次握手时客户端和服务端就已经建立连接了,之所以还要再握一次手是因为要防止已经失效的请求报文再次传到服务器引起错误。

我们假设这样一个场景如果客户端和服务端只进行两次握手,客户端给服务端第一次发送了SYN包,但是因为网络不稳定等等原因,这个SYN并没有传到服务器。此时按照TCP协议,客户端会给服务端再发一个SYN包,服务端收到了,建立连接后,第一次发的SYN包终于姗姗来迟了。此时服务端会根据这个SYN包,再次尝试和客户端建立第二个连接,就会给客户端发送SYN/ACK包,完成第二次握手,等待客户端给它发ACK包。这时,客户端和服务端就出现了状态上的区别,客户端认为我只和你建立了一个连接,而服务端却认为我们建立了两个连接。如果进行三次握手,那么服务端如果收到了ACK包,自然不会认为第二次的连接建立成功了。

 

问题少年来了:如果发送过程中断了呢?

答:TCP协议会再次以相同的顺序发送相同的数据包。

问题少年:TCP三次握手能不能说简单直白点?

答:可以这么理解

A: 喂喂喂?听得到我说话吗?

B:听得到,你听得到我说话吗?

A:听得到

 

关于TCP四次挥手的内容可以看我的另外一篇博客《TCP四次挥手》

 

posted @ 2020-05-13 20:51  Sofiaღ  阅读(180)  评论(0编辑  收藏  举报