关于TCP协议三次握手的问题,在面试中值最为常见的知识点之一,真的是高频考点,得到了很多面试官的青睐,如果这个知识点没有掌握好,面试官要是问的更深入一点,我们往往会不知所措。

为什么建立连接要进行三次握手呢?

首先非常明确的是两次握手是最基本的。第一次握手,客户端发了个连接请求消息到服务器,服务器收到消息后知道自己与客户端是可以连接成功的,但此时客户端并不知道服务器是否已经接收到了它的请求,所以服务器端接收到消息后的应答,客户端得到服务器的反馈后,才确定自己与服务器端是可以连接上的,这就是第二次握手。

客户端只有确定了自己能和服务器端连接上才能开始发数据。所以两次握手肯定是最基本的。

看到这里,你或许会问,那为什么需要第三次握手呢?我们来看一下,假设一下如果没有第三次握手,而且两次握手后我们就认为连接成功了,那么会发生什么呢?第三次握手是为了防止已经失效的连接请求报文突然又传到了服务器,因而产生错误。

举个例子:

客户端发出去的第一个连接请求由于某些原因在网络节点中滞留了导致延迟,直到连接释放的某个时间点才能到达服务器,这是一个早已失效的报文,但是此时服务器仍然认为这个客户端寄哪里连接的请求的第一次握手,于是服务器回应了客户端,第二次握手

如果只有两次握手,那么到了这里,连接就建立了,但是此时客户端并没有任何数据要发送,而服务器还在傻傻的等候佳音,造成很大的资源浪费。所以需要第三次握手,只有客户端再次回应一下,就可以避免这种情况。

如果你觉得上面的阐述过于专业化,还有点萌萌的,不要紧,下面我们来个生活案例来阐述。

TCP三次握手好比在一个月黑风高的夜晚,你一个人在小区里散步,不远处看见小区里的一位漂亮妹子迎面而来,但是因为路灯有点暗不能100%确认,所以要通过招手的方式来确定对方是否认识自己。

你首先向妹子招手(syn),妹子看到你向自己招手后,像你点了点头挤出一个微笑(ack)。你看到妹子微笑后确认了妹子成功辨认出了自己(进入了estalished状态)。

但是妹子有点不好意思,向四周看了一看,有没有可能你是在看别人呢,她也需要确认一下。妹子也像你招了招手(syn),你看到妹子向自己招手后知道对方是在寻求自己的确认,于是也点了点头挤出了微笑(ack),妹子看到对方的微笑后确认了你就是再向自己打招呼(进入了estalished状态)。

于是两人加快步伐,走到了一起,彼此之间相互拥抱。

我们来回顾一下,这个过程总共有四个动作:
1.你招手
2.妹子点头微笑
3.妹子招手
4.你点头微笑

其中妹子连续进行了两个动作,先是点头微笑(回复对方),然后再次招手(寻求确认),实际上我们可以将这两个动作合成一个动作,招手的同时点头和微笑(syn+ack)。于是这四个动作就简化成了三个动作。
1.你招手
2.妹子点头微笑并招手
3.你点头微笑

这就是三次握手的本质,中间一次动作是两个动作的合并。通过这个案例,不知你对TCP三次握手,有没有进一步的理解。

握手完成后,开始TCP数据传输

TCP 数据传输就是两个人隔空交流,有一定的距离,需要对方反复确认听见了自己的话。

你喊了一句话(data),妹子听见了之后要向你回复自己听见了(ack)。如果你喊了一句,半天没听到妹子回复,你会很低落,好比谈恋爱的时候,你满腔热情,而妹子忽冷忽热,所以你锲而不舍,一次不行,就两次,两次不行就三次,这就是tcp重传。

也有可能是妹子知道你的本意了,但是妹子有点害羞,迟迟没有回复亦或是妹子回复了你没收到,以至于你没收到妹子的回复。你不能判断究竟到底妹子喜不喜欢你,对你有没有好感,没关系,男人嘛?要主动点,重传一下就好。

既然会重传,妹子就有可能同一句话听见了两次,这就是去重。对于重传和去重这两项工作操作系统的网络内核模块都已经帮我们处理好了,我们不用理会。