【TCP 协议】连接管理之 “三次握手,四次挥手”

news2024/9/23 7:29:08

哈喽,大家好~我是你们的老朋友:保护小周ღ  


本期为大家带来的是网络编程中的 TCP 传输控制协议保证数据可靠性传输的机制之一的——连接管理,通信双方采用 “三次握手” 来建立连接,采用 “四次挥手” 会断开连接,如何进行 ”握手” 和 “挥手” 操作,本文将为您解析~~


本期收录于博主的专栏JavaEE_保护小周ღ的博客-CSDN博客

适用于编程初学者,感兴趣的朋友们可以订阅,查看其它 “JavaEE基础知识”。
更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘


一、上期回顾

1.1 TCP 的报文结构

 争对TCP 报文重点做简单的解析:

序号和确认号:各占 32个二进制位 用于实现数据的可靠传输,所传送的字节流的每一个字节都会按顺序编号,保证数据传输的顺序和接收的顺序一样。序号表示当前发送的数据包的序号,确认号表示期望接收的下一个数据包的序号。序列号和确认号存在的意义就在于保证数据传输的顺序和接收的顺序一样。           

标志位:包括ACK、SYN、FIN、RST、PSH、URG六种各占一个二进制位。

默认置为 0 ,如果为标志位置为 1表示 true 的意思。

ACK:用于确认收到数据包;

SYN:判断通信双方是否建立了连接;

FIN:用于关闭连接;0

RST:用于重置连接;

PSH:用于提示接收方立即将数据推送给应用程序,而不是进入接收缓冲区;

URG:用于指示TCP包中有紧急数据。


1.2 确认应答和超时重传

确认应答:

当接收方收到发送方的发送的数据时,会给予发送方一个带有 TCP 首部的字段反馈,其中ACK = 1(一个二进制位), 表示我已经收到数据。 

针对以上机制,就有三种情况:

1. 数据直接在传输的过程中丢失,接收方没有收到数据,也就无法给予反馈。

2. 接受方收到数据后,给予发送方反馈,然而反馈报文在传输过程中丢了。

3. 当发送方一定时间没有接收到反馈,就会触发超时重传,然后重传的数据也丢了

超时重传:

如果发送方一定时间内没有等到接收方反馈的确认应答,就会对该段“数据包” 进行重传,期间如果还是没有接收到反馈发送方就会降低重传的频率过超一定的次数,TCP 就尝试给通信双发重新建立连接,如果连接失败,就会终止本次的网络通信。

这里的重新建立连接和终止本次网络通信的具体如何实现,是本文的主题~~

具体内容,大家可以阅读博主的上一篇博客:【TCP 协议】报文格式,数据可靠传输的机制(一)_保护小周ღ的博客-CSDN博客


二、连接管理

TCP 传输层协议,协议功能:保证通信双方数据可靠性传输。

保证的重要因素就是确认应答和超时重传的机制,接收方收到数据收会给予发送方反馈,这个反馈就是带有 TCP 固定首部的字段,TCP 首部中包含标志位信息,每一个标志位只占一个二进制位,所以根据 TCP 首部的标志位,我们就可以判断出当下TCP 数据包 的一个状态

TCP协议通信双方连接是通过三次握手来建立的。


2.1 三次握手

握手(handshake)指的是通信双方们,进行了网络交互,发送方和接收方之间,通过三次交互,建立了连接关系。连接关系指的是:通信双方各自记录了彼此的信息~

为什么提客户端和服务器呢,因为我们日常生活中的通信,通信双方并不是直接建立连接,而是先与服务器建立连接,信息通过服务器的 “中转”。

建立连接的 “意愿 ”一定是客户端主动先发起的

  1. 客户端向服务器发送SYN包,表示请求建立连接。

  2. 服务器收到SYN包后,回复一个SYN+ACK包,表示同意建立连接。

  3. 客户端收到SYN+ACK包后,再回复一个ACK包,表示连接建立成功。

SYN : (一个二进制位)置1 意思是一方要向另一方申请连接。表示当前 TCP 数据报是一个同步报文。

ACK : 一个二进制位),置1 意思是给予反馈,确认收到数据。表示当前 TCP 数据报是一个应答报文。

通信双方建立连接示意图:

博主这里采用了,打电话的场景模拟了一下 "建立连接" ,或许这样的通话有一定时间的前摇,但是主要的目的是——验证通信双方,各自的发送能力和接收能力是否正常,确认了交互过程的正常,这也是后续数据可靠性传输的基础。

为啥是三次握手,二次行不行,四次行不行?

首先两次握手,只能确认一方的 收发功能正常。

多次的握手呢,把中间的 AYN 和 ACK 拆分,分别发送,同样可以达到验证的目的,但是完全没有必要,因为一个 TCP 的数据段,需要经过层层的封装和分用(TCP / IP 五层通信模型),分两次发送,效率就显得很低。


2.3. 四次挥手

四次挥手就是通信双方断开连接,也是取一个很好听的名字。

断开连接的 “意愿” ,客户端和服务器都有可能发起。

  1. 客户端向服务器发送FIN包,表示要断开连接。

  2. 服务器收到 FIN 包后,回复一个 ACK 包,表示已经收到断开请求。

  3. 服务器再发送一个FIN包,表示同意断开连接。

  4. 客户端收到FIN包后,回复一个ACK包,表示已经收到断开请求。

FIN: (一个二进制位)置1 意思是一方要向另一方申请断开连接表示当前 TCP 数据报是一个结束报文。

通信双方断开连接示意图:

通过以上流程,断开连接的就是,通信双方各自给对方发送一个 FIN (结束报文),再各自给对此发送一个 ACK(应答报文)。

学习了 “三次握手” 之后,我们会发现有一个操作 SYN + ACK ,请求连接 + 确认应答,两个标志位可以在同一TCP 数据报中反馈,从而有了 三次交互


但是在断开连接这里, FIN 和 ACK 却是分开来传输的,所以断开连接就需要 通信双方进行 四次交互。

原因就是,SYN + ACK 都是由操作系统内核完成的,可以在同一时机触发。

TCP 属于传输层协议,作为程序开发者来说,重点关注的其实是应用层的开发,只是选择使用基于 TCP 协议 Socket 接口(API) 来开发。 传输层-网络层-数据链路层-物理层, 这 4 层实际上已经被操作系统封装好了,层层调用嘛,所以应用层直接使用传输层协议提供的接口,也就不需要太关注其他内部实现。

四次挥手 :

ACK  与 FIN 是不同的机触发的,ACK 由系统内核完成,所以在收到 FIN - 断开连接的请求之后,第一时间就会给发送方给予-确认应答。

FIN - 断开连接,是由应用程序代码控制的,在 Java 网络编程中,在调用 Socket (接口),中的 close() 方法时,才会触发 FIN ——  发送一个 TCP 数据报 FIN 置为 1 的结束报文。

例如:服务器在发现客户端发送了一个结束报文,所以就自己调用了 close() 方法,从而触发第二个结束报文。当然什么使用调用 close()方法这就根据程序是怎么写的。


关于程序没有调用 close() 触发结束报文的情况

例如:在客户端的程序,压根没写 close() , 这种情况,服务端给客户端发出结束请求 FIN ——服务器 接收不到客服端 反馈的结束报文。是不是连接就断开不了啊,不不不

如果将客户端的程序结束-进程结束-应用程序结束- 比如 qq 结束运行, 自动会触发 "close()", 资源会随着进程的结束而结束,由系统控制回收,因此就会触发 FIN 结束报文。此时客户端的 qq 应用程序运行结束了,但是 TCP 的连接还在(由操作系统内核维护),直到与 qq 服务器完成四次挥手~ 反之同理。

需要注意的是,TCP协议是全双工的,即客户端和服务器可以同时发送和接收数据。因此,在断开连接时,需要进行四次挥手,操作系统内核维护挥手过程以确保双方都已经断开连接。


好了,到这里,网络编程中的 【TCP 协议】连接管理之 “三次握手,四次挥手” 博主已经分享完了,希望对大家有所帮助,如有不妥之处欢迎批评指正。 

感谢每一个观看本篇文章的朋友,更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* 

遇见你,所有的星星都落在我的头上……

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

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

相关文章

小厂测试4年终于熬出头了,费时8个月,入职阿里,涨薪14K

前言 你的努力,终将成就无可替代的自己 本科毕业后就一直从事测试的工作,和多数人一样,最开始从事功能测试的工作,看着自己的同学一步一步往上走,自己还是在原地踏步,说实话这不是自己想要的状态。 一年半…

PSP - 替换 MSA 数据库 以及 OpenMM 和 mmCIF 异常

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/130577390 关于 OpenMM: OpenMM 是用于分子动力学模拟的开源软件库,可以在不同的平台和硬件上运行,如 CPU、GPU 和 FPGA。OpenMM 提供一个高效的、灵活的和…

Spring Cloud第二季--服务网关Gateway

文章目录 一、Gateway和Zuul的区别二、Gateway的核心概念三、小试牛刀3.1、代码测试3.2、关于Predicate3.3、关于Filter 一、Gateway和Zuul的区别 Spring Cloud Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和 Project …

ORACLE 10G版本数据库系统产生大量归档日志问题的分析

一、服务概述 近期接到用户告知数据库归档暴增,导致生产库归档空间满,手动删除后,归档空间很快就会满。 立即登陆数据库系统,查询发现归档日志异常增长,从以前的每小时产生300M,增长到每小时产生59150M。…

使用thop计算参数和FLOPs时的疑问

文章目录 使用thop计算参数时的疑问x x.view(-1, 32 * 8 * 8)和x x.view(x.size(0), -1)区别是什么input_shape (3, 224, 224)这个张量是什么意思为什么summary计算时没有批次大小input_tensor torch.randn(1, *input_shape).to(device)这句代码什么意思flops, params pro…

1AE4混合电路耳放

设计目标: 1)20W以内的总功耗(包括灯丝部分); 2)最大输入1.2Vrms信号; 3)输出至少50毫瓦的功率; 4)至少5倍以上的阻尼系数。 1AE4是较后期的直热管&#xff0…

软件项目成本控制的5大关键点 不得不重视

软件项目成本一般分为运营成本和项目成本。而运营成本比较固定,压缩和削减的余地不大。而在项目成本中,最主要的成本是人工成本。那么如何提高项目开发效率,节约人工成本,对成本管理至关重要。 我们从以下几个影响项目成本的主要因…

[DeepSpeed]初代chatGPT模型部署实践

DeepSpeed Chat 部署方式 中间遇到很多坑,解决方法都写这里了DeepSpeed 部署中bug以及解决方法 环境 基于阿里云GPU 云服务器部署实践 操作系统版本: Ubuntu 18.04 GPU 驱动版本: 470.161.03 GPU 型号: A100-80G CPU &#…

投了上千简历,是Android岗位需求少?还是我的技术不行

作者:病鸡乱投医 作为一名Android开发人员,打开招聘网站是每天必做的事情。每次看到悬赏诱人的Android工程师职位,就想做个简历有技巧、能够吸引面试官的面面观。 然而,即使投了上千份简历,也迟迟没有找到理想的工作。…

makefile编译脚本,理解$@、$^和$<

一、理解 、 、 、^、$<的含义 Makefile中&#xff0c;格式为这样的 target : prerequisties 目标&#xff1a;需要依赖的条件 简单的工程直接这样 hello:hello.ccgcc hello.cc -o hello但如果文件多了呢&#xff1f;按部就班写会显得很长&#xff0c;所有这时候makefil…

惊现数据库误操作后,看这家银行如何打造“零盲区”运维安全

第三方运维人员数据库误操作致业务中断 堡垒机凸显短板 这家银行如何破局&#xff1f; 走在数字化转型前沿的银行业&#xff0c;不断增加的IT资产、业务系统&#xff0c;给IT运维提出了更高的挑战。银行运维的核心之一在于数据安全、系统稳定&#xff0c;面临着庞杂的运维场景…

【推荐系统】常用评价指标NDCG、HR、Recall、MRR解析

【推荐系统】常用评价指标NDCG、HR、Recall、MRR解析 文章目录 【推荐系统】常用评价指标NDCG、HR、Recall、MRR解析1. 准备工作2. 计算这些指标 &#xff08;5&#xff09;2.1 Accuracy&#xff08;准确率&#xff09;2.2 Recall&#xff08;召回率、查全率&#xff09;2.3 Pr…

【跟着陈七一起学C语言】今天总结:C语言的数组和指针

友情链接&#xff1a;专栏地址 知识总结顺序参考C Primer Plus&#xff08;第六版&#xff09;和谭浩强老师的C程序设计&#xff08;第五版&#xff09;等&#xff0c;内容以书中为标准&#xff0c;同时参考其它各类书籍以及优质文章&#xff0c;以至减少知识点上的错误&#x…

HR怎么看待PMP证书呢?

我们可以先了解一下各个公司对于PMP证书的一个观点 针对PMP证书&#xff0c;在HR看来&#xff0c;有这几个直观的感受和判断&#xff1a; 公司要求PMP优先&#xff0c;那我盯着这个看就行&#xff0c;没有就不要&#xff0c;省事儿招的多了也有一些基本了解&#xff0c;考到这…

【Linux】Linux环境下安装RocketMQ(图文解说详细版)

文章目录 一、简介二、MQ 下载三、JAVA 环境配置四、MQ 安装五、启动 MQ六、测试七、运行八、关闭 MQ 一、简介 消息队列中间件是分布式系统中的重要组件&#xff0c;主要解决应用耦合、流量削峰等问题&#xff0c;目前主流的 MQ 主要是&#xff1a;RocketMQ、kafka、RabbitMQ…

GRPC - JAVA笔记

GRPC - JAVA笔记 gRPC简介 由google开源的一个高性能的RPc框架&#xff0c;由google内部的Stubby框架演化而来。2015年正式开源。云原生时代的RPC标准&#xff0c;由Go语言开发 gRPC的核心设计思路 网络通信 ------> gRPC 自己封装了网络通信的部分&#xff0c;提供了多种…

zookeeper超详细安装集群部署

文章目录 一、zookeeper官网下载二、JDK环境安装三、zookeeper安装1.zookeeper解压2.zookeeper配置文件介绍 克隆服务器1.网络检查2.集群配置3.启动集群4.错误记录 一、zookeeper官网下载 下载地址&#xff1a;https://archive.apache.org/dist/zookeeper/找到对应的版本下载 …

文章纠错免费软件-文字校对软件免费下载

自动校对稿件的软件 自动校对稿件的软件是一种基于自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;和机器学习&#xff08;Machine Learning&#xff09;技术的工具&#xff0c;可以较为准确地检测和纠正文本中出现的语法、拼写、标点符号以及其他笔误…

如何优雅的白嫖ChatGPT

ChatGPT已经火了大半年了&#xff0c;但对于很多小伙伴来说想使用它还是有些麻烦&#xff0c;不仅需要稳定的漂亮国ip,还要冒着被封号的风险。 因此&#xff0c;本文介绍了两个白嫖ChatGPT的方式供大家使用&#xff08;亲测可用&#xff09;&#xff1a; Poe 地址(科学上网)…

入行IC|数字IC与模拟IC方向怎么选?(内附2023春招薪资对比)

很多同学想要入行IC&#xff0c;但不知道数字和模拟方向怎么选&#xff1f; 如果没有亲身体会过模拟设计&#xff0c;并有发自内心的自信或者兴趣&#xff0c;一般不看好纯小白去学模拟电路设计。 模拟设计想做好&#xff0c;没有数学功底&#xff0c;没有电路分析的功底&…