【TCP】连接管理:三次握手和四次挥手

简介: 【TCP】连接管理:三次握手和四次挥手

连接管理

  • 建立连接:三次握手
  • 断开连接:四次挥手
    网络中的握手/挥手,就是发送不携带业务数据(没有载荷,只有报头)的数据包,但是能起到“打招呼”这样的效果。次数就是指网络通信的次数。

建立连接:三次握手

此处建立连接发送的 SYN 是同步的意思,可以延伸成:客户端希望服务器和它统一步调,来完成手续的传输

建立连接是一个“双向的操作”,连接是“抽象的连接”,代表通信双方各自保存对方的信息

  • A 需要给 B 说:我想和你建立连接(A 想保存 B 的信息),之后返回应答(ACK
  • B 也需要给 A 说:我也想和你建立连接(B 想保存 A 的信息),之后返回应答(ACK
    本来是四次握手,但是中间两次合并了,就成了三次握手,合并是很重要、很有意义的,要是分两次发送,效率就会打折扣,因为每个数据包都需要进行一系列封装分用
  • 收到 ACK/SYN 都会使报头中的对应值由 0 变为 1

三次握手的意义

三次握手要解决什么问题?为什么要三次握手?意义何在?

三个方面:

  1. 投石问路的效果,初步验证通信的链路是否畅通
    先通过一些没什么业务意义的报文,来验证一下这个路是不是通的,这是进行可靠传输的“前提条件

例如:地铁需要在每天开始第一班车之前,空跑一趟,进行“链路畅通的验证”

  1. 可以确认通信双方的发送能力和接受能力是否都正常
    除了关注中间的路线,还要关注两头的双方的接法能力是否正常

例如:你要和朋友一起玩游戏,事先你们先要确保双方的耳机和麦克风都是正常的

  1. 第一次挥手:
    - 你这边仍然都不了解双方的能力
    - 朋友那边听到“嘿”,意味着他知道了你的麦克风正常他的耳机正常。但他不知道我的耳机和他的麦克风是否正常
  2. 第二次挥手:
    - 朋友说“嘿嘿”,他仍不确定他自己的麦克风和我的耳机是否正常
    - 你听到了“嘿嘿”,你就知道了你的耳机正常朋友的麦克风正常。由于你们事先约定好了,他一定要在听到你说“嘿”之后再回复,所以你也就知道了你的麦克风正常他的耳机正常。此时,你就知道了双方的耳机和麦克风都是正常的
    - 你的验证完成
  3. 第三次挥手:
    - 我再说“嘿嘿嘿”,把我掌握的信息同步给他
    - 朋友听到“嘿嘿嘿”,由于我们实现约定好我一定是在听到他说 "嘿嘿"之后我再回复。因此,他听到了“嘿嘿嘿”,意味着他刚才说的“嘿嘿”被我收到了,他也就知道了他的麦克风正常你的耳机正常
    - 朋友的验证完成
  • 针对 TCP 来说,必须要通过三次握手来验证双方的发送和接收能力。但其他协议就不一定是三次了
  1. 让通信双方在进行通信之前,对通信过程中需要用到的一些关键参数进行协商

TCP 通信时,起始数据的序号,就是通过三次握手协商确定的(换而言之,TCP 序号并不是从 1 开始的)

  • 每次建立连接,TCP 的起始序号都不同,而且故意差别很大
  • 避免出现“前朝的剑,斩本朝的官
  • A 和 B 后来又建立连接,虽然还是 A B 两个主机之间的连接,但可能变成不同的应用程序了
  • 在传输业务数据的过程中,可能有某个数据包“迷路”了,饶了一大圈,最终才到达对端。当他到达的时候,已经“改朝换代了”,已经不是原来那个连接了
  • 针对这样的“迟到”的数据包,就要将其丢弃掉,不能按照正常的流程处理这里的数据了,避免其在新的程序中产生负面的影响
  • 对于 B 来说,就要区分当前收到的数据是“本朝”还是“前朝”的
    这样,就可以给每个连接都协商不同的起始序号,如果发现收到的数据和起始序号以及和最近收到的数据序号差别都很大的话,就视为这个数据就是“前朝”的数据

网上有些资料说“TCP 的可靠性是通过三次握手体现的”,这句话是有些问题的

  • 三次握手对于可靠性,是有一定的支持的
  • 但是不能说可靠性就是三次握手体现的
  • 因为三次握手只是建立连接的时候进行的,一旦连接建立好了之后,数据开始传输了,就和三次握手没关系了
  • 传输数据过程中的可靠性是通过“确认应答”和“超时重传”来体现的

断开连接:四次挥手

优雅地断开连接,双方各自删除掉保存的对方的信息

断开连接不一定是“客户端主动”,服务器也可以主动断开

  • 通信双方各自给对方发送FIN,各自给对方返回ACK
  • A:“B 兄,我要把你删了“==> FIN
  • B:“好的“==> ACK
  • B:“A 兄,那我也把你给删了哦”==> FIN
  • A:“好的”==> ACK

三次握手和四次挥手的执行区别

三次握手,只有三次是因为中间两次的交互合并在一起了。但对于四次握手来说,中间两次却不一定能合并(大概率是不能)

  • 因为对于三次握手来说,中间的两次(ACK+SYN)都是在内核中由操作系统负责进行的,时间都是在收到 SYN 之后,此时同一时机,就可以合并了
  • 对于四次挥手来说,ACK是由内核控制的(就是说系统只要收到FIN就会立刻返回一个ACK),但是FIN的触发则是通过应用层程序调用close / 进程退出来触发的
  • 代码中:socket.close() ==>系统内部:发送 FIN
  • 如果代码没有执行 close(),系统内部就不会发送 FIN,所以中间发送 ACKFIN 之间是有时间间隔

TCP的状态

  • LISTEN:服务器进入的状态,服务器把端口绑定好,就相当于进入了 LISTEN 状态,此时服务器就已经初始化完毕,准备好随时迎接客户端了(手机开机,信号良好,随时可以有人打电话
  • ESTABLISHEDTCP 连接建立完成(保存好了对方的信息了),接下来就可以进行业务数据的通信了(电话接通,可以说话
  • CLOSE_WAIT:被动断开连接的一方会进入的状态,先收到FIN的一方。等待代码执行close方法。
  • 如果发现服务器这边存在大量的 CLOSE_WAIT 状态的 TCP 连接,说明了什么?
  • 说明此时服务器代码可能有 bug,排查 close 是否写了或者是否执行到了
  • TIME_WAIT:主动断开连接的一方会进入的状态,此处的TIME_WAIT按照时间来等待,达到一定时间后,连接也就释放了
  • 为什么不直接释放呢?
  • TCP 传输过程中,任何一个数据都会丢包,但丢包重传就好了,只要此处的连接还在,就能很好的处理这里的重传操作。保留 TIME_WAIT 状态就是为防止最后一个 ACK 丢包,这样即使丢包了也能进行重传
  • 如果最后一个 ACK 丢包了,此时 B 这边就会重传一次 FIN,需要 A 这边再发一次 ACK,但能够再发一次 ACK 的前提是 A 这边的连接还没有释放(如果连接释放了,就不知道对方的信息,无法返回任何数据了)
  • 如果 TIME_WAIT 状态保留了一段时间后,也没有收到重传的 FIN,就说明刚才的 ACK 应该就是到了,就可以释放这里的连接了
  • TIME_WAIT 存在的时间称为 2MSLMXL ==>数据包在网络传输中消耗的最大时间))


相关文章
|
24天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
16天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
20天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2577 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
18天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
3天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
2天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
163 2
|
20天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1576 16
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
22天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
977 14
|
4天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
221 2
|
17天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
734 9