【网络原理】TCP连接管理机制(三次握手四次挥手)

news2024/11/27 7:30:44

🥊作者:一只爱打拳的程序猿,Java领域新星创作者,CSDN、阿里云社区优质创作者。

🤼专栏收录于:计算机网络原理


在使用TCP协议进行网络交互时,TCP会进行三次握手即建立连接,TCP四次挥手即断开连接。三次握手与四次挥手后就完成了网络交互,这样的操作也叫TCP的连接管理机制,本篇博文将详细介绍TCP通信过程和三次握手、四次挥手过程。

目录

1、TCP通信过程

1.1 TCP首部报头

1.2 TCP通信过程

2、三次握手

2.1 三次握手流程

2.2 为什么要三次握手

3、四次挥手

3.2 为什么要四次挥手


1、TCP通信过程


1.1 TCP首部报头

TCP首部(TCP Header)是TCP协议中的报头部分,它跟随在IP报头后面。TCP报头通常由20个字节组成,其中包括了一些标志位、序列号、确认号、端口号等信息,用于在TCP通信中控制和传递数据。

源端口号/目的端口号:表示数据的发送方与数据的接受方端口号

32位序号/32位确认序号:TCP将每个字节的数据都进行了编号即为序列号。

6位标志位:TCP的6位标志位默认为0,当返回相应的报文时,会把该报文位设置位1。

URG(Urgent):表示是否包含紧急数据。

ACK(Acknowledgment):表示确认号是否有效。

PSH(Push):表示是否立即推送。

RST(Reset):表示连接是否复位。携带RST标识的称为复位报文段。

SYN(Synchronize):表示同步请求/应答。携带SYN标识的称为同步报文段

FIN(Finish):表示传输结束。携带FIN标识的为结束报文段。

当TCP客户端和服务器建立连接时,它们会共同存储一些连接状态信息,以便在数据传输和连接释放的过程中使用。这些状态信息包括:

  1. 序列号(Sequence Number):用于对TCP数据段进行排序和重组。

  2. 确认号(Acknowledgment Number):用于确认在连接过程中收到的数据段的数量。

  3. 窗口大小(Window Size):用于指定接收端能够接收的数据量大小。

  4. 状态标志(Flags):用于指定TCP连接的状态、数据段类型和连接状态的变化等信息。

  5. 超时时间(Timeout):用于指定数据段传输时间的最大限制,超过该限制则认为连接出现了问题。


1.2 TCP通信过程

TCP通信过程模拟

我们观察到 主机A  向 主机B 传输数据时,提供了以 1000 为单位的编号。这些编号称为 序列号

我们可认为 主机A 向 主机B 发送数据为一个请求 即 SYN。TCP给这个请求随机分配一个序列号即SEQ

并且 主机B 在收到 主机A 的数据后会作出回应,这个回应称之为 即 ACK。只有接收方返回 ACK 后,这样的通信才算完成。

确认序列号 的是序列号的下一个字节数。当 SYN 请求序列号为 1000,则 ACK 确认序列号为 1001,对照上图、下图进行理解。

注意,以上的 SYN 和 ACK 是怎样进行传输的呢,我们知道6位标志位默认为0,第1位到第6位分别为:URG、ACK、PSH、RST、SYN、FIN 。当要进行 SYN 请求时,则传输000010。当要进行 ACK 确认序列号时则传输 010000。


2、三次握手

握手(handshake)指通信双方进行网络交互,TCP 建立连接时客户端与服务器之间需要进行三次交互来完成连接。

建立连接一定是客户端向服务器发起的,在 TCP 协议下客户端首先向服务器发送建立连接请求即 SYN 报文段,服务器在接受到请求后会返回 ACK 确认序号。

服务器为了确保与客户端建立连接会向客户端也发送 SYN 报文段,客户端再返回 ACK 确认序号。这样客户端与服务器就完成了连接。

举例说明

张三想与如花确定男女朋友关系,首先张三向如花发送求爱请求:“你可以做我的唯一吗?”(SYN)。

如花答应张三并返回确认信息:“我愿意”(ACK),但如花想张三也是她的唯一也向扎张三发送信息:“你也愿意做我的唯一吗?”(SYN)。

张三回复:“我愿意”(ACK)。

以上过程看似是四次交互,但实际中间两次交互可合并为一条交互,因此上述过程为三次握手。

只有双方都确定了彼此之间的信息这样才能完成建立连接。TCP中可通过序列号、确认号来保存彼此之间信息,在本文上方TCP通信过程中有详细讲解。


2.1 三次握手流程

1)当客户端向服务器发送请求时,会发送 SYN 报文段给服务器。

2)服务器在收到客户端的请求后,会回复 ACK 确认序列号。

3)服务器为了保证连接也会向客户端发送给 SYN 报文段。

4)客户端收到服务器的请求回复 ACK 确认序列号。

在上方 TCP 通信过程中,我们知道了 TCP 的报头有6位标志位,标志位默认为0。当需要相关操作时就会把某位标志位置为1,为了避免浪费资源,可把这两个操作合并在一起。

服务器向客服端发送 ACK 和 SYN 操作时就可以合并在一起,也就是 ACK 位和 SYN 位都置为1。看似是四次握手实际上只用了三次交互,因此我们称为三次握手,对照下图进行理解。


2.2 为什么要三次握手

  1. 防止已失效的连接请求报文段突然又传送到了服务端,从而导致服务端开启多个连接。

  2. 连接请求报文段正好在网络中滞留比较久,以至于延误到相应的确认没有足够的时候到达服务端,使得服务端误判连接id。

  3. 网络中出现了延迟的重传,因此服务端在已经建立了连接的情况下又收到了连接建立请求,如果没有三次握手情况下,会认为这是一个新的连接请求,从而重复建立新的连接。


3、四次挥手

四次挥手是TCP协议关闭连接时的一种基本过程,它的主要目的是确保双方的数据传输和处理都已经完成。具体来说,四次挥手主要包括以下步骤:

  1. 发起关闭请求的一方(假设是客户端)发送一个FIN (finish)请求,表示“我已经没有数据要发给你了”。
  2. 接收到FIN请求的另一方(假设是服务器)发送一个ACK确认报文,表示“我已经收到了你发来的关闭请求”。
  3. 接收到ACK确认报文的发起关闭请求的一方(即客户端)等待自己发送数据的过程完成并准备好关闭连接后,再次发送一个FIN请求,表示“我的数据发完了,我准备关闭连接”。
  4. 接收到最后一个FIN请求的另一方(即服务器)再次发送一个ACK报文,表示“我已经收到了你的关闭请求,确认关闭连接”。

这样,四次挥手就完成了。需要注意的是,关闭连接的两端都需要发送FIN请求和ACK确认请求,因为TCP协议是一种双向通信协议。在四次挥手过程中,客户端和服务器都需要确认对方的关闭请求,并相互发送ACK报文确认,以确保连接正常关闭。通过四次挥手,双方都能够顺利地关闭连接并释放资源。

四次挥手过程

此处的四次握手的 ACK 和 FIN 为啥不能合并为一次,根据上述四次挥手过程进行解析:

连接的第一次关闭是客户端发送FIN请求,服务器返回ACK确认请求。这个请求的作用是告诉服务器,客户端已经没有数据要发送了,希望关闭连接。在这个阶段中,服务器只是确认收到了客户端发来的FIN请求,还可以继续发送数据给客户端。

连接的第二次关闭是服务器发送FIN请求,客户端回复ACK确认请求。这个请求的意义是告诉客户端,服务器也没有数据要发送了,希望关闭连接。在这个阶段中,客户端收到了服务器的FIN请求,可能还会发送一些最后的数据到服务器,然后再发送ACK确认请求。如果将第一次和第二次的请求合并在一起,服务器就无法获知客户端是否真正结束了数据的发送,可能会误认为客户端还在发送数据。


3.2 为什么要四次挥手

TCP是一种双向通信协议,双方都需要发送和接收数据。在四次挥手过程中,需要确保双方没有尚未处理完的数据或者请求。因此,四次挥手能够在正确关闭连接之前,保证数据双向传输和处理的完成。

不同于三次握手,在关闭连接时,可能存在未及时发送的数据。如果 TCP 四次挥手过程中全部包含在一个 TCP 报文中,则使用 TCP 的延迟 ACK,未及时发送其中的 ACK 报文,导致连接终止存在延迟。采用四次挥手可避免这种情况。

网络编程中避免出现类似TCP Head of Line Blocking(HOLB)的问题。如果在两端都尚未关闭连接之前,数据流还在传输中,一端出现故障,就会引起等待连接关闭的一方进入死等状态,造成连接阻塞。

因此,通过四次挥手过程,双方都能够正确地处理数据、确认请求,并最终彻底地关闭连接,从而保证 TCP 传输的安全、稳定并且可靠。


三次握手四次挥手是为了保证数据的可靠性传输,在TCP传输中还有其他保证数据的可靠性传输的机制如确认应答机制、超时重传机制,大家可在文章开头专栏中搜索。

本期博文到这里就结束了,感谢点赞、评论、收藏、关注~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/662281.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Stable Diffusion局部重绘功能,如何完美抹掉不想要的物体?

网上一堆文生图教程,这种抽卡式东西玩几天就没有意思了,怎么按照自己的意愿生成自己的图是非常有意思的东西,所以我对局部重绘特别感兴趣,借助 SD 的扩散算法,如何利用它的扩散算法来向着自己期望的方向上呈现&#xf…

分享5款十分小众的软件,不好用你找我

今天推荐5款十分小众的软件,但是每个都是非常非常好用的,用完后觉得不好用你找我。 网络测速——NetSpeedMonitor NetSpeedMonitor是一款用于测量和显示你的网络速度的工具。它可以让你在任务栏上看到你的实时上传和下载速度,并提供多种功能…

Win10任务栏一直转圈圈不能操作怎么办?

Win10任务栏一直转圈圈不能操作怎么办?Win10电脑用户遇到了任务栏一直转圈圈不能操作的问题,不知道怎么操作才能解决,这时候用户可以打开桌面上的控制面板,点击卸载更新补丁,也可以通过打开命令提示符窗口,…

【业务功能篇30】代码重构--卫语句/idea内置工具抽象方法

业务场景: 当前我们项目在发布流水线的时候,codecheck 圈复杂度高于10的,或者14的,需要进行一些整改, 什么是圈复杂度? 圈复杂度(Cyclomatic complexity,CC)也称为条件复…

【Leetcode60天带刷】day07哈希表——454.四数相加II , 383. 赎金信 ,15. 三数之和 , 18. 四数之和

题目&#xff1a;454.四数相加II 454. 四数相加 II 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 …

进阶面向对象

面向对象的意义在于 将日常生活中习惯的思维方式引入程序设计中 将需求中的概念直观的映射到解决方案中 以模块为中心构建可复用的软件系统 提高软件产品的可维护性和可拓展性 类和对象是面向对象中的两个基本概念 类&#xff1a;指的是一类事务&#xff0c;是一个抽象的概…

【Python 随练】学生成绩等级划分

题目&#xff1a; 利用条件运算符的嵌套来完成此题&#xff1a;学习成绩 ≥ 90 分的同学用 A 表示&#xff0c;60-89 分之间的用 B 表示&#xff0c;60 分以下的用 C 表示。 简介&#xff1a; 在本篇博客中&#xff0c;我们将使用条件运算符的嵌套来划分学生成绩的等级。根据…

Redis安装说明(黑马程序员)

Redis安装说明&#xff08;黑马程序员&#xff09; 笔者的redis(Linux版)的下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87926624 笔者的redis图形化桌面客户端&#xff0c;下载链接地址为&#xff1a;https://download.csdn.net/download/w…

朴素贝叶斯算法

文章目录 1. 贝叶斯定理2. 朴素贝叶斯2.1 朴素贝叶斯原理2.2 朴素贝叶斯适用范围2.3 朴素贝叶斯常用模型 3. 朴素贝叶斯算法的特点4. 朴素贝叶斯的Python应用5. 源码仓库地址 1. 贝叶斯定理 先验概率&#xff1a;即基于统计的概率&#xff0c;是基于以往历史经验和分析得到的结…

【事故致因】HFACS(人因分析与分类系统)

HFACS&#xff08;人因分析与分类系统&#xff09; 1 来源2 拟解决的问题&#xff08;背景&#xff09;2 基本架构2.1 Unsafe Acts2.1.1 Errors2.1.1.1 Skill-based errors2.1.1.2 Decision errors2.2.1.3 Perceptual errors 2.1.2 Violations2.1.2.1 Routine violations2.1.2.…

数学建模竞赛国赛入场券之攻略

数学建模竞赛国赛入场券之攻略 1.团队契合度 在3天的准备时间中&#xff0c;如果是临时组建的草台班子光处理分歧可能就已经耗掉一半时间&#xff0c;最好在赛前就完成磨合&#xff0c;像一起做模拟题练练手之类&#xff0c;甲准备图论、乙准备优化方法&#xff0c;然后再一块…

linux 内存管理之五bootmem 分配器 2.4.22

内核的bootmem 分配器 又叫自举内存分配器&#xff0c;其内涵即 自己初始化自己的一个内存分配器 其初始化过程 已在 上篇[ARM 架构物理内存初始化]&#xff0c;(https://blog.csdn.net/zsj1126/article/details/116430903)介绍 本文主要关注该分配器提供的主要接口和用途 st…

系统测试工程师的岗位职责描述(合集)

系统测试工程师的岗位职责描述1 职责&#xff1a; 1、评审产品或项目需求的测试性&#xff0c;评审产品或项目开发设计的合理性。 2、根据需求进行测试规划&#xff0c;制定测试方案&#xff0c;设计测试用例; 组织测试用例评审; 3、根据测试计划进行项目测试进度和测试质量的管…

Cesium 实战 - 自定义视频标签展示视频

Cesium 实战 - 自定义视频标签展示视频 视频材质核心代码气泡框视频核心代码在线示例 在封装 Cesium 工具的时候&#xff0c;偶然发现 Cesium 支持视频材质功能&#xff0c;虽然目前项目中还没有用到&#xff0c;但是提前做了功能封装&#xff0c;以后使用的时候会方便一些。 …

强化学习从基础到进阶-常见问题和面试必知必答[1]:强化学习概述、序列决策、动作空间定义、策略价值函数、探索与利用、Gym强化学习实验

【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧&#xff08;调参、画图等、趣味项目实现、学术应用项目实现 专栏详细介绍&#xff1a;【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧…

Triton教程---模型设置

Triton教程—模型设置 这是您第一次编写配置文件吗&#xff1f; 查看本指南或本示例&#xff01; 文章目录 Triton教程---模型设置最小模型配置名称、平台和后端模型交互策略解耦 最大批量大小输入和输出PyTorch 后端的特殊约定命名约定&#xff1a;张量字典作为输入&#xf…

用CSS3实现边框流动,让你的网页更有创意和个性

前言 边框流动动画是一种非常常见的效果&#xff0c;能够让网页看起来更加生动有趣。通过使用 CSS3&#xff0c;我们可以轻松地实现这种动画效果。本文将介绍如何使用 CSS3 实现边框流动效果&#xff0c;下面一起来看看吧。 实现效果 实现思路 首先我们先创建一个盒子容器&…

ENVI软件的地表温度(LST)反演教程

前言 遥感图像处理平台&#xff08;The Environment for Visualizing Images&#xff09;的软件处理技术覆盖图像数据的输入/输出、图像定标、图像增强、纠正、正射校正、镶嵌、数据融合以及各种变换、信息提取、图像分类、基于知识的决策树分类、与GIS的整合、DEM及地形信息提…

【FPGA入门】第四篇、有限状态机

目录 第一部分、一个关于有限状态机的例子 第二部分、学会有限状态机的准备知识 1、什么是有限状态机&#xff1f; 2、为什么需要状态机&#xff1f; 3、什么是竞争冒险&#xff1f; 3.1、什么情况下会发生竞争冒险&#xff1f; 3.2、为什么组合逻辑电路会产生竞争和冒险…

HBase入门(一)

第1章 HBase简介 1.1 HBase定义 HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库。 1.2 HBase数据模型 逻辑上&#xff0c;HBase的数据模型同关系型数据库很类似&#xff0c;数据存储在一张表中&#xff0c;有行有列。但从HBase的底层物理存储结构&#xff08;…