当前位置: 首页 > news >正文

网络原理 - 5(TCP - 2 - 三次握手与四次挥手)

目录

3. 连接管理

建立连接 - 三次挥手

三次握手的意义

断开连接 - 四次挥手

握手和挥手的相似和不同之处

连接管理过程中涉及到的 TCP 状态转换

完!


3. 连接管理

连接管理分为建立连接 和 断开连接~(important 重点!)

建立连接 - 三次挥手

TCP 是有连接的,我们在网络编程中客户端执行了一行代码:socket = new Socket(serverIp, serverPort); 这个操作就是建立连接!!!

上述我们代码中,只是调用了 socket 的 API,真正的建立连接的过程,是在操作系统的内核中完成的~

内核中是如何完成上述的“建立连接”的过程呢??? ==》 “三次握手”,此处我们建立的连接,是一种“虚拟的,抽象的”连接,目的是让通信双方都能保存对方的相关信息~

syn 其实是 synchronize 的缩写,有没有很熟悉,就是我们之前上锁的关键字~~~ 不过这里我们可以更形象的翻译为 同步~~~

在建立连接的过程中,客户端是主动的一方,第一次交互,一定是客户端主动发起的,所谓 syn,是一个特殊的 TCP 数据报(1. 没有载荷,不会携带应用层数据 2. 六个标志位中的第五位 SYN 为 1),这个 syn 就会表达一层语义:我想和你建立连接(虚拟抽象的连接)

虽然 syn 没有携带应用层载荷,但是也会有 IP 报头 / 以太网数据帧帧头,更会有 TCP 报头,TCP 报头中,就会包含了客户端自己的端口,IP 报头中,就会包含了客户端自己的 IP(这个过程,也是客户端在告诉服务器,who am i

客户端发出 syn 同步报文段之后,会有两种可能性:

        1. 服务器同意了,服务器表示,好呀好呀,我也想和你建立连接~~

        2. 服务器没同意。这种情况一般比较少见,就是服务器现在处在负载非常高的情况下,完全没办法再进行响应了,此时的客户端太多了~~~也就没有下文了(只要服务器有空闲,就一定会想和客户端建立连接,毕竟服务器本身就是用来提供服务的~~~)

服务器接收到客户端的 syn 同步报文段之后,就会返回一个 ACK(确认应答),语义就是:收到!!!

接下来,服务器返回 ack 之后,还会再返回一个 syn,这个 syn 的意思就是,我接收你的连接(我也愿意和你建立连接,刚刚返回 ack 只是表明,我服务器收到了你的请求连接,现在返回 syn 是表明了,我也愿意和你建立连接~~~)

客户端在收到服务器发过来的 syn 之后,也会再给服务器发送一个 ack 报文,表示,好滴,我知道你愿意和我建立连接啦~~~

到此,客户端和服务器在内核中建立连接的过程就完成啦~~~

下面是一些细节的补充:

syn 我们形象的翻译为“同步”,实际上是不同的含义(同一个术语,在不同的语境下,有不同的意思~~)

多线程加锁的 synchronized 同步,是要协调多个线程之间的执行顺序。

TCP 这里的同步,则是建立连接状态,客户端服务器需要相互配合来完成一系列的工作业务了~~~也就是说,双方一旦建立连接之后,双方就得力往一处使,也可以理解为一种同步。

所谓的建立连接的过程,本质上就是通信双方各自给对方发送一个 syn,各自再给对方回应一个 ack,这里客户端的信息告知服务器,在第一次发送 syn(第一次握手)的时候就完成了,但最终这个连接要建立,还确认出后续还要进行通信,是需要所有流程都走完的。

虽然第一次握手,客户端就把自己的信息告诉服务器了,但是服务器具体是否要确定存储这个信息,还需要再观望官网~~~等所有的握手环节结束之后,服务器才会最终保存客户端的相关信息。

这里的过程叫做“握手” ==》 handshake 也是一个形象的比喻,握手是打招呼,syn 这样的数据报,不携带载荷,没有应用层数据,也就不代表任何应用程序的业务逻辑,syn 的作用,仅仅只是“打招呼”,所以我们在这里把这个操作形象的称为“握手“。 == 》 打完招呼之后,后面我们双方就可以商讨具体的细节了(商讨细节,就是业务逻辑,应用程序 / 应用层要完成的业务逻辑了~~~)

还有一个问题是,我们不是称为”三次握手“吗???握手,理解了,就是打招呼的意思,但上面明明是进行了 4 次交互过程呀~~~

其实其实,中间的两次操作,可以进行合并。在六个关键位中,SYN 和 ACK 是在不同位置上的,syn 是第五位,ack 是第二位,当发送 ack 的时候,就六个关键位的第二位为 1,当发送 syn 的时候,就六个关键位的第五位为 1 即可~~

完全可以做到,一个数据报,第五位和第二位都是 1,这样,这个数据报不就同时起到了两个作用吗,既能应答上个请求,也能发起 syn。(我们前面讲过,网络传输过程中要涉及到多次封装和分用。两个数据报就要封装分用两次,合并成一个数据报,就只需要封装分用一次,可以减少一次封装分用的过程,这样整体的效率就提升了,也会降低我们的成本~~)

其他资料上也会有”三次握手“的更为详细的描述,如下:

这种描述中,TCP 对应的状态转换(CLOSE LISTEN ESTABLISHED)对应的 socket 的 API等等,都更为详细的进行了介绍,我们这里就不过多详细了~~

三次握手的意义

1. 关注中间过程:三次握手,可以先针对通信路径,进行一个“投石问路”的操作,初步的确认一下通信链路是否畅通,这也是可靠性的前提条件~~~如果能成,再谈“可靠传输”~~

2. 关注两端的状态:三次握手,也是在验证通信双方,发送能力和接受能力是否正常。

举个栗子~~

A 和 B 要玩双人游戏 -- 双人成行~~~

这种双人游戏,一般都是要双方默契配合的,A 和 B 就要进行一个语言通话,比如 QQ 语音什么的~~~

在进行握手之前,A 和 B 是分别不知道自己的麦克风 和 耳机,是否可以正常工作的~~~

此时,B 就先开口的,通过他的麦克风发出消息:“喂喂喂”

此时,B 是什么都不知道的情况。当 A 能听到“喂喂喂”,就证明了 B 的麦克风是 OK 的,同时,A 自己的耳机也是 OK 的,他就会回复一句”总有儿子想当爹~“

这个时候,如果 B 收到了这一句话,就证明 B 自己的耳机的 OK 的,同时,他也知道了 A 的麦克风是 OK 的(A 和 B 有一个与欸的那个,约定 A 听到 B 相当他爹之后,A 才会回复”总有儿子想当爹“,要不然 A 是不会回复的~~~)由于这个与欸的那个的存在,就证明了 A 一定是听到了 B 说的”喂喂喂“,这个时候,B 就知道了,他自己的耳机和麦克风,A 的耳机和麦克风,都是 OK 的,但由于此时 A 还是不知道剩余的情况,B 就再需要一次回应,讲上述信息告诉 A

当 A 再收到 B 的回复,也就意识到,他刚刚给 B 发的”总有儿子想当爹“(此处还是有一个约定,B 在收到”总有儿子想当爹“的时候,才会回复“我是你爷爷”~~~),B 也收到了,这样 A 也就知道 他自己的麦克风和耳机,B 的麦克风和耳机,都是 OK 的

这样 A 和 B 就都分别知道自己和对方的麦克风和耳机的状态了~~

上述的麦克风 ===》 发送数据的能力

上述的耳机 ===》 接收数据的能力~

3. 三次握手的过程中,也会协商一些必要的参数~通信是客户端服务器两方的事情,双方要进行同步配合,其中的一些内容要保持一致~

举个栗子~~

A 和 B 在玩 LOL ~~~ 第一次握手,B 告诉 A 他玩射手,A 收到后,告诉 B,那我玩辅助,B 又收到后,我们这两个菜鸟选手,玩下路,岂不是一死一送,还需要一个野王带我们飞,于是就又告诉了 A,我们需要一个野王~~~

TCP 中是有很多参数要进行协商的,往往是以”选项“部分来进行体现的~~~

这个选项,我们前面提到过,最少可以是 0 字节,最多是 40 字节(TCP 报头的总长度最多是 2^4 * 4 = 60,去掉前面固定的 20,还剩 40 字节)

其中有一个信息是十分关键的,TCP 通信的序号起始值。TCP 一次通信过程中,序号并不是直接从 0 或者 1 开始计算的。而是先选择一个比较大的数字,以这个数字开头来继续i计算~~ 即使是同一个客户端和服务器,每次连接,开始的序号都是不一样的

涉及 TCP 的大佬当年是这么考虑的,上述操作是为了避免一个情况 ==》 前朝的剑,斩本朝的官~~

比如出现下面的情况:

由于互联网中,会广泛的存在”后发先至“ / “先发后至”的情况。

可能在第一次连接过程中,通信操作中,传输的一个数据报,在路上堵车了~~~迟迟没有到达对端。

等到这个堵车迟到的数据报到达对端的时候,咦,发现已经改朝换代了,之前的连接早都没了,现在成了新的连接了~~~

此时,这份堵车的数据报,应就应该被丢弃掉~~

数据报是按照 ip 和 端口号来进行识别的。

第一个连接,是用客户端 A 来进行连接的,第二个连接是用客户端 B 来进行连接的(恰好是同一个端口的情况,客户端的概率是比较低的(我们前面提到过,客户端的端口号是随机分配的),服务器的概率就会很大)

此时数据到达这一边,发现早已经物是人非了,这个时候的话, 再来对这个数据进行处理的话,就不是很合适了,此时,丢弃这个数据报才是上上策~

那如何识别出,当前的数据报是不是“前朝”的数据报呢?? ==》 通过序号来进行区分~~~

(序号是不同的,也不是随机的,序号的分配背后还是有一些列的分配策略存在的~~~)

正常的数据报的序号都是从开始序号往后依次排序的,就算偶尔丢包,偶尔数据不连续,差异也不会很大,但如果是“前朝”的数据报传过来,序号就会和本朝的数据报的序号差异非常大,很容易一眼就被识别出来~~~

断开连接 - 四次挥手

连接,本质上就是让通信双方来保存对方的信息,每个客户端 / 服务器,都要保存很对对端的信息,一旦多了,这些数据就需要一定的结构来进行管理 == 数据结构~~~

断开连接的本质目的,其实就是为了把对端的信息,从数据结构中给删除 / 释放掉~

此处的四次挥手,就是通信双方,都同意断开连接(双方和平分手,两个人都要去睡觉觉了~~~)(对于如果单方面的情况,四次挥手不一定适用,就会有其他方式会释放这里的连接,也就是说,断开连接,不一定就是四次挥手~)

四次挥手的断开连接操作,就不一定非得是客户端先发 fin 了,服务器也可能先发 fin,和三次握手不一样,三次握手,一定是客户端主动的~

四次挥手中,谁先发都可以,看我们的代码具体的实际逻辑了,调用 socket.close() 就会触发 fin(fin 也是内核中负责完成的,如果进程直接结束,也会触发 fin(关闭 socket 文件,结束进程,也会关闭文件~~~))

fin,同样是可以六个关键字之一,即 finish 的缩写。

当有代码 socket.close() ,就会触发 fin 数据报。

和建立连接一样,断开连接的时候,服务器收到 fin 的时候,同样会发送 ack 和 fin 报文给客户端

然后客户端才传送回一个 ack 表示收到

这样就完成了四次挥手,通信双方各自给对方发起 fin,再各自给对方反馈 ack,四次挥手,代表着双方和平分手,和平离婚~~~(离婚双方需要签署离婚协议 == 》双方都把字签好,就是结束了~~~)

那,上述的四次挥手过程,能不能像三次握手一样,把中间两次的交互,合二为一呢???

如合~~~有的时候能合并,有的时候不能合并,不像三次握手一样,100% 会合并~~

我们再看三次握手的情况:

客户端执行 new Socket(serverIp, serverPort) 代码的时候,就会发送 syn 数据报,中间服务器的 syn + ack 这俩数据的触发时机是完全一致的,都是内核在收到 syn 之后,就立即触发(这两个数据报的发送,和我们程序员写的应用程序代码是无关的~~)

但是四次挥手的过程中,和代码有关系的:

服务器发送 fin 的时候,是受限于代码的,还记得我们在网络编程中,最终在 try - catch 的时候 最后加入了一个 finally 吗?在 finally 的时候加入 close 方法。

这中间返回 ack 和 fin 的时间间隔,如果比较长,就无法进行合并了,只能分为两次来进行传输~~(如果当前时间间很小,也是有可能合并的~)

细节版本:

握手和挥手的相似和不同之处

相似之处:

都是通信双方各自给对方发起一个 syn / fin,各自给对方返回 ack

数据传输的数据: syn / ack / syn / ack          fin / ack / fin / ack

不同之处:

三次握手,中间两次的交互一定能够合并,四次挥手则不一定

三次握手,一定是需要客户端主动的,四次挥手,客户端 / 服务器都可以主动~

连接管理过程中涉及到的 TCP 状态转换

上面的 TCP 连接中的详细描述图~~就包含了一些 TCP 的状态转换~

TCP 状态和我们之前线程中谈到的线程,是类似的概念。

状态描述的是某个实体,现在正在干什么。TCP 服务器和客户端都要有一定的数据结构来保存这个连接的信息,在这个数据结构中,其中就有一个属性叫做“状态”,操作系统内核会根据状态的不同,来决定当前应该干什么~~

上图是一个 TCP 状态转换的过程~不过看着有些混乱,我们还是按照那个连接管理的详细图研究一下~

先看一下建立连接的过程~ 

有一个 LISTEN 状态,表示服务器这边已经创建好 serverSocket 了,并且端口号也已经绑定完成了(手机开机,信号良好,随时可以有人给我打电话了~)

ESTABLISHED 表示已确定的。客户端和服务器已经建立完毕(三次握手完成了)(有人给我打电话了,而且我接通了,此时我们可以给对方说话了~~~) 

四次挥手断开连接中:

有一个 CLOSE_WAIT 状态,谁被动断开连接,谁就进入 CLOSE_WAIT 状态~ 这个状态就表示:接下来代码中需要调用 close 来主动发起 fin (收到对方的 fin 之后就会进入这个状态~)

还有的状态是 TIME_WAIT 就是表示,本端给对方发起 fin 之后,对端也给我发了 fin,此时

本端就会进入 TIME_WAIT 状态,给最后一个 ACK 的重传留有一定的时间~(即,谁主动断开连接,谁进入 TIME_WAIT 状态)

正常状态下,CLOSE_WAIT 不太容易被观察到,代码中会比较快速的关闭 socket 这个时候,状态就从 CLOSE_WAIT > LAST_ACK (但是如果发现,服务器 / 客户端上出现大量的 CLOSE_WAIT 意味着代码很可能是出现了 bug,比如忘记关闭 socket~)

TIME_WAIT 存在的意义,主要是为了防止最后一个 ACK 丢包~~

在四次挥手的过程中,会涉及到确认应答和超时重传,如果没有收到 ACK,就会认为丢包~

如果最后客户端发给服务器的 ACK 在传输过程中丢失,服务器没有收到 ACK 报文,就会认为字节给客户端发送的 FIN 未被确认,就会重传 fin 报文段,如果客户端没有 TIME_WAIT 状态,直接进入 CLOSED 状态,就无法处理和接收重传的 FIN 了。而客户端在 TIME_WAIT 状态中,保存着与该连接的相关的信息,可以接收服务器重传的 fin 并且再次发送 ack,保持连接的正常关闭。

完!

相关文章:

网络原理 - 5(TCP - 2 - 三次握手与四次挥手)

目录 3. 连接管理 建立连接 - 三次挥手 三次握手的意义 断开连接 - 四次挥手 握手和挥手的相似和不同之处 连接管理过程中涉及到的 TCP 状态转换 完! 3. 连接管理 连接管理分为建立连接 和 断开连接~(important 重点!) 建…...

【开源】STM32HAL库移植Arduino OneWire库驱动DS18B20和MAX31850

项目开源链接 github主页https://github.com/snqx-lqh本项目github地址https://github.com/snqx-lqh/STM32F103C8T6HalDemo作者 VXQinghua-Li7 📖 欢迎交流 如果开源的代码对你有帮助,希望可以帮我点个赞👍和收藏 项目说明 最近在做一个项目…...

【maven-7.1】POM文件中的属性管理:提升构建灵活性与可维护性

在Maven项目中,POM (Project Object Model) 文件是核心配置文件,而属性管理则是POM中一个强大但常被低估的特性。良好的属性管理可以显著提升项目的可维护性、减少重复配置,并使构建过程更加灵活。本文将深入探讨Maven中的属性管理机制。 1.…...

DC-2寻找Flag1、2、3、4、5,wpscan爆破、git提权

一、信息收集 1、主机探测 arp-scan -l 探测同网段2、端口扫描 nmap -sS -sV 192.168.66.136 80/tcp open http Apache httpd 2.4.10 ((Debian)) 7744/tcp open ssh OpenSSH 6.7p1 Debian 5deb8u7 (protocol 2.0)这里是扫描出来两个端口,80和ssh&…...

数据结构手撕--【栈和队列】

目录 1、栈 2、队列 1、栈 先进后出&#xff08;都在栈顶进行操作&#xff09; 使用数组结构比使用链式结构更优&#xff0c;因为数组在尾上插入数据的代价更小。并且采用动态长度的数组来表示。 定义结构体 #include <stdio.h> #include <stdlib.h> #include &l…...

八大排序——选择排序/堆排序

八大排序——选择排序/堆排序 目录 一、选择排序 二、堆排序 2.1 大顶堆&#xff08;升序&#xff09; 2.1.1 步骤 2.1.2 代码实现 2.2 小顶堆&#xff08;降序&#xff09; 一、选择排序 每一趟从待排序序列中找到其最小值&#xff0c;然后和待排序序列的第一个值进行交换&am…...

【KWDB 创作者计划】_深度学习篇---归一化反归一化

文章目录 前言一、归一化(Normalization)1. 定义2. 常用方法Min-Max归一化Z-Score标准化(虽常称“标准化”,但广义属归一化)小数缩放(Decimal Scaling)3. 作用4. 注意事项二、反归一化(Denormalization)1. 定义2.方法3. 应用场景三、Python示例演示四、归一化 vs. 标准…...

windows端远程控制ubuntu运行脚本程序并转发ubuntu端脚本输出的网页

背景 对于一些只能在ubuntu上运行的脚本&#xff0c;并且这个脚本会在ubuntu上通过网页展示运行结果。我们希望可以使用windows远程操控ubuntu&#xff0c;在windows上查看网页内容。 方法 start cmd.exe /k "sshpass -p passwd ssh namexxx.xxx.xxx.xxx "cd /hom…...

推荐系统(二十四):Embedding层的参数是如何在模型训练过程中学习的?

近来有不少读者私信我关于嵌入层&#xff08;Embedding层&#xff09;参数在模型训练过程中如何学习的问题。虽然之前已经在不少文章介绍过 Embedding&#xff0c;但是为了读者更好地理解&#xff0c;笔者将通过本文详细解读嵌入层&#xff08;Embedding Layer&#xff09;的参…...

【Ubuntu】关于系统分区、挂载点、安装位置的一些基本信息

在ubuntu22及以前的版本中&#xff0c;最好是手动配置分区及其挂载点&#xff0c;通常我们会配置成3/4个分区&#xff1a; 引导区&#xff0c;交换区&#xff0c;根挂载点&#xff0c;home挂载点&#xff08;有时根挂载点和home合二为一&#xff09; 配置各种环境所占用的内存 …...

概率dp总结

概率 DP 用于解决概率问题与期望问题&#xff0c;建议先对 概率 & 期望 的内容有一定了解。一般情况下&#xff0c;解决概率问题需要顺序循环&#xff0c;而解决期望问题使用逆序循环&#xff0c;如果定义的状态转移方程存在后效性问题&#xff0c;还需要用到 高斯消元 来优…...

深入解析:RocketMQ、RabbitMQ和Kafka的区别与使用场景

互联网大厂Java求职者面试&#xff1a;RocketMQ、RabbitMQ和Kafka的深入解析 故事场景&#xff1a;严肃且专业的面试官与架构师程序员马架构 在一家知名的互联网大厂&#xff0c;Java求职者正在接受一场严格的面试。面试官是一位经验丰富的技术专家&#xff0c;他将通过多轮提…...

探秘Transformer系列之(30)--- 投机解码

探秘Transformer系列之&#xff08;30&#xff09;— 投机解码 文章目录 探秘Transformer系列之&#xff08;30&#xff09;--- 投机解码0x00 概述0x01 背景1.1 问题1.2 自回归解码 0x02 定义 & 历史2.1 投机解码2.2 发展历史 0x03 Blockwise Parallel Decoding3.1 动机3.2…...

【CSS】层叠,优先级与继承(三):超详细继承知识点

目录 继承一、什么是继承&#xff1f;2.1 祖先元素2.2 默认继承/默认不继承 二、可继承属性2.1 字体相关属性2.2 文本相关属性2.3 列表相关属性 三、不可继承属性3.1 盒模型相关属性3.2 背景相关属性 四、属性初始值4.1 根元素4.2 属性的初始值4.3 得出结论 五、强制继承5.1 in…...

SpringBoot中6种自定义starter开发方法

在SpringBoot生态中,starter是一种特殊的依赖,它能够自动装配相关组件,简化项目配置。 自定义starter的核心价值在于: • 封装复杂的配置逻辑,实现开箱即用 • 统一技术组件的使用规范,避免"轮子"泛滥 • 提高开发效率,减少重复代码 方法一:基础配置类方式 …...

时间自动填写——电子表格公式的遗憾(DeepSeek)

now()/today()缘源来&#xff0c;人肉值粘胜无依。用函数抓取系统时间&#xff0c;人肉CTRLC“永葆青春”——直接时间数据存储。 笔记模板由python脚本于2025-04-23 23:21:44创建&#xff0c;本篇笔记适合想要研究电子表格日期自动填写的coder翻阅。 【学习的细节是欢悦的历程…...

AUTODL关闭了程序内存依然占满怎么办

AutoDL帮助文档 关闭了程序&#xff0c;使用nvidia-smi查看&#xff0c;内存任然爆满&#xff1a; 执行 ps -ef | grep train | awk {print $2} | xargs kill -9...

Spark集群搭建之Yarn模式

1.把spark安装包复制到你存放安装包的目录下&#xff0c;例如我的是/opt/software cd /opt/software&#xff0c;进入到你存放安装包的目录 然后tar -zxvf 你的spark安装包的完整名字 -C /opt/module&#xff0c;进行解压。例如我的spark完整名字是spark-3.1.1-bin-hadoop3.2.…...

CSS-跟随图片变化的背景色

CSS-跟随图片变化的背景色 获取图片的主要颜色并用于背景渐变需要安装依赖 colorthief获取图片的主要颜色. 并丢给背景注意 getPalette并不是个异步方法 import styles from ./styles.less; import React, { useState } from react; import Colortheif from colorthief;cons…...

一,开发环境安装

环境安装选择的版本如下 Python3.7 Anaconda5.3.1 CUDA 10.0 Pycharm Anaconda安装:下载地址 CUDA 10.0安装,包下载地址...

局部最小实验--用最小成本确保方向正确

### **将「局部最小实验」融入「简单、专注、本分」认知框架的实践方案** 你的核心认知框架是 **「简单、专注、本分」**&#xff0c;而 **「局部最小实验」**&#xff08;MVP思维&#xff09;本质上是一种 **低成本验证、快速迭代** 的方法论。二者看似矛盾&#xff08;简单…...

【网络应用程序设计】实验三:网络聊天室

个人博客&#xff1a;https://alive0103.github.io/ 代码在GitHub&#xff1a;https://github.com/Alive0103/XDU-CS-lab 能点个Star就更好了&#xff0c;欢迎来逛逛哇~❣ 主播写的刚够满足基本功能&#xff0c;多有不足&#xff0c;仅供参考&#xff0c;还请提PR指正&#xff…...

【泊松过程和指数分布】

泊松过程的均值函数与方差函数计算 1. 泊松过程的定义 泊松过程是一个计数过程 { N ( t ) , t ≥ 0 } \{N(t), t \geq 0\} {N(t),t≥0}&#xff0c;满足以下条件&#xff1a; 独立增量&#xff1a;在不相交时间段内事件发生次数相互独立&#xff1b;平稳增量&#xff1a;在时…...

leetcode-排序

排序 面试题 01.01. 判定字符是否唯一 题目 实现一个算法&#xff0c;确定一个字符串 s 的所有字符是否全都不同。 示例 1&#xff1a; 输入: s "leetcode" 输出: false 示例 2&#xff1a; 输入: s "abc" 输出: true限制&#xff1a; 0 < len(s) &…...

Axure中继器表格:实现复杂交互设计的利器

在产品原型设计领域&#xff0c;Axure凭借其强大的元件库和交互功能&#xff0c;成为设计师们手中的得力工具。其中&#xff0c;中继器元件在表格设计方面展现出了独特的优势&#xff0c;结合动态面板等元件&#xff0c;能够打造出功能丰富、交互体验良好的表格原型。本文将深入…...

容器内部无法访问宿主机服务的原因及解决方法

容器内部无法访问宿主机服务的原因及解决方法 问题原因 当你在Docker容器内部尝试访问宿主机上的服务(如192.168.130.148:8000)时失败,通常有以下几种原因: 网络隔离:Docker容器默认使用自己的网络命名空间,与宿主机网络隔离IP地址误解:容器内看到的宿主机IP与外部网络不…...

IMU---MPU6050

一、芯片概述 1. 基本定位 型号&#xff1a;MPU6050&#xff0c;InvenSense&#xff08;现TDK&#xff09;推出的全球首款6轴MEMS运动传感器&#xff0c;集成3轴加速度计、3轴陀螺仪&#xff0c;内置温度传感器&#xff08;非6轴核心功能&#xff09;。定位&#xff1a;低成本…...

提高Spring Boot开发效率的实践

Spring Boot开发效率的重要性 Spring Boot 作为一个开源的 Java 框架,旨在简化新 Spring 应用和微服务的创建与开发 1。其核心特性,如自动配置、约定优于配置以及内嵌服务器,极大地降低了开发门槛,使得开发者可以更专注于业务逻辑的实现 1。在现代应用开发领域,Spring Bo…...

Spring Boot的优点:赋能现代Java开发的利器

Spring Boot 是基于 Spring 框架的快速开发框架&#xff0c;自 2014 年发布以来&#xff0c;凭借其简洁性、灵活性和强大的生态系统&#xff0c;成为 Java 后端开发的首选工具。尤其在 2025 年&#xff0c;随着微服务、云原生和 DevOps 的普及&#xff0c;Spring Boot 的优势更…...

Python内置函数---breakpoint()

用于在代码执行过程中动态设置断点&#xff0c;暂停程序并进入调试模式。 1. 基本语法与功能 breakpoint(*args, kwargs) - 参数&#xff1a;接受任意数量的位置参数和关键字参数&#xff0c;但通常无需传递&#xff08;默认调用pdb.set_trace()&#xff09;。 - 功能&#x…...

2.RabbitMQ - 入门

RabbitMQ 入门 文章目录 RabbitMQ 入门一、快速入门1.1 介绍1.2 创建项目1.3 简单入门 二、Work模型三、交换机3.1 Fanout3.2 Direct3.3 Topic 四、声明队列和交换机4.1 配置文件4.2 注解 五、消息转换器 一、快速入门 1.1 介绍 官方的API较为麻烦&#xff0c;我们使用官方推…...

智能配送机器人控制系统设计

标题:智能配送机器人控制系统设计 内容:1.摘要 随着物流行业的快速发展&#xff0c;智能配送机器人的需求日益增长。本文的目的是设计一套高效、稳定的智能配送机器人控制系统。方法上&#xff0c;采用了先进的传感器技术、定位算法和路径规划策略&#xff0c;确保机器人能准确…...

2025.04.23华为机考第一题-100分

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 01. 星空探索者 问题描述 LYA是一位天文学爱好者,她拍摄了一张星空照片并将其数字化为二维亮度图。在这张图像中,每个像素点的值代表该位置的亮度。现在,LYA想要寻找特定亮度的星…...

MCP 基于 TypeScript 的完整示例,包含stdio、sse多种用法和调试,对于构建自己的API工具链很有用

typescript-mcp-demo 这是一个基于 Model Context Protocol (MCP) 的 TypeScript 示例项目&#xff0c;展示了如何创建一个简单的 MCP 服务器&#xff0c;包含基本的工具&#xff08;tools&#xff09;和资源&#xff08;resources&#xff09;功能。 官网&#xff1a;https:…...

【计算机视觉】CV项目实战- SORT 多目标跟踪算法

SORT 多目标跟踪算法&#xff1a;从原理到实战的完整指南 一、SORT算法核心解析1.1 算法架构1.2 关键技术组件 二、实战环境搭建2.1 基础环境配置2.2 数据准备 三、核心功能实战3.1 基础跟踪演示3.2 自定义检测器集成3.3 性能评估 四、高级应用与优化4.1 针对遮挡场景的改进4.2…...

常用第三方库精讲:cached_network_image图片加载优化

常用第三方库精讲&#xff1a;cached_network_image图片加载优化 在Flutter应用开发中&#xff0c;图片加载是一个非常重要的环节。合理的图片加载策略不仅能提升用户体验&#xff0c;还能优化应用性能。本文将深入讲解cached_network_image库的使用&#xff0c;以及如何通过它…...

xcode 16 遇到contains bitcode

问题 "id" : "xxx-xxx-xxx","status" : "409","code" : "STATE_ERROR.VALIDATION_ERROR","title" : "Validation failed","detail" : "Invalid Executable. The executable …...

MySQL数据库精研之旅第十期:打造高效联合查询的实战宝典(一)

专栏&#xff1a;MySQL数据库成长记 个人主页&#xff1a;手握风云 目录 一、简介 1.1. 为什么要使用联合查询 1.2. 多表联合查询时的计算 1.3. 示例 二、内连接 2.1. 语法 2.2. 示例 三、外连接 4.1. 语法 4.2. 示例 一、简介 1.1. 为什么要使用联合查询 一次查询需…...

Sentinel源码—9.限流算法的实现对比二

大纲 1.漏桶算法的实现对比 (1)普通思路的漏桶算法实现 (2)节省线程的漏桶算法实现 (3)Sentinel中的漏桶算法实现 (4)Sentinel中的漏桶算法与普通漏桶算法的区别 (5)Sentinel中的漏桶算法存在的问题 2.令牌桶算法的实现对比 (1)普通思路的令牌桶算法实现 (2)节省线程的…...

单片机外设模块汇总与介绍

一、基础外设 GPIO&#xff08;通用输入输出&#xff09; 功能&#xff1a;数字信号输入/输出&#xff0c;支持推挽、开漏模式。 应用&#xff1a;控制LED、按键检测、数字传感器接口。 配置要点&#xff1a; 输入模式&#xff1a;上拉/下拉电阻配置 输出模式&#xff1a;…...

git lfs下载大文件限额

起因是用 model.load_state_dict(torch.load())加载pt权重文件时&#xff0c;出现错误&#xff1a;_pickle.UnpicklingError: invalid load key, ‘v’. GPT告诉我&#xff1a;你的 pt 文件不是权重文件&#xff0c;而是模型整体保存&#xff08;或根本不是 PyTorch 文件&#…...

第4天:Linux开发环境搭建

&#x1f9f0; 第4天&#xff1a;Linux开发环境搭建 一、GCC 编译器 &#x1f4cc; 1. 什么是 GCC&#xff1f; GCC&#xff08;GNU Compiler Collection&#xff09;是 GNU 工程开发的编译器集合&#xff0c;主要支持 C、C、Fortran 等语言的编译&#xff0c;是 Linux 系统中…...

“在中国,为中国” 英飞凌汽车业务正式发布中国本土化战略

3月28日&#xff0c;以“夯实电动化&#xff0c;推进智能化&#xff0c;实现高质量发展”为主题的2025中国电动汽车百人会论坛在北京举办。众多中外机构与行业上下游嘉宾就全球及中国汽车电动化的发展现状、面临的挑战与机遇&#xff0c;以及在技术创新、市场布局、供应链协同等…...

【AI应用】免费代码仓构建定制版本的ComfyUI应用镜像

免费代码仓构建定制版本的ComfyUI应用镜像 1 创建代码仓1.1 注册登陆1.2 创建代码仓1.5 安装中文语言包1.4 拉取ComfyUI官方代码2 配置参数和预装插件2.1 保留插件和模型的版本控制2.2 克隆插件到代码仓2.2.1 下载插件2.2.2 把插件设置本仓库的子模块管理3 定制Docker镜像3.1 创…...

新市场环境下新能源汽车电流传感技术发展前瞻

新能源革命重构产业格局 在全球碳中和战略驱动下&#xff0c;新能源汽车产业正经历结构性变革。国际清洁交通委员会&#xff08;ICCT&#xff09;最新报告显示&#xff0c;2023年全球新能源汽车渗透率突破18%&#xff0c;中国市场以42%的市占率持续领跑。这种产业变革正沿着&q…...

ctfhub-RCE

关于管道操作符 windows&#xff1a; 1. “|”&#xff1a;直接执行后面的语句。 2. “||”&#xff1a;如果前面的语句执行失败&#xff0c;则执行后面的语句&#xff0c;前面的语句只能为假才行。 3. “&”&#xff1a;两条命令都执行&#xff0c;如果前面的语句为假则直…...

SSE(Server-Sent Events)技术详解:轻量级实时通信的全能方案

一、实时通信技术演进与SSE定位 1.1 主流实时通信技术对比 #mermaid-svg-1VQcZqAOmMoxosiW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-1VQcZqAOmMoxosiW .error-icon{fill:#552222;}#mermaid-svg-1VQcZqAOmMox…...

QT项目----电子相册(4)

文章目录 前言一、右侧区域PicShow1.创建PicShow2.创建PicButton3.效果图qss 4.设置动画QGraphicsOpacityEffectQPropertyAnimation 5.双击左侧图片目录 右侧显示图片解决缩放时卡顿的问题 二、删除相册实现思路代码实现 总结 前言 提示&#xff1a;这里可以添加本文要记录的大…...

Sentinel源码—9.限流算法的实现对比一

大纲 1.漏桶算法的实现对比 (1)普通思路的漏桶算法实现 (2)节省线程的漏桶算法实现 (3)Sentinel中的漏桶算法实现 (4)Sentinel中的漏桶算法与普通漏桶算法的区别 (5)Sentinel中的漏桶算法存在的问题 2.令牌桶算法的实现对比 (1)普通思路的令牌桶算法实现 (2)节省线程的…...

46. 全排列

题目 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; 输入&#xff1a…...