tcp协议为什么要三次握手_tcp三次握手的通俗理解

专注于Java领域优质技术,欢迎关注

作者:老钱 占小狼博客

TCP三次握手和四次挥手的问题在面试中是最为常见的考点之一。很多读者都知道三次和四次,但是如果问深入一点,他们往往都无法作出准确回答。本篇尝试使用动画来对这个知识点进行讲解,期望读者们可以更加简单地地理解TCP交互的本质。

TCP 三次握手

TCP 三次握手就好比两个人在街上隔着50米看见了对方,但是因为雾霾等原因不能100%确认,所以要通过招手的方式相互确定对方是否认识自己。

tcp协议为什么要三次握手_tcp三次握手的通俗理解

张三首先向李四招手(syn),李四看到张三向自己招手后,向对方点了点头挤出了一个微笑(ack)。张三看到李四微笑后确认了李四成功辨认出了自己(进入estalished状态)。

但是李四还有点狐疑,向四周看了一看,有没有可能张三是在看别人呢,他也需要确认一下。所以李四也向张三招了招手(syn),张三看到李四向自己招手后知道对方是在寻求自己的确认,于是也点了点头挤出了微笑(ack),李四看到对方的微笑后确认了张三就是在向自己打招呼(进入established状态)。

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

tcp协议为什么要三次握手_tcp三次握手的通俗理解

我们看到这个过程中一共是四个动作,张三招手–李四点头微笑–李四招手–张三点头微笑。其中李四连续进行了2个动作,先是点头微笑(回复对方),然后再次招手(寻求确认),实际上可以将这两个动作合一,招手的同时点头和微笑(syn+ack)。于是四个动作就简化成了三个动作,张三招手–李四点头微笑并招手–张三点头微笑。这就是三次握手的本质,中间的一次动作是两个动作的合并。

我们看到有两个中间状态,synsent和synrcvd,这两个状态叫着「半打开」状态,就是向对方招手了,但是还没来得及看到对方的点头微笑。synsent是主动打开方的「半打开」状态,synrcvd是被动打开方的「半打开」状态。客户端是主动打开方,服务器是被动打开方。

  • syn_sent: syn package has been sent
  • syn_rcvd: syn package has been received

TCP 数据传输

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

tcp协议为什么要三次握手_tcp三次握手的通俗理解

张三喊了一句话(data),李四听见了之后要向张三回复自己听见了(ack)。

如果张三喊了一句,半天没听到李四回复,张三就认为自己的话被大风吹走了,李四没听见,所以需要重新喊话,这就是tcp重传。

也有可能是李四听到了张三的话,但是李四向张三的回复被大风吹走了,以至于张三没听见李四的回复。张三并不能判断究竟是自己的话被大风吹走了还是李四的回复被大风吹走了,张三也不用管,重传一下就是。

既然会重传,李四就有可能同一句话听见了两次,这就是「去重」。「重传」和「去重」工作操作系统的网络内核模块都已经帮我们处理好了,用户层是不用关心的。

tcp协议为什么要三次握手_tcp三次握手的通俗理解

张三可以向李四喊话,同样李四也可以向张三喊话,因为tcp链接是「双工的」,双方都可以主动发起数据传输。不过无论是哪方喊话,都需要收到对方的确认才能认为对方收到了自己的喊话。

张三可能是个高射炮,一说连说了八句话,这时候李四可以不用一句一句回复,而是连续听了这八句话之后,一起向对方回复说前面你说的八句话我都听见了,这就是批量ack。但是张三也不能一次性说了太多话,李四的脑子短时间可能无法消化太多,两人之间需要有协商好的合适的发送和接受速率,这个就是「TCP窗口大小」。

网络环境的数据交互同人类之间的对话还要复杂一些,它存在数据包乱序的现象。同一个来源发出来的不同数据包在「网际路由」上可能会走过不同的路径,最终达到同一个地方时,顺序就不一样了。操作系统的网络内核模块会负责对数据包进行排序,到用户层时顺序就已经完全一致了。

TCP 四次挥手

TCP断开链接的过程和建立链接的过程比较类似,只不过中间的两部并不总是会合成一步走,所以它分成了4个动作,张三挥手(fin)——李四伤感地微笑(ack)——李四挥手(fin)——张三伤感地微笑(ack)。

tcp协议为什么要三次握手_tcp三次握手的通俗理解

之所以中间的两个动作没有合并,是因为tcp存在「半关闭」状态,也就是单向关闭。张三已经挥了手,可是人还没有走,只是不再说话,但是耳朵还是可以继续听,李四呢继续喊话。等待李四累了,也不再说话了,超张三挥了挥手,张三伤感地微笑了一下,才彻底结束了。

tcp协议为什么要三次握手_tcp三次握手的通俗理解

上面有一个非常特殊的状态time_wait,它是主动关闭的一方在回复完对方的挥手后进入的一个长期状态,这个状态标准的持续时间是4分钟,4分钟后才会进入到closed状态,释放套接字资源。不过在具体实现上这个时间是可以调整的。

它就好比主动分手方要承担的责任,是你提出的要分手,你得付出代价。这个后果就是持续4分钟的time_wait状态,不能释放套接字资源(端口),就好比守寡期,这段时间内套接字资源(端口)不得回收利用。

它的作用是重传最后一个ack报文,确保对方可以收到。因为如果对方没有收到ack的话,会重传fin报文,处于time_wait状态的套接字会立即向对方重发ack报文。

同时在这段时间内,该链接在对话期间于网际路由上产生的残留报文(因为路径过于崎岖,数据报文走的时间太长,重传的报文都收到了,原始报文还在路上)传过来时,都会被立即丢弃掉。4分钟的时间足以使得这些残留报文彻底消逝。不然当新的端口被重复利用时,这些残留报文可能会干扰新的链接。

4分钟就是2个MSL,每个MSL是2分钟。MSL就是maximium segment lifetime——最长报文寿命。这个时间是由官方RFC协议规定的。至于为什么是2个MSL而不是1个MSL,我还没有看到一个非常满意的解释。四次挥手也并不总是四次挥手,中间的两个动作有时候是可以合并一起进行的,这个时候就成了三次挥手,主动关闭方就会从finwait1状态直接进入到timewait状态,跳过了finwait_2状态。

总结

TCP状态转换是一个非常复杂的过程,本文仅对一些简单的基础知识点进行了类比讲解。关于TCP的更多知识还需要读者去搜寻相关技术文章进入深入学习。如果读者对TCP的基础知识掌握得比较牢固,高级的知识理解起来就不会太过于吃力。

本文【tcp协议为什么要三次握手_tcp三次握手的通俗理解】由作者: 乐观锁 提供,本站不拥有所有权,只提供储存服务,如有侵权,联系删除!
本文链接:https://www.cuoshuo.com/blog/4263.html

(0)
上一篇 2023-03-11 09:02:13
下一篇 2023-03-12 08:05:49

相关推荐

  • css透明度动画

    loading动画图标的做法有很多。一般不想麻烦的人直接嵌入一张gif的动态图标即可实现!虽然该方法方便快捷,但是对网站的加载速度优化方面还不是最好,制作的GIF图片很难控制它们的大小!今天我就来说说如何用CSS来制作一个loading动画效果,供大家参考,感兴趣的小伙伴可以看看! 常见的加载动画有以下2中: 第一种:周围的圆圈围着在转,即等待加载 第二种:…

    2023-03-21
    000
  • 磁盘清理是干什么用的

    简介:当电脑时间用长了以后,磁盘中会产生大量的碎片,这时候就有必要清理一下磁盘。磁盘清理后,电脑的运行速度会明显变快。 工具:电脑 windows7操作系统 第一步:点击【我的电脑】 第二步:在c盘上右击,点击【属性】 第三步:点击【磁盘清理】 第四步:进行磁盘清理,要花几分钟的时间 第五步:磁盘清理成功,点击确定 注:删除的文件夹包括【已下载的程序文件】【…

    2023-03-20
    000
  • 硬盘数据恢复一般多少钱

    移动硬盘本质与普通硬盘差不多,均是数据存储介质。但移动硬盘在便携性上更远高于普通硬盘,某一方面,移动硬盘的体型较小可以随着塞入口袋;另一方面,移动硬盘可以利用诸如USB或Type-C接口来与机器设备对接,十分便捷。针对需求频繁迁移数据的用户而言,移动硬盘是一个十分挺不错的选择。但是在经常使用过程中,难免会出现数据丢失情况,如硬盘删除的照片如何恢复数据?针对这…

    2023-03-16
    100
  • 个人计算机常用的操作系统(计算机的软件系统可分为)

    随着互联网时代的快速发展,电脑发展也相当的成熟,新手学电脑可以快速入门,是每个新手梦寐以求的事情,但是不是所有人都可以快速上手,最近很多用户咨询我关于零基础学电脑先学什么,或者是电脑新手入门必学什么东西,那么接下来,我就给大家精心准备了电脑新手入门教程,大家一起来看看吧 电脑是有硬件和软件组成的 硬件就是看得见摸得着的东西,比如主机箱、电源、主板、处理器、内…

    2023-03-20
    000
  • ded包怎么安装 linux系统deb安装包如何安装

    dpkg全程为"Debian Package"。其是一个Debian的一个命令行工具,它可以用来安装、删除、构建和管理Debian的软件包。 我们经常可以在网络上见到以deb形式打包的软件包,就需要使用dpkg命令来安装。如网易云音乐linux版,WPSlinux版等 dpkg常用参数介绍: 参数及其说明 -i    安装指定deb包 -…

    2023-03-20
    000
  • java程序设计基础第七版pdf_java程序设计教程第三版pdf

    前言 我们之前使用js库html2canvas + jspdf实现html转PDF、图片,并下载(详情请戳:html页面转PDF、图片操作记录),大致原理是将页面塞到画布里,以图片的方式放到PDF中,生成的文件比较大,文本记录Java使用iText7生成PDF iText 7是iText强大的PDF工具包的最新版本,用于PDF生成,PDF编程,处理和操作,如…

    2023-03-10
    500
  • mysql索引的使用和原理_mysql如何使用索引

    一步一步推导出 Mysql 索引的底层数据结构。 Mysql 作为互联网中非常热门的数据库,其底层的存储引擎和数据检索引擎的设计非常重要,尤其是 Mysql 数据的存储形式以及索引的设计,决定了 Mysql 整体的数据检索性能。 我们知道,索引的作用是做数据的快速检索,而快速检索的实现的本质是数据结构。通过不同数据结构的选择,实现各种数据快速检索。在数据库中…

    2023-03-12
    300
  • webservice教程java webservice接口开发教程

    webservice简介: Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。Web Service是自描述、 自包含的可用网络模块, 可以执行具体的业务功能。Web…

    2023-03-17
    000
  • 学生成绩信息管理系统

    随着信息化管理模式不断的普及开来,培训机构都在寻找学生信息管理系统来规范学校管理,促进信息化的早日实现,那么像这类学生信息成绩管理系统一般包含的功能有哪些呢? 都说是学生信息管理系统,那么肯定少不了学生功能管理方面了,比如从学生报名缴费开始、到后期的考勤排课管理、课时查询和消耗管理、学生成绩管理、升班转班退班管理这些功能都应该是系统具备的,才能够满足学生日常…

    2023-03-14
    100
  • java数据库课程设计报告

    2,数据库设计 2.1 数据库设计简介 软件的研发步骤 数据库设计概念 数据库设计就是根据业务系统的具体需求,结合我们所选用的DBMS,为这个业务系统构造出最优的数据存储模型。 建立数据库中的表结构以及表与表之间的关联关系的过程。 有哪些表?表里有哪些字段?表和表之间有什么关系? 数据库设计的步骤 需求分析(数据是什么? 数据具有哪些属性? 数据与属性的特点…

    2023-03-14
    000

发表回复

登录后才能评论
返回顶部
错说博客上线啦!