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

🥊作者:一只爱打拳的程序猿,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传输中还有其他保证数据的可靠性传输的机制如确认应答机制、超时重传机制,大家可在文章开头专栏中搜索。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

密码学学习笔记(八):Public-Key Encryption - 公钥加密1

简介 公钥加密也被称为非对称加密。下面是一个例子: Bob生成一个密钥对,发布他的公钥𝑃𝐾𝐵, 保管密钥𝑆𝐾𝐵 私有的Alice使用𝑃𝐾𝐵 加密明文M…

TypeScript - 函数(下)

目录 1、在函数中声明this 2、其他需要知道的类型 2.1 void 2.2 object 2.3 unknow 2.4 never 2.5 Function 3、其余参数(rest)和参数 4、参数解构 5、函数的可分配性 1、在函数中声明this TypeScript 将通过代码流分析推断函数中应该是什么&…

安卓JNI从0到1入门教程(二)

经过上一篇《安卓JNI从0到1入门教程(一)》介绍,我们对JNI有了初步认识,接下来我会从ndk-build方式和cmake方式分别来介绍怎么构建native库: 一、ndk-build ndk-build依赖配置文件Android.mk,存放代码的位…

AI PPT 一句话搞定PPT讲演搞

相信大家在职场中,一定会接触过写PPT,经常会把你搞得焦头烂额。在大部分的公司里,写PPT汇报又是不可能逃避的事情。但随着AI时代的到来,有很多AI帮你写PPT的工具也逐渐崭露头角,可以自动帮助你制作出华丽的PPT&#xf…

docker部署rabbitmq 后访问管理首页常见问题

1.项目启动后 管理首页无法访问 1)检查15672端口是否可以访问 2)docker exec -it your_container_name /bin/bash 进入docker容器执行如下命令: 3) rabbitmq-plugins enable rabbitmq_management 2.访问首页时提示不是私密连接:…

自动化测试 selenium 篇

✏️作者:银河罐头 📋系列专栏:JavaEE 🌲“种一棵树最好的时间是十年前,其次是现在” 目录 什么是自动化测试?Selenium 介绍Selenium 是什么Selenium 特点工作原理 seleniumJava环境搭建ChromeJava1.下载ch…

抖音seo源码--矩阵系统开发者日志

这是矩阵系统源码开发者的日志分享,我们致力于为开发者们提供优质的SEO源码。我们研究用户行为、数据分析和搜索引擎算法,以提高内容的搜索排名和曝光度。通过不断优化关键词、元数据和链接策略,我们帮助抖音用户更好地被发现和分享。这个日志…

flutter开发实战-指纹、面容ID验证插件实现

flutter开发实战-指纹、面容ID验证插件实现 在iOS开发中,经常出现需要指纹、面容ID验证的功能。 指纹、面容ID是一种基于用生物识别技术,通过扫描用户的面部特征来验证用户身份。 一、效果图 二、iOS指纹、面容ID验证 在iOS中实现指纹、面容ID验证功能…

如何用爬虫实现GPT功能

如何用爬虫实现GPT功能? GPT(Generative Pre-trained Transformer)和爬虫是两个完全不同的概念和技术。GPT是一种基于Transformer模型的自然语言处理模型,用于生成文本,而爬虫是一种用于从互联网上收集数据的技术。 …

【数据结构与算法】力扣:对称二叉树

对称二叉树 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true 示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false 来源:…

GlusterFs 分布式复制卷(Distributed-Replicate)性能测试

目录 fio工具参数解释 Glusterfs 和NFS 性能测试 顺序写: 随机写: 顺序读: 随机读: 随机读写: 参数说明: 测试结论: 与NFS对比 压测对比结果 NFS和GlusterFs的优缺点 NFS的优点 NFS…

看完这篇异地多活的改造,我决定和架构师battle一下

1. 简述 异地多活的概念以及为什么要做异地多活这里就不进行概述了。概念性的很多,像什么同城双活、两地三中心、三地五中心等等概念。如果有对这些容灾架构模式感兴趣的可以阅读下这篇文章进行了解:《浅谈业务级灾备的架构模式》。 阅读本篇文章之前&…

脚踏Java知识点

对上节Java的基础语法续讲 三元运算符和if语句格式的区别 语法格式: 三元运算符的语法格式是:(condition) ? expression1 : expression2; if语句的语法格式是: if (condition) { // 执行 expression1 } else { // 执行 express…

API全场景零码测试机器人——ATGen带来“超自动化”测试模式

HDC期间可参与新手入驻华为云Testplan抽奖活动,活动链接在文末 众所周知,软件服务及组件之间的交互主要依赖大量的API接口。以华为云300多个商用云服务为例,平均每个服务含500接口,接口总数高达10万,接口调用上下文业务…

多元回归预测 | Matlab基于鹈鹕算法(POA)优化径向基神经网络(POA-RBF)的数据回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab基于鹈鹕算法(POA)优化径向基神经网络(POA-RBF)的数据回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% 清…

IDE /skipping incompatible xxx_d.dll when searching for -lxxx_d

文章目录 概述场景复现用以测试的代码编译器位数不匹配导致?保持编译器类型一致再验证编译器位数的影响MingW下调用OS的库咋不告警?以mingW下使用winSocket为例MingW下网络编程的头文件分析该环境下链接的ws2_32库文件在哪里?mingW为啥可以兼容window下的动态库 概…

【Flutter】Audioplayers 4.1.0 简要使用说明

文章目录 一、前言二、安装和设置三、基本使用1.创建 AudioPlayer 实例2.设置音频源3.控制播放 四、示例代码五、总结 一、前言 Audioplayers 是一个非常实用的 Flutter 插件,它可以帮助我们在 Flutter 应用中播放音频。无论你是想在你的应用中添加背景音乐&#x…

Docker: 改变容器化世界的革命性技术

目录 1.1什么是虚拟化 1.2什么是Docker 1.3容器与虚拟机的比较 1.4Docker组建 2、Docker安装 2.2设置ustc的镜像 2.3Docker的启动与停止 3、docker常用命令 3.1镜像 3.2容器相关命令 1.1什么是虚拟化 在计算机中,虚拟化(Vitualization&#x…

如何从一个仪表盘管理多个WordPress网站?

您是否正在寻找一种管理多个WordPress网站的简单方法? 监控多个网站并使其保持更新可能非常耗时。 幸运的是,有几种 WordPress 管理工具可以让您从单个仪表板管理多个 WordPress 网站变得非常容易。这将帮助您节省大量时间,同时使所有 Word…

赋能智能智造-RK3568智能主板助力机器人产业高速发展

机器人作为现代制造业的重要一环,正在以惊人的速度推动着生产效率和智能化水平的提升,它们在生产线上的准确操作和高效工作,为企业带来了巨大的竞争优势。关于工业机器人的编程和控制技术,在过去几年中已经有了很多发展和新的应用…