通俗讲解TCP协议三次握手

先放个链接,万一有人关注呢

优质文章推荐

↓ ↓ ↓ ↓ 

只会用scp?那也太Low了

很多人安装了Ubuntu第一步就做错了

基于Docker容器部署MySQL数据库

Linux系统目录结构讲解

正则表达式真的很强,可惜你不会写




    TCP(Transmission Control Protocol)协议,即传输控制协议,是一种可靠的传输层通信协议,基于字节流。在TCP/IP协议传输中的数据都被分段打包之后,再进行传输,所以这一层传输的数据被称为包,也叫数据包。在传输过程中,TCP协议会将每个数据包都编号,这样即使数据包丢失也能及时发现并重新传输。而一些不可靠的连接很容易发生数据包丢失,这一现象被称为丢包。



    TCP是面向连接的,首先要创建连接,在创建连接的过程中客户端与服务端要进行三次交互,而这三次交互被生动形象地叫做三次握手。

第一次握手

    首先,服务端创建传输控制块(TCB),并进入到监听(LISTEN)状态,随时可以与客户端进行连接。

    客户端也需要创建传输控制块,接着向服务端发送请求连接的报文,这是第一次握手。其中,报文包括:头部SYN=1与序列号seq=x 。由于这是一个SYN报文,所以不会传输数据,但要消耗掉一个序列号,发送之后客户端进入同步已发送(SYN-SENT)状态。

第二次握手

    服务端收到请求连接的报文后,再向客户端发送确认报文,这是第二次握手。其中,报文中内容为ACK=1,SYN=1,返回序列号是ack=x+1,以及报文序列号 seq=y,之后服务端进入同步收到(SYN-RCVD)状态。由于这个报文中也含有SYN,所以同样不能传输数据,但仍要消耗序列号。

第三次握手

    客户端收到确认报文后,同样要给服务端发送确认报文,这是第三次握手。其中,报文头部是ACK=1,返回序列号是ack=y+1,并加入该报文的序列号seq=x+1,之后客户端进入已建立连接(ESTABLISHED)状态。这次的报文中不含有SYN,所以可以传输数据,如果不传输数据就不需要消耗序列号了。

    在服务端收到来自客户端的确认报文后,也进入已建立连接(ESTABLISHED)状态,此时,TPC连接就建立好了




通俗的讲

    简而言之,客户端发送请求信号给服务端,服务端收到请求信号后,再给客户端发送一个可以建立连接的信号。客户端接收信号后,再向服务端发起连接请求,完成这三次交互之后连接建立。例如甲去乙家做客时,先跟乙打招呼询问“能到你家坐坐吗”,接着乙会说“可以”,然后再去乙家。

    之所以使用三次握手而不使用二次握手,是为了防止无效的请求报文引发错误。例如,客户端第一次发送的请求报文在网络节点中发生了阻塞,没有及时到达服务端,于是又发送了一次创建TCP连接请求,这次很快就建立了连接。这时,第一次发送的请求报文到达了服务端,于是又创建了一次连接,浪费了资源。如果使用三次握手,当客户端已经与服务端建立了连接,就算处理了过期的请求报文,并给客户端发送了响应报文,客户端也不会再发送确认报文。

来不及解释了,快上车!(进群看公告)

欢迎新的小伙伴加入!在这里,我们鼓励大家积极参与群内讨论和交流,分享自己的见解和经验,一起学习和成长。同时,也欢迎大家提出问题和建议,让我们不断改进和完善这个平台。

               点个在看,你最好看!

         给作者加鸡腿

请使用浏览器的分享功能分享到微信等