如何理解TCP的三次握手原理?

聶先森


如何理解TCP的三次握手原理?根据题意的题意,三次握手就是为了客户端与服务器之间建立连接。TCP协议中文名传输控制协议,是一系列规则的集合,使用时需要跟网际协议(IP)共同使用,是以互联网在计算机之间由信息单元形式发送数据。而IP协议是控制实际数据传输,TCP协议负责追踪在互联网上传送的信息所划分的各个数据单元,也就是所谓的"包"。TCP协议是面向连接协议,也就是说两端在传输信息时连接是一直处于建立和保持的状态。其负责把信息划分为IP协议能够处理的,也要把接受到的包拼成一个完整的信息。



TCP的三次握手原理

TCP会话初期所谓的三次握手,也就是对每次发送的数据量是如何跟踪进行协商,使数据端的发送和接受同步,而根据接收到的数据量来确定数据及确定数据发送,接受完毕后何时撤销联系并建立虚拟连接。TCP握手协议在TCP/IP协议中,TCP协议可提供可靠的连接服务,采用三次握手原理来建立一个可靠的连接。

第一次握手:建立连接时,客户端发送"包"至服务器,并进入SYN-SEND状态,来等服务器确认。

第二次握手:服务器接受到客服端发来的"包",此时确认客户的SYN包,同时也会为自己发送一个SYN包,即SYN+ACK包,这时候服务器就会进入SYN-RECV状态,准备给客户端发送SYN+ACK包。

第三次握手:客户端接受到服务器发送过来的SYN+ACK包后,就会向服务器发送确认包ACK,这个包发送完成,此时客户端和服务器都会进入ES-TABLISHED状态,表示三次握手已经完成。因此,三次握手完成,客户端和服务器就可以进行数据传输了。



现在不想连接了,TCP也要相互确认后才可断开连接,此过程采用的是四次挥手原理。

四次挥手

第一次挥手:断开连接时,客户端发送一个FIN=1的请求给服务器,要求断开,等待服务器确认。

第二次挥手:服务器接受到客户端发来的请求,发送ACK=1进行确认,确认信息后发送。

第三次挥手:服务器发送一个FIN=1的包至客户端,与源主机断开,等待源主机返回一个ACK=1的信息。

第四次挥手:客户端接受到服务器发送的FIN=1的包,确认后发送ACK=1的信息至服务器,这样四次挥手完成,完成客户端与服务器之间的连接。


TCP为什么需要三次握手而不是四次挥手呢?从三次挥手原理看,四次握手原理是在三次握手原理的第三次握手基础上,服务器把确认的ACK包再次发送至客户端。实际上这样的过程可以无限循环下去,其实三次握手就已经能够让双方都知道对方设备是好用的且次数是最少的。如此看来不采用四次握手而采用三次握手,是为了减少资源浪费,因此第四次握手相当多余的。


螺丝爱螺帽


根据我所知道的回答一下这个问题。

TCP的三次握手,有两个作用:

  • 建立通信双方的端到端的连接

  • 完成通信双方的认证

TCP建立连接的三次握手

TCP建立连接的过程是客户端和服务器之间的通信过程。

TCP建立连接三次握手的过程如下图所示:

  • 第一次握手:客户端发送SYN=1,seq=x报文到服务器端

  • 第二次握手:服务端收到客户端报文之后,发送SYN=1,seq=y(服务端的序列号),ack=x+1(确认客户端的序列号)

  • 第三次握手:客户端收到服务端的报文之后,发送ACK=1(标识确认报文) seq=x+1,ack=y+1(确认服务端的序列号为y报文)

TCP报文的首部

要深入了解TCP建立连接的三次握手,需要了解一下TCP报文的首部信息。

如下图所示,显示了TCP报文的首部,与TCP三次握手相关的字段是:

  • 控制位(5位):SYN、ACK。用于传输TCP建立连接的控制数据,SYN标识同步报文、ACK标识确认报文。

  • 序号(32位):Seq。用于标识传输报文的序号,同时用于双方的认证,用(源ip地址、目的ip地址、源端口、目的端口)标识端对端的通信,用(序列号、确认号)标识报文。

  • 确认号(32位):Ack。用于标识传输报文的确认号,确认对方的报文。

总结

  • TCP的三次握手是TCP连接的第一步,完成客户端和服务端的建立连接。

  • TCP三次握手的过程,同时完成了客户端和服务端通过序列号和确认号完成双方的认证。


对于TCP三次握手,建立连接,完成认证,大家有什么看法呢,欢迎在评论区留言讨论。

如需更多帮助,请私信关注。谢谢


网络通信兵


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

为什么建立连接需要三次握手?

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

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

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

譬如发起请求遇到类似这样的情况:客户端发出去的第一个连接请求由于某些原因在网络节点中滞留了导致延迟,直到连接释放的某个时间点才到达服务端,这是一个早已失效的报文,但是此时服务端仍然认为这是客户端的建立连接请求第一次握手,于是服务端回应了客户端,第二次握手。

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

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

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

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

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

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

我们来回顾一下,这个过程中总共有四个动作,

你招手

妹子点头微笑

妹子招手

你点头微笑

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

你招手

妹子点头微笑并招手

你点头微笑

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

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

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

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

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

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

由于笔者水平有限,由于笔者水平有限,很多网络基础知识需要去深入了解去探索,文中纰漏之处在所难免,权当抛砖引玉,还请各位大牛不吝赐教。欢迎交流。

【END】



洪生鹏


TCP(传输控制协议)位于网络层(IPv4或者IPv6)之上,用来给上层应用提供一种面向连接的、可靠的字节流服务。主要是这三个特性:面向连接可靠字节流。通过这三个特性,可以很好的理解TCP以及三次握手原理。

面向连接:是指交换数据前,通信双方必须通过相互联系来建立一个TCP连接,然后才可以传输数据。所以使用TCP的应用在数据可交换前,通过三次握手建立连接。同时连接的状态也需要维护,部分信息也在三次握手中完成协商,比如MSS字段。TCP连接是双向的,双方维护自己的TCP连接。

字节流:这是一种与上层应用交互的方式,对于应用程序来说,只需要将数据按照字节流送个TCP即可,TCP负责把这些字节按照写入顺序送到对端。应用程序可以写入10字节,然后写入20字节,然后写入30字节。TCP只负责把这些数据传递给对方,可能通过一个报文,也可能通过两个报文,或者三个报文,这个对上面是不透明的,但最终结果是这些数据按照写入的顺序流,到达对方。

可靠的:TCP通过确认ACK和序列号来保证数据传输的可靠性。本端向对端发送的信息(序列号为N),对端收到后,会返回一个带ACK标志,序列号为N+1的报文,期望本端发送后面的字节流。在实际中,为了效率,本端并不会收到每个报文的ACK报文后,才发送下一个报文,而是发送一组报文,对端只返回最后一个报文的ACK,表明该报文以及前面的报文都已收到。但是

对于SYN报文,是立刻返回ACK的。

由这三个性质,就可以理解三次握手原理。因为是面向连接的,所以需要SYN标志建立连接,获取相关信息,主要是首包序列号(如果没有获取首包序列号,则不知道数据从哪里开始传输,否则开头即使丢包也无法知道);因为是可靠的,需要ACK和序列号来确保可靠;同时连接是双向的,所以本端对端都需要SYN+ACK交互。可以理解为两次交互,对于本端来说,发送SYN报文,接受ACK;对于对端来说,发送SYN报文,接受ACK,其实就是三次握手所做的工作。


分享到:


相關文章: