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

【TCP】三次挥手,四次挥手详解--UDP和TCP协议详解

活动发起人@小虚竹 想对你说:

这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!我们一起发掘写作的魅力,书写出属于我们的故事。我们诚挚邀请你参加为期14天的创作挑战赛!

提醒:在发布作品前,请将不需要的内容删除。

各位看官,大家早安午安晚安呀~~~

如果您觉得这篇文章对您有帮助的话

欢迎您一键三连,小编尽全力做到更好
欢迎您分享给更多人哦

今天我们来学习【Java网络编程】-【TCP】三次挥手,四次挥手详解--UDP和TCP协议详解

目录

1.UDP协议

1.1.UDP报文长度

1.2.校验和

1.2.1什么是校验和,校验和有什么用?

1.2.2.校验和是怎么计算出来的?

1.2.3:MD5

1.3.基于UDP实现应用层协议

2.TCP协议

2.1.TCP报文格式

2.2.TCP可靠传输(TCP最开始的核心)

2.2.1.确认应答

2.2.2.超时重传(三次问题)

2.2.3.连接管理(建立连接+断开连接)

2.2.4.四次挥手

2.3.提高效率

2.3.1.滑动窗口

2.3.2.流量控制

2.3.3.拥塞控制

2.3.4.延时应答

2.3.5.捎带应答(就是把本来两个数据段一起返回了)

2.4.粘包问题

2.5.异常的处理情况

2.5.1.进程异常结束

​编辑

2.5.2.通信直接断开了(进程都没来得及杀)(想回应但是回应不了)

3.UDP和TCP之间的对比


图解:(TIME_WAIT)的作用以及四次挥手的图解

大哥和小弟在心里(兄弟在心中)

首先我们要明白学习一个协议最后重要的就是了解这个协议的报文格式

协议本身就是一个简单的规则

所谓的报文格式就是按照一定的格式进行字符串拼接(当然这里是二进制拼接)

1.UDP协议

UDP的报文格式比TCP还是要简单不少的,因此我们要讲解的点不多,主要是以下两点:

1.UDP报文长度的一些问题

2.UDP校验和

1.1.UDP报文长度

问题一:

大家可以看到UDP报文长度一共就64kb,这对于以前的计算机还不错,但是如今看来就很捉襟见肘了,所以能不能把UDP进行升级处理(报文长度变长)?

当然可以!

但是代价是巨大的,如果要升级,就要通信双方都要去升级(全世界都要去升级,而且UDP是操作系统内核实现的,操作系统也要进行升级),所以说成本太大的我们还不考虑升级

除非未来出现一个新的协议把UDP完全替代掉。

问题二:

还有的人说:既然UDP不能一次性传输,能不能把数据进行拆包和组包?

答:

这个方案不太行(开发成本太大),我们如何进行拆包,万一数据丢失了,我们再进行如何校验,又如何组包?这里面有很大的开发和测试成本!!!

但是TCP就可以解决这个问题(不过带来的是性能的下降)

1.2.校验和

1.2.1什么是校验和,校验和有什么用?

网络通信中,往往都会因为一些信号干扰的因素,导致我们传输的数据出现问题,这个就需要校验和帮助我们检查一下数据的正确完整性~

首先我给大家的例子:

我给小明说一个我的游戏账户密码(很长),我就念给他听了,他说记到纸上了

然后他疏忽了少写了一个字母,这个时候就很尴尬(他回家了登录不上游戏了)

加一个校验和~

但是如果我跟他说一个20个字母,他就可以检查到他只写了19个字母,当时就知道错误了

这个校验和就可以起到检查数据是否正确的作用~~

具体解释

1.2.2.校验和是怎么计算出来的?

计算校验和有很多算法,这里UDP使用的算法是CRC算法(循环冗余算法

解释:

把当前要计算校验和的数据的每一个字节都进行累加,把这个结果保存到校验和中(校验和一共两个字节),就算溢出也没关系。

但是这个CRC算法不是很靠谱,导致两个不同的数据得到一样的CRC校验和的概率不小

就譬如前一个字节少1,后一个字节多1(有不小的概率出现)

1.2.3:MD5

要计算校验和MD5就是一个很好的算法(和他类似的还有sha1算法)

sojson工具(包含md5加密工具)

我们讲解一下MD5的特性

  1. 定长:无论你原始数据多长,计算出来的md5都是固定长度(这一点就很好,毕竟校验和本身就不应该很长)
  2. 分散:两个原始数据很接近的数据,只要一个字节不同,md5计算出来的值也会差距很大     (因此MD5也很适合做hash算法,把一个几乎相同的key尽量做到分散,降低hash冲突)
  3. 不可逆:给一个原始数据计算出MD5很容易,但是反过来极其困难(理论上是不可行的)

1.3.基于UDP实现应用层协议

NFS:网络文件系统

TFTP:简单文件传输协议

DHCP:动态主机配置协议

BOOTP:启动协议(用于无盘设备启动)

DNS:域名解析协议(后面我们会讲解这个)

当然,也包括你自己写UDP程序时自定义的应用层协议

2.TCP协议

TCP相关特性

1.有连接 Socket clientScoket  = serverSocket.accept();

用过ServerSocket api的accept方法把内核里已经建立好的连接拿过来(通过三次握手建立的连接)

2.可靠传输(我们接下俩要讲述的重点)

3.面向字节流(我们通过字节流 读/写 网卡抽象成文件里面的数据)

4.全双工(可以同时互相发送消息)

2.1.TCP报文格式

图解:(没讲到的后续会进行讲解)

2.2.TCP可靠传输(TCP最开始的核心)

解释:(得知道对方收没收到消息,如果对方一直没回应,就进行补救)

因此为了保证可靠传输我们引入如下3个机制

1.确认应答

2.超时重传

3.连接管理(三次握手,四次挥手)

2.2.1.确认应答

确认应答:顾名思义,接收方会发送方返回一个应答报文(acknowledge ,ack)

如果发送方收到这个应答报文了,就知道自己的数据已经发送成功了。

但是,网络上不稳定的情况可能会导致我们的数据出现“后发先至”的情况

所以TCP将每个字节的数据都进行了编号——即为序列号

解释:(后面我们讲述到滑动窗口的时候我们还会讲解到)

有了序号,我们只需要确认回复给发送方最后一个数据(发送方就可以确定其他数据都来了),因为如果数据没全来的话,我们是不会给发送方发送1001的

如何区分一个数据包是一个普通的数据还是ack应答报文数据呢?

TCP的可靠传输:

确认应答 是TCP最核心的机制,再借助其他机制辅助最终完成可靠传输

2.2.2.超时重传(四个问题)

我们是可以进行通过确认应答来保证我们的数据传输到了

第一个问题:但是如果我们的数据包都丢了,怎么应答呢?

(网络上也会出现“堵车”的问题:如果数据包太多,就会在路由器/交换机上出现堵车,但是路由器针对“堵车”的处理会比较除暴,它不会把积压的数据保存好,而是把这些中的大部分数据都丢调)

答:

其实一直不应答也是一种应答(给女神发消息女神一直不回也是一种应答)哈哈哈哈

这个时候我们就需要进行重新传输了——超时重传

我们肯定是等待了一会发现接收方还一直不给我们返回ack(或者已经返回了ack我们没有收到)这两种情况都是认为对方没有收到,我们就要超时重传的功能了!!!

再来一个问题:

如果是对方已经收到这个数据还返回了ack,只是我们没有收到,这个时候发送的数据不就会重复了吗?

答:

TCP里面会有一个“接收缓冲区”就是一个内存空间,保存当前已经接收到的数据,以及数据的序号。

如果接收方发现,当前发送的数据是再接收缓冲区存在的数据,就会把这个数据丢弃掉,确保我们应用程序进行read的时候接受到的只是一条数据

图解

第三个问题:发送方何时进行重传?等待时间?

1.这个等待时间是可以进行配置的,不同的系统上面不同,也可以修改一些内核参数来引起这里的时间变化

2.等待的时间也会动态变化,没多经历一次超时,等待的时间都会变长(但是也不会无限拉长,如果时间长到一定程度,就会放弃TCP连接(触发TCP重新连接操作))

第四个问题:那这样TCP的可靠性不就会导致性能的下降了吗?

当然——等价交换是炼金术不变的原则

传输效率下降,复杂程度变高

传输层的协议主要是TCP和UDP但是还是有别的协议可以做到TCP和UDP之间的效果的

譬如(quic……)

2.2.3.连接管理(建立连接+断开连接)

三次握手和四次挥手终于要来啦~~~

握手其实就是打个招呼

TCP的三次握手:TCP在建立连接的过程中,需要通信双方一共“打三次招呼”才能够建立

A先给B发送一个“同步报文段”(没有数据的应用层数据包,没有载荷)(标志位为SYN为1的时候这个这个报文就是一个同步报文段)

然后B给A回复一个ack(这个时候只有A能确定它发送过去的数据能送到,但是B不知道B发送的数据报是什么情况,所以B也要给A发送一个“同步报文段”如果A也能给B的发送一个同步报文段,那么A就知道自己没问题了)

所以情况如下

这个时候A和B就记录了对方的信息,就构成了逻辑上的“连接”

建立连接的过程就是通信双方都给对方发起syn,也都要给对方反馈ack(本来是四次握手,但是中间两次恰好可以合并成一次)

三次握手的作用(就是建立连接的作用)?

1.建立连接肯定是确保网络通信是否畅通

2.让发送方和接受方确认自己发送能力和接收能力是否正常

(如果B不给A发送syn,A就不会回应。B也不知道自己的ackA收到没有,如果A回应了ack并且B收到了,B就能确定自己的发送能力和接受能力都是正常的)

3.让通信双方对于一些重要的参数进行协商

譬如:

(1)超时重传时间

(2)序列号(序列号确保数据传输的顺序。在 TCP 通信中,发送方将数据分成多个数据包,并为每个数据包分配一个唯一的序列号(具体从那个数字开始也是需要协商的不是拍脑瓜子))

(3)窗口大小(我们等会滑动窗口会讲解)

…………

给大家一个具体的例子(这就协商出来按照65w进行充电)

2.2.4.四次挥手

接下来我带大家看一下一张完整的TCP状态转换图

建立连接是客户端主动发起的

但是断开连接客户端和服务器都可以主动发起

FIN:结束报文段(就像建立连接的SYN(同步报文段)都是一个标志位)

问题一:问什么是四次挥手而不是三次挥手?(三次挥手在延时应答的情况下也可以实现)

问题二:小编一开始学的时候就想着(你都要结束了还搞这么正式干嘛?)

直接两次挥手不就得了?

但是我少考虑了很多

解释,很重要!

服务器还要处理数据,可能还要给客户端响应其他的数据(客户端这个时候还不能关闭)

等到服务器发送FIN的时候才能证明数据已经处理完毕了(这个时候就是三次握手了)。但是服务器还不能关闭,万一客户端没收到FIN(客户端没收到FIN时不能关闭因为服务器可能还有数据要通信),服务器还要重传。所以服务器还要等待客户端返回ack才能结束。(这里就是四次握手了)

图解:(TIME_WAIT)的作用以及四次挥手的图解

TIME_WAIT作用:防止最后一个ack走丢(小弟担心大哥又多等待了一会)

我们上述的机制都是在为可靠传输效力,但是可靠传输下来,牺牲的却是效率

那我们怎么来提高效率呢?接下来我带领大家学习以下几个机制~

2.3.提高效率

接下来给大家看一下我的总结思路:

2.3.1.滑动窗口

变成这样~~~

然后进行“滑动”窗口(只要有ack回来就继续发)

但是出现了丢包的情况该如何呢?

分为两种情况~

第一种情况:

就像别人问你上初中了没有,你直接说我已经大学了(那我肯定早就上过初中了呀)

第二种情况

等到1001~2000传输到了之后,7001这个确认序号说不定就该传输过去了(3001,4001,就不用传输回去了哈哈哈)

接下来我们要说的是窗口大小的问题(窗口不能无限的大)

2.3.2.流量控制

是窗口大小的问题(窗口不能无限的大),窗口太大了,服务器处理数据就处理不过来了

这个时候“负反馈”就很重要了调整窗口的大小

发送方的发送速率不能超过接收方的处理能力

接收方每次收到数据,都会通过ack(应答报文)返回给发送方,然后发送方就会按照这个数值调整窗口的大小(不能超过)

为啥要探测呀:

刚刚不让你传输了,现在让你传输了(怕我更新可窗口通知了你,但是通知你的数据报丢了,所以一会不通知你,你就要试探一下(发个窗口探测包),问问好了没)

但是传输路径上的节点的接收能力也要计算在内呀(不能量化,我们就一点一点的增大窗口,然后综合窗口大小,选小的)。

2.3.3.拥塞控制

但是传输路径上的节点的接收能力很难量化,所以我们就一点一点的增大窗口,然后综合窗口大小,选小的)。(实验的方式)


阈值(sstresh):指数增长的终点,线性增长的起点(大加速度变成小加速度)

首先:

客户端先按照比较低的速度发送数据(小一点窗口)

如果数据传输的很顺利(几乎没有丢包的情况)--> 把窗口尝试调大,大到一定的程度,中间节点可能就会出现了丢包问题。这个时候发送方发现丢包了 --> 就把窗口调小一点 。如果还是丢包就继续调小,不丢就增大,--> 最终达到动态平衡的效果

具体过程如图

改进措施如下:

总之:

流量控制:通过接收方返回的剩余缓冲区大小来确定窗口大小(主要考虑接收方处理能力)(定量)

拥塞控制:通过实验的方式一步一步动态稳定窗口的大小(主要考虑中间节点的处理能力)

(非定量)

最终窗口大小取二者中最小值

2.3.4.延时应答

而且我们通过延时应答也可以把四次挥手变成三次挥手

2.3.5.捎带应答(就是把本来两个数据段一起返回了)

就像四次挥手变成三次一样

刚好把response和ack一起返回

进一步提高了效率

本来要传输两个tcp数据包,我们要封装分用两次

但是用过上述的操作,就可以把两个数据包合并在一起了,现在我们封装分用一次就行了

2.4.粘包问题

很多面向字节流传输数据的时候都会出现这样的情况

但是UDP就没有这样的问题(UDP本来就是一个一个的数据包(有边界的))

所以我们解决粘包问题的关键就是怎么搞一个边界出来

这就让我想起来“循环队列”

当head 和 tail 重合的时候到底是这个数组满了还是数组是空的?

两个方案

1.搞一个标志位(浪费一个格子,当head =  tail + 1的时候就是满的,head = tail就是空的)

2.引入有效长度(当length = array.length就是慢的 ,length = 0就是空的)

这个时候也是

1.搞一个标志位(引入分割符)

2.引入长度(譬如先读两个两个直接的数字表示这个数据包中的字节有多长)

2.5.异常的处理情况

一般分为两种情况

1.进程异常结束

2.进程都没来得及杀,通信就断了

2.5.1.进程异常结束

首先我要声明

TCP 连接的状态(如 ESTABLISHED(已经建立好连接)TIME_WAIT(延时等待) 等)由内核协议栈维护,而非应用程序。

在 TCP 协议中,四次挥手是由操作系统内核实现的(severSocket.accept()只是拿到内核建立好的连接),而非依赖于应用程序显式调用 socket.close()。当进程异常终止时(如崩溃或被强制杀死),操作系统会主动回收该进程占用的资源(包括文件描述符),并触发内核协议栈的 TCP 连接关闭流程。

在Java中,当创建一个Socket对象时,底层操作系统会分配一个文件描述符来管理这个连接。进程异常终止时,操作系统通常会负责清理进程占用的资源,包括关闭打开的文件描述符。

进程异常结束的两种情况:进程崩溃和主机关机了(用户自己关机的)

2.5.2.通信直接断开了(进程都没来得及杀)(想回应但是回应不了)

1.主机掉电(就像插头松了一样)(又分为客户端掉电或者服务器掉电)

(1)客户端掉电:本来还在正常的通信,结果客户端直接掉电了,服务器都懵了(客户端怎么还不返回ack?)然后就开始超时重传,结果还是一直不回(对方挂了?)。

再然后发送“心跳包”,结果还是不回,然后就认为客户端挂了这个时候就可以单方面释放连接了。

图解:

注解:

服务器不是这个时候才会发送“心跳包”,而是周期的就会发送心跳包(不带业务的数据包),期望回复,多次没回复就认为对方挂了

(2)服务器掉电:

还是一样的,客户端一直发数据,服务器不回应;超时重传还是不回应。客户端会发送一个“复位报文段”(RST)(reset),如果FST发过去还没有回复,就会单方面释放连接

ACK:应答报文

RST:复位报文段

SYN:同步报文段(建立连接时发送),建立好连接进入(ESTABLISH状态)

FIN:结束报文段(主动发起FIN的进入TIME_WAIT状态)

2.网线断开(和掉电十分相似,不过这俩一个发复位报文段,一个发心跳包,但是就是连接不上哈哈)。

TCP的心跳机制:再分布式系统中十分常见。一般检测一个机器是否挂了都是通过“心跳机制”来检测(不过后续使用的心跳机制都是在应用程序中自己实现的(一般都是毫秒级别了),而不是TCP的心跳(时间太长)

3.UDP和TCP之间的对比

第一点对比:

TCP:可靠传输,有重组机制(能传输很大的数据)。

在接收方,TCP协议会根据每个TCP段的序列号来重组这些数据。100kb的数据可以分成好几个段,接收方的TCP协议会按照序列号顺序将这些TCP段重新组装成完整的100 KB数据。(适合绝大部分的场景)

UDP:效率更高,无重组机制(只能传输很小的数据)。

UDP协议本身不提供数据分段和重组的功能。每个UDP数据报(datagram)(更适合于“可靠性不是很敏感,性能敏感,数据不多”的场景:譬如同一个局域网主机之间的通信

而且在以太网中UDP和TCP数据报最大不会超过1500字节(受MTU(最大传输单元)的影响)(后面我们会讲解到)

第二:

UDP天然适合“广播传输”(给这个局域网内所有的设备都发送信息),而TCP不支持(TCP只能遍历这个局域网设备里面的所有IP实在是太麻烦)

这是因为UDP的socket能给“广播地址”建立联系(譬如192.168.255),但是TCP无法和这个地址建立联系

第三:若UDP想要实现TCP的可靠传输,可以参考TCP的思路

确认应答(引入序号和确认序号,这样也可以组包啦)

超时重传(包丢了)

提高效率再滑动窗口等等我们TCP可靠传输的特性…………

结束啦~~~

最后一个解答

大家可能会疑惑,像TCP和UDP这么NB的协议都是谁整出来的?

当然是一群神秘的大佬,把这些协议都整理出一个标准的文档---RFC标准文档

上述就是【TCP】三次挥手,四次挥手详解--UDP和TCP协议详解的全部内容啦~~~

能看到这里相信您一定对小编的文章有了一定的认可。

有什么问题欢迎各位大佬指出
欢迎各位大佬评论区留言修正~~

您的支持就是我最大的动力​​​!!

相关文章:

【TCP】三次挥手,四次挥手详解--UDP和TCP协议详解

活动发起人小虚竹 想对你说: 这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧&#xff01…...

栈(LIFO)算法题

1.删除字符串中所有相邻的重复字符 注意,我们需要重复处理,而不是处理一次相邻的相同元素就结束了。对示例来说,如果只进行一次处理,结果为aaca,但是处理之后又出现了相邻的重复元素,我们还得继续处理&…...

印章/公章识别:PaddleX下的“Seal-Recognition”模型

最近做项目需要对印章进行识别,并提取其中的印章文字,又不希望这个模型太大,还要方便部署,于是乎这个模型是个不错的选择。 一、模型简介 “Seal-Recognition”模型是PaddleX旗下的一款模型(PaddleX 是基于飞桨框架构…...

从LLM出发:由浅入深探索AI开发的全流程与简单实践(全文3w字)

文章目录 第一部分:AI开发的背景与历史1.1 人工智能的起源与发展1.2 神经网络与深度学习的崛起1.3 Transformer架构与LLM的兴起1.4 当前AI开发的现状与趋势 第二部分:AI开发的核心技术2.1 机器学习:AI的基础2.1.1 机器学习的类型2.1.2 机器学…...

DeepSeek入门宝典——行业应用篇

大家好,我是吾鳴。 今天吾鳴要给大家分享一份由51CTO智能研究院出品的DeepSeek报告——《DeepSeek入门宝典——行业应用篇》。这份报告主要从DeepSeek核心能力、行业赋能与应用案例、合作伙伴与生态建设和学习资料与体系化方案做了详细的介绍,报告一共有…...

K8S学习之基础三十一:k8s中RBAC 的核心概念

Kubernetes (k8s) 中的 RBAC(Role-Based Access Control,基于角色的访问控制)是一种用于管理用户和服务账户对集群资源访问权限的机制。RBAC 允许管理员通过定义角色(Role)和角色绑定(RoleBinding&#xff…...

JAVA数据库技术(一)

JDBC 简介 JDBC(Java Database Connectivity)是Java平台提供的一套用于执行SQL语句的Java API。它允许Java程序连接到数据库,并通过发送SQL语句来查询、更新和管理数据库中的数据。JDBC为不同的数据库提供了一种统一的访问方式,使…...

【Agent】OpenManus-Flow组件详细分析

1. Flow架构概述 OpenManus 的Flow组件实现了一个灵活的工作流管理系统,主要用于协调多个智能体的协作,以完成复杂任务。Flow组件的核心是基于计划的执行模型,它将任务分解为一系列步骤,然后逐步执行这些步骤,直到任务…...

MySQL环境安装详细教程(Windows/macOS/Linux)

摘要:本文详细介绍了在Windows、macOS和Linux三大操作系统下安装MySQL数据库的完整流程,帮助开发者快速搭建本地MySQL环境。 一、MySQL安装前准备 官网下载 访问MySQL官网 → 选择"Downloads" → 选择"MySQL Community (GPL) Downloads&…...

【人工智能基础2】人工神经网络、卷积神经网络基础、循环神经网络、长短时记忆网络

文章目录 三、人工神经网络1. 神经元感知模型2. 神经网络模型3. 学习规则:修改神经网络的权重和偏置反向传播算法(BP)优化器 - 梯度下降法 四、卷积神经网络基础(CNN)1. 基本原理2. 计算过程 五、循环神经网络(RNN&…...

如何查看windows系统的硬件环境(附方法

方法一:使用命令指示符查询 在“开始”菜单中搜索:命令指示符,并以管理员身份打开, 输入:systeminfo,就可以查看硬件、CPU、处理器等详细内容 systeminfo 方法二:在资源监视器中查看 按住 “…...

基于树莓派的水果分类系统(论文+源码)

针对小型农户的在水果加工销售环节中的分类需求,本文设计并实现了基于树莓派的视觉识别分类系统。本章根据所选水果的具体情况,简述系统各模块的实现方法,设计树莓派的程序算法,并选择合适的器件型号,开发所用的辅助工…...

Gemini Robotics:将人工智能带入物理世界

25年3月来自谷歌的技术报告“Gemini Robotics: Bringing AI into the Physical World”。 大型多模态模型的最新进展,已使数字领域出现卓越的通才能力,但将其转化为机器人等物理智体仍然是一项重大挑战。一般有用的机器人需要能够理解周围的物理世界&am…...

2.5[frontEnd]

requestAnimationFrame 是 浏览器原生 API,定义在 window 对象中,属于 Web API 的一部分。无需任何导入即可直接使用,其类型定义包含在 TypeScript 标准库中。 React 组件挂载时执行该 useEffect 初始化节流计时器 lastEmit 和 25ms 触发间隔…...

【动手学深度学习】#2线性神经网络

主要参考学习资料: 《动手学深度学习》阿斯顿张 等 著 【动手学深度学习 PyTorch版】哔哩哔哩跟李牧学AI 目录 2.1 线性回归2.1.1 线性回归的基本元素线性模型损失函数解析解随机梯度下降 2.1.3 最大似然估计 2.2 线性回归从零开始实现2.2.1 生成数据集2.2.2 读取数…...

C语言动态内存管理(上)

欢迎拜访:雾里看山-CSDN博客 本篇主题:C语言动态内存管理(上) 发布时间:2025.3.16 隶属专栏:C语言 目录 为什么需要动态内存管理静态分配的局限性动态分配的优势 动态内存函数malloc函数介绍函数使用 free函数介绍函数使用 calloc…...

图解多头注意力机制:维度变化一镜到底

目录 一、多头注意力机制概述二、代码实现1. pyTorch 实现2. tensorFlow实现 三、维度变化全流程详解1. 参数设定2. 维度变化流程图3. 关键步骤维度变化 四、关键实现细节解析1. 多头拆分与合并2. 注意力分数计算3. 掩码处理技巧 五、完整运行示例六、总结与常见问题1. 核心优势…...

Navicat如何查看密码

近期遇到需要将大部分已存储的navicat数据库转发给其他人,于是乎进行导出文件 奈何对方不用navicat,无法进行文件的导入从而导入链接 搜罗navicat的密码查看,大部分都为php代码解析 以下转载GitHub上看到的一个python代码解析的脚本 这里是对…...

第4节:分类任务

引入: 独热编码(one-hot):对于分类任务的输出,也就是是或不是某类的问题,采取独热编码的形式将y由一离散值转化为连续的概率分布,最大值所在下标为预测类 输入的处理:对于任意一张…...

EasyCVR安防视频汇聚平台助力工业园区构建“感、存、知、用”一体化智能监管体系

在现代工业园区的安全管理和高效运营中,视频监控系统扮演着不可或缺的角色。然而,随着园区规模的扩大和业务的复杂化,传统的视频监控系统面临着诸多挑战,如设备众多难以统一管理、数据存储分散、智能分析能力不足、信息利用率低下…...

计算机网络——DNS

一、什么是DNS? DNS(Domain Name System,域名系统) 是互联网的核心服务,负责将人类可读的域名(如 www.baidu.com)转换为机器可识别的 IP地址(如 14.119.104.254)。它像一…...

STC89C52单片机学习——第20节: [8-2]串口向电脑发送数据电脑通过串口控制LED

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.03.15 51单片机学习——第20节: [8-2]串口向电脑发送数据&电脑通过串口控制LED 前言…...

1.5[hardware][day5]

Link类跳转指令可以拆分为两个部分,一个是跳转,即下一个PC的生成,如果将分支条件的比较放到译码级来进行,则这部分只涉及取值级和译码级流水;另一个是Link操作,简单来说就是写寄存器,这部则主要…...

Java 多线程编程:提升系统并发处理能力!

多线程是 Java 中实现并发任务执行的关键技术,能够显著提升程序在多核处理器上的性能以及处理多任务的能力。本文面向初级到中级开发者,从多线程的基本定义开始,逐步讲解线程创建、状态管理、同步机制、并发工具以及新兴的虚拟线程技术。每部…...

Mininet 的详细设计逻辑

Mininet 是一个轻量级网络仿真工具,其核心目标是在单台物理机上快速构建复杂的虚拟网络拓扑,支持 SDN(软件定义网络)和传统网络协议的实验与验证。其设计逻辑围绕 虚拟化、模块化 和 灵活性 展开,以下是其详细设计架构…...

原生微信小程序实现导航漫游(Tour)

效果&#xff1a; 小程序实现导航漫游 1、组件 miniprogram/components/tour/index.wxml <!--wxml--> <view class"guide" wx:if"{{showGuide}}"><view style"{{guideStyle}}" class"guide-box"><view class&quo…...

Spring(6)——Spring、Spring Boot 与 Spring MVC 的关系与区别

Spring、Spring Boot 与 Spring MVC 的关系与区别 1. 核心定位 Spring 定位&#xff1a;基础框架&#xff0c;提供 IoC&#xff08;控制反转&#xff09; 和 DI&#xff08;依赖注入&#xff09; 核心功能&#xff0c;管理对象生命周期及依赖关系。功能&#xff1a;支持事务管…...

神聖的綫性代數速成例題2. 行列式的性質

性質 1&#xff1a;行列式與它的轉置行列式相等&#xff1a; 設為行列式&#xff0c;為其轉置行列式&#xff0c;則。 性質 2&#xff1a;交換行列式的兩行 (列)&#xff0c;行列式變號&#xff1a; 若行列式經過交換第行和第行得到行列式&#xff0c;則。 性質 3&#xff…...

ModelScope推理QwQ32B

文章目录 ModelScope推理QwQ32Bmodel_scope下载QwQ32BModelScope 调用QwQ-32B ModelScope推理QwQ32B 以下载 qwq32b 为例子 需要安装的 python 包 transformers4.49.0 accelerate>0.26.0 torch2.4.1 triton3.0.0 safetensors0.4.5可以使用 conda 创建一个虚拟环境安装 cond…...

使用unsloth进行grpo强化学习训练

说明 unsloth框架可以进行各种sft训练&#xff0c;包括lora和grpo训练。我参考官方方法&#xff0c;使用模型Qwen2.5-3B-Instruct和数据集gsm8k&#xff0c;写了一个grpo训练的例子。 代码 这个代码加载模型Qwen2.5-3B-Instruct和数据集gsm8k。训练完成后先保存lora模型然后…...

【c++】【智能指针】shared_ptr底层实现

【c】【智能指针】shared_ptr底层实现 智能指针之前已经写过了&#xff0c;但是考虑到不够深入&#xff0c;应该再分篇写写。 1 shared_ptr 1.1 shared_ptr 是什么 std::shared_ptr是一个类模板&#xff0c;它的对象行为像指针&#xff0c;但是它还能记录有多少个对象共享它…...

python拉取大视频导入deepseek大模型解决方案

使用Python拉取大视频并导入大模型&#xff0c;需要综合考虑数据获取、存储、处理和资源管理&#xff0c;确保高效稳定地处理大视频数据&#xff0c;同时充分利用大模型的性能&#xff0c;以下是分步方案及代码示例&#xff1a; --- 1. 分块下载大视频&#xff08;避免内存溢出…...

【Python】面向对象

编程的两大特点 面向过程&#xff1a;着重于做什么面向对象&#xff08; oop&#xff09;&#xff1a;着重于谁去做 python是面向对象语言&#xff0c;面向对象三大特点&#xff1a;封装、继承、多态 面向对象&#xff1a;便于代码管理&#xff0c;方便迭代更新。 新式类、经…...

leetcode日记(100)填充每个节点的下一个右侧节点指针

和层序遍历差不多的思路&#xff0c;将节点储存在队列里&#xff0c;一边取出节点一边放入取出节点的左右节点&#xff0c;直到队列空。 /* // Definition for a Node. class Node { public:int val;Node* left;Node* right;Node* next;Node() : val(0), left(NULL), right(NU…...

docker入门篇

使用docker可以很快部署相同的环境,这也是最快的环境构建,接下来就主要对docker中的基础内容进行讲解.Docker 是一个用于开发、交付和运行应用程序的开源平台&#xff0c;它可以让开发者将应用程序及其依赖打包到一个容器中&#xff0c;然后在任何环境中运行这个容器&#xff0…...

python语法

1. 前面先写import导入模块&#xff0c;完整的语法是&#xff1a; [from 模块名] import [模块 | 类 | 变量 | 函数 | *] [as 别名] 语法还可以是&#xff1a; from 模块名 import 功能名 如果import整个模块的话&#xff0c;需要用.功能名()&#xff0c;来用这个功能&#xff…...

Dify使用部署与应用实践

最近在研究AI Agent&#xff0c;发现大家都在用Dify&#xff0c;但Dify部署起来总是面临各种问题&#xff0c;而且我在部署和应用测试过程中也都遇到了&#xff0c;因此记录如下&#xff0c;供大家参考。Dify总体来说比较灵活&#xff0c;扩展性比较强&#xff0c;适合基于它做…...

微信小程序接入DeepSeek模型(火山方舟),并在视图中流式输出

引言&#xff1a; DeepSeek&#xff0c;作为一款先进的自然语言处理模型&#xff0c;以其强大的文本理解和生成能力著称。它能够处理复杂的文本信息&#xff0c;进行深度推理&#xff0c;并快速给出准确的回应。DeepSeek模型支持流式处理&#xff0c;这意味着它可以边计算边输…...

前端性能优化指标及优化方案

前端性能优化的核心目标是 提高页面加载速度、降低交互延迟、减少资源占用。常见的 Web 性能指标包括 LCP、FID、CLS、TTFB、TTI、FCP 等。 关键性能指标&#xff08;Web Vitals&#xff09; 指标优化方案 &#xff08;1&#xff09;LCP&#xff08;Largest Contentful Paint&…...

正则化介绍

简单介绍 正则化是用于控制模型的复杂度&#xff0c;防止模型在训练数据上过度拟合&#xff08;overfitting&#xff09;。正则化通过在模型的损失函数中引入额外的惩罚项&#xff0c;来对模型的参数进行约束&#xff0c;从而降低模型的复杂度。这个额外的惩罚通常与模型参数的…...

AI时代:数字媒体的无限可能

人工智能和数字媒体技术正深刻改变着我们的生活。通过大数据分析、机器学习等技术&#xff0c;人工智能不仅能精准预测用户需求&#xff0c;还能在医疗、金融等多个领域提供高效解决方案。与此同时&#xff0c;数字媒体技术的进步使得信息传播更加迅速和广泛。社会计算作为新兴…...

自动化爬虫drissionpage

自动化爬虫drissionpage官网 自动化测试框架&#xff1a;DrissionPage DrissionPage调用工具汇总 网络爬虫工具比较-DrissionPage、Selenium、Playwright...

禁毒知识竞赛主持稿串词

尊敬的各位领导、各位来宾、参赛选手们&#xff1a;大家好&#xff01; 在市禁毒委员会的领导下&#xff0c;今年我市开展了以“参与禁毒战争&#xff0c;构建和谐社会”为主题的禁毒宣传月活动。为了进一步加强我市禁毒宣传力度&#xff0c;促进社会治安的好转和社会主义物质文…...

【JDK17】Jlink一秒生成精简的JRE

之前介绍了 Java17模块化的JDK&#xff0c;模块化后按需使用Jlink 用于精简生成 JRE 环境&#xff0c;这让快速的开发环境增强了编码的愉悦感。在实际生产环境中使用 mave 进行项目的构建&#xff0c;其次再是精简 JRE 缩小容器镜像体积&#xff0c;为实现一体化的流程&#xf…...

机器学习周报--文献阅读

文章目录 摘要Abstract 1 文章内容1.1 模型结构1.1.1 LSTMAT的结构设置1.1.2 AWPSO算法优化模型 1.2 实验与结果讨论1.2.1 处理缺失数据1.2.2 模型评估指标1.2.3 比较实验1.2.4 消融实验&#xff08;ABLATION EXPERIMENTS&#xff09; 2相关知识2.1 自适应权重粒子群优化&#…...

硬件地址反序?用位操作为LED灯序“纠偏”。反转二进制数即可解决

特别有意思&#xff0c;LED的灯序与其硬件地址刚好相反&#xff0c;没办法直接通过加1实现二进制进位的亮灯操作&#xff0c;查了一些资料说用数组和switch实现&#xff0c;觉得太麻烦了&#xff0c;思索良久&#xff0c;就想到了反转二进制数解决这个问题。 reverse_bits( )是…...

A* floyd算法 bellman-ford

求源点到目标点最短距离 排序的里面要加上与目标点一个预估距离,与dj算法差距只有这儿 预估要小于等于真实的最短距离,吸引力要适当 越接近实际距离越快 #include<bits/stdc.h> using namespace std;// 方向向量&#xff1a;上、右、下、左 const vector<int> …...

【数据挖掘】KL散度(Kullback-Leibler Divergence, KLD)

KL散度&#xff08;Kullback-Leibler Divergence, KLD&#xff09; 是衡量两个概率分布 P 和 Q之间差异的一种非对称度量。它用于描述当使用分布 Q 逼近真实分布 P 时&#xff0c;信息丢失的程度。 KL散度的数学定义 给定两个离散概率分布 P(x)和 Q(x)&#xff0c;它们在相同的…...

Linux shell 进度条

概述 在 Linux Shell 中实现一个简单的进度条可以通过 printf 命令结合特殊字符来实现&#xff0c;以下是一个示例脚本&#xff0c;它模拟了一个从 0% 到 100% 的进度条。 作用 反馈任务进度&#xff1a;让用户直观了解任务执行的进展情况&#xff0c;比如文件拷贝、系统更新…...

ctfshow web刷题记录

RCE 第一题 eval代码执行 &#xff1a; 1、使用system 加通配符过滤 ?csystem("tac%20fl*") ; 2、反字节执行 xxx %20 echo 反字节 3、变量转移 重新定义一个变量 让他代替我们执行 4、伪协议玩法 ?cinclude$_GET[1]?>&1php://filter/readc…...