TCP与UDP的可靠性传输

news2025/2/1 7:55:29

目录

  • 一、TCP可靠性传输
    • 1、重传机制
      • 1.1、超时重传
      • 1.2、快速重传
      • 1.3、SACK
      • 1.4、Duplicate SACK
    • 2、滑动窗口
    • 3、流量控制
      • 3.1 滑动窗口与流量控制
      • 3.2窗口关闭
    • 4、拥塞控制
      • 4.1拥塞窗口
      • 4.2 慢启动
      • 4.3 拥塞避免
      • 4.4 拥塞发生
      • 4.5 快速恢复
  • 二、UDP可靠性传输
    • 1、主要策略
    • 2、重传机制
      • 2.1 即停-等待协议
      • 2.2 回退n帧协议
      • 2.3选择重传协议
    • 3、流量控制和拥塞控制
    • 4、UDP编程模型
    • 5、KCP协议
    • 5.1 KCP与TCP的对比
    • 5.2 KCP流程


一、TCP可靠性传输

参考小林图解网络

1、重传机制

1.1、超时重传

超时重传,就是在发送数据时,设定一个定时器,当超过指定的时间后,没有收到对方的 ACK 确认应答报文,就会重发该数据。

TCP 会在以下两种情况发生超时重传:
数据包丢失
确认应答丢失

超时重传时间 RTO是一个动态变化的值,其值应该略大于报文往返 RTT 的值。RFC6298建议使用下式计算超市重传时间RTO:
R T O = R T T s + 4 R T T D RTO = RTT_s + 4RTT_D RTO=RTTs+4RTTD
其中,加权平均往返时间 R T T s RTT_s RTTs
R T T S 1 = R T T 1 RTT_{S_1}=RTT_1 RTTS1=RTT1, R T T S i + 1 = ( 1 − 1 8 ) R T T S i + 1 8 R T T i + 1 \quad RTT_{S_{i+1}} = (1- \frac{1}{8}) RTT_{S_i} + \frac{1}{8}RTT_{i+1} RTTSi+1=(181)RTTSi+81RTTi+1
R T T RTT RTT偏差的加权平均 R T T D RTT_D RTTD
R T T D 1 = R T T 1 2 RTT_{D_1}=\frac{ RTT_1}{2} RTTD1=2RTT1, R T T D i + 1 = ( 1 − 0.25 ) R T T D i + 0.25 ∣ R T T S i + 1 − R T T i ∣ \quad RTT_{D_{i+1}} = (1-0.25)RTT_{D_i} + 0.25 |RTT_{S_{i+1}} - RTT_i| RTTDi+1=(10.25)RTTDi+0.25∣RTTSi+1RTTi

即出现超时重传时,新的RTO为2倍旧的RTO。
在这里插入图片描述
超时触发重传存在的问题是,超时周期可能相对较长。可以用快速重传机制来解决超时重发的时间等待。

1.2、快速重传

快速重传机制,不以时间为驱动,而是以数据驱动重传。当收到三个相同的 ACK 报文时,会在超时重传时间 RTO过期之前,重传丢失的报文段。

如下图,发送端依次发送了seq1,seq2,seq3,seq4,seq5,
1、seq1送达,接收端确认接收seq1,回复ACK;
2、seq2因某些原因丢失,未送达;
3、seq3、seq4、seq5依次送达,但因为接收端未收到seq2,因此接收端还是会发送三个对seq2确认的ACK;
4、接收端收到三个连续的seq2确认ACK,会在超时重传时间 RTO过期之前,重传seq2;
5、最后接收端成功收到seq2,此时5个数据包都成功收到,于是发送确认seq5的ACK。
在这里插入图片描述
但是如果seq2、seq3都丢失,接收端都是回复确认seq2的ACK。那么重传的时候,是重传一个,还是重传所有的呢?
为了解决不知道该重传哪些 TCP 报文,于是就有 SACK 方法。

1.3、SACK

SACK( Selective Acknowledgment), 选择性确认。简单来说,可以对每次发的数据包都加上序号,这样接收端就可以判断当前的数据是否有接收过,从而决定其去留。

这种方式需要在 TCP 头部「选项」字段里加一个 SACK 的东西,它可以将已收到的数据的信息发送给发送方,这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据。

如下图,发送方收到了三次同样的 ACK 确认报文,于是就会触发快速重发机制,通过 SACK 信息发现只有 200~299 这段数据丢失,则重发时,就只选择了这个 TCP 段进行重复。
在这里插入图片描述

1.4、Duplicate SACK

Duplicate SACK 又称 D-SACK,其主要使用了 SACK 来告诉「发送方」有哪些数据被重复接收了。即可以为ACK加上编号。则每个ACK的相互作用就不会互串了。
在这里插入图片描述

2、滑动窗口

TCP 是每发送一个数据,都要进行一次确认应答。当上一个数据包收到了应答了, 再发送下一个。简单来说,就是一来一回。虽然模式简单,但是缺点是效率比较低的。

为解决这个问题,TCP 引入了窗口,其中窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值。

举个例子,窗口相当于货车。发送端每次发送一货车的物品,并记录在本子上。接收端收到货之后,
1、如果清点无漏,就回复确认消息。发送端收到确认消息之后,就把之前的发货记录划掉,继续发货;
2、如果清点完发现有某个商品漏了,就会根据重传机制,让发送端重发此商品。等到全部接收再回复确认。
这样,可以一次性发一批货。不用发一个等一个,费时。

专业点,窗口的实现实际上是操作系统开辟的一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除。
在这里插入图片描述
注意点
1、窗口大小由哪一方决定?
TCP 头里有一个字段叫 Window,也就是窗口大小。
这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据。所以,通常窗口的大小是由接收方的窗口大小来决定的

2、接收窗口和发送窗口的大小是相等的吗?
并不是完全相等,接收窗口的大小是约等于发送窗口的大小的。比如接收端处理数据很快,那么接收窗口很快就会被空出来。

3、流量控制

3.1 滑动窗口与流量控制

一般来说,我们总是希望数据传输得更快一些。但如果发送方把数据发送得过快,接收方就可能来不及接收处理,导致触发重传机制,从而造成数据的丢失和流量的浪费。

所谓流量控制就是让发送方根据接收方的实际接收能力来控制发送速率,要让接收方来得及接收。利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制
在这里插入图片描述

3.2窗口关闭

TCP 通过让接收方指明希望从发送方接收的数据大小(窗口大小)来进行流量控制。
如果窗口大小为 0 时,就会阻止发送方给接收方传递数据,直到窗口变为非 0 为止,这就是窗口关闭。
但TCP 是如何解决窗口关闭时,潜在的死锁现象呢?
TCP 为每个连接设有一个持续定时器,只要 TCP 连接一方收到对方的零窗口通知,就启动持续计时器。
如果持续计时器超时,就会发送窗口探测 ( Window probe ) 报文,而对方在确认这个探测报文时,给出自己现在的接收窗口大小。
在这里插入图片描述

4、拥塞控制

流量控制是避免发送方的数据填满接收方的缓存,但是一般来说,计算机网络都处在一个共享的环境。因此也有可能会因为其他主机之间的通信使得网络拥堵。

在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,这时 TCP 就会重传数据,但是一重传就会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包。出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降

拥塞控制主要四个算法:
慢启动、拥塞避免、拥塞发生、快速恢复

在这里插入图片描述

4.1拥塞窗口

拥塞窗口 cwnd是发送方维护的一个的状态变量,其值取决于网络的拥塞程度,且是动态变化的。

拥塞窗口cwnd,与发送窗口 swnd 和接收窗口 rwnd 的关系是:swnd = min(cwnd, rwnd),也就是拥塞窗口和接收窗口中的最小值。

拥塞窗口 cwnd维护的规则:只要网络中没有出现拥塞,cwnd 就会增大;但网络中出现了拥塞,cwnd 就减少;

判断出现网络拥塞的依据:发送方没有按时收到 ACK 应答报文,也就是发生了超时重传,就会认为网络出现了拥塞。

4.2 慢启动

TCP 在刚建立连接完成后,首先是有个慢启动的过程,这个慢启动的意思就是一点一点的提高发送数据包的数量,而不是一开始就发大量的数据。当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会加 1。

并且维护一个慢开始门限ssthresh状态变量:
1、当cwnd < ssthresh时,使用慢开始算法;
2、当cwnd >ssthresh时,停止使用慢开始算法而改用拥塞避免算法
3、当cwnd =ssthresh时,既可使用慢开始算法,也可使用拥塞避免算法

4.3 拥塞避免

当拥塞窗口 cwnd 超过慢启动门限 ssthresh 就会进入拥塞避免算法,其规则是每当收到一个 ACK 时,cwnd 增加 1/cwnd。

拥塞避免算法就是将原本慢启动算法的指数增长变成了线性增长,还是增长阶段,但是增长速度缓慢了一些。

随着时间推移,网络就会慢慢进入了拥塞的状况了,于是就会出现丢包现象,这时就触发了重传机制,也就进入了拥塞发生算法。

4.4 拥塞发生

当网络出现拥塞时,会发生数据包重传,重传机制主要有两种:超时重传、快速重传

超时重传
1、将ssthresh值更新为发生拥塞时cwnd值得一半
2、将cwnd值减少为1,并重新开始执行满开始算法

对于超时重传,如果遇到个别报文段会在网络中丢失,但实际上网络并未发生拥塞,这将导致发送方超时重传,并误认为网络发生了拥塞;并且发送方把拥塞窗口cwnd又设置为最小值1,并错误地启动慢开始算法,因而降低了传输效率。

快速重传
所谓快重传,就是使发送方尽快进行重传,而不是等超时重传计时器超时再重传。
1、要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认
2、即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认
3、发送方一旦收到3个连续的重复确认,就将相应的报文段立即重传,而不是等该报文段的超时重传计时器超时再重传。

TCP 认为这种情况不严重,因为大部分没丢,只丢了一小部分,则 ssthresh 和 cwnd 变化如下:
1、cwnd = cwnd/2 ,也就是设置为原来的一半;
2、ssthresh = cwnd;
3、进入快速恢复算法

4.5 快速恢复

发送方一旦收到3个重复确认,就知道现在只是丢失了个别的报文段。于是不启动慢开始算法,而执行快恢复算法。

1、拥塞窗口 cwnd = ssthresh + 3 ( 3 的意思是确认有 3 个数据包被收到了);
2、重传丢失的数据包;
3、如果再收到重复的 ACK,那么 cwnd 增加 1;
4、如果收到新数据的 ACK 后,把 cwnd 设置为第一步中的 ssthresh 的值。

为什么拥塞窗口 cwnd = ssthresh + 3 ?
因为既然发送方收到3个重复的确认,就表明有3个数据报文段已经离开了网络;
这3个报文段不再消耗网络资源而是停留在接收方的接收缓存中;
可见现在网络中不是堆积了报文段而是减少了3个报文段。因此可以适当把拥塞窗口扩大些

为什么收到新数据的 ACK 后,把 cwnd 设置为第一步中的 ssthresh 的值?
原因是该 ACK 确认了新的数据,说明从 duplicated ACK 时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态;
在这里插入图片描述

二、UDP可靠性传输

对于大部分的应用使用TCP既可以满足工程的需求,又可提供可靠的数据传输服务,并具备流量控制和拥塞控制机制。但对一些实时性要求比较高的场景,如实时通信、游戏、视频流等,则比较适合UDP。
1、音视频通话(网络延时,tcp不可以控制重传,延时太大,udp可以控制重传时间);
2 、游戏开发(实时性操作:王者荣耀;传输位置,延迟会造成卡顿)
3 、DNS查询(一问一答;一个包就可以,丢包直接重发就行)
4 、物联网设备监控,用电池(活跃状态耗电,睡眠,发送数据量不大)
5 、心跳机制 监测设备在不在线心跳包
在这里插入图片描述
UDP的可靠性传输与TCP中的一些策略类似,在上面了解TCP可靠性传输的基础上学习,将事半功倍。

1、主要策略

UDP如何做到可靠性传输,有以下几个策略:
1、ACK机制:当接收方接收到数据时,即回复ACK进行确认
2、重传机制
3、序号机制:发送方给每个数据包加上序号,让接收方收到乱序包之后方便重排
4、重排机制:接收方收到乱序包之后,根据序号重排
5、窗口机制

2、重传机制

ARQ协议(Automatic Repeat-reQuest),即自动重传请求,是传输层的错误纠正协
议之一,它通过使用确认和超时两个机制,在不可靠的网络上实现可靠的信息
传输。
ARQ协议主要有3种模式:

  1. 即停-等待协议SW(stop-and-wait)
  2. 回退n帧协议GBN(go-back-n)
  3. 选择重传协议SR(selective repeat)

2.1 即停-等待协议

1、每发送一帧数据后需要接收到对方的回复之后才发送下一帧数据。
2、为避免因接收方收不到数据分组,而不发送ACK或NAK,导致发送方一直处于等待接收方ACK或NAK的状态。可以在发送方发送完一个数据分组时启动一个超时计时器。若到了超时计时器所设置的重传时间而发送方仍收不到接收方的任何ACK或NAK,则重传原来的数据分组,即超时重传。
3、为了让接收方能够判断所收到的数据分组是否是重复的,需要给数据分组编号。
4、为了让发送方能够判断所收到的ACK分组是否是重复的,需要给ACK分组编号。
在这里插入图片描述

2.2 回退n帧协议

发送方给接收方发送5、6、7、0、1,但是5号数据丢失,导致接收方接收数据时,数据与接收窗口的序号不匹配。
发送方收到重复的确认,就知道之前所发送的数据分组出现了差错,于是可以不等超时计时器超时就立刻重传!
在这里插入图片描述
需要注意的是,回退N帧协议可以采用累计确认方式。比如发送0、1、2、3、4,接收方成功接收并返回确认值ACK4,表示4号及之前的数据被成功接收。

另外,回退N帧协议的接收窗口尺寸Wr只能等于1,因此接收方只能按序接收正确到达的数据分组。

2.3选择重传协议

选择重传协议核心是,先接收已收到且无误码的数据。再告诉发送端,哪一个报文丢失,重传丢失报文即可。当成功接收全部数据,才能向前滑动窗口。
在这里插入图片描述

3、流量控制和拥塞控制

参考tcp

4、UDP编程模型

Linux下实现简单的UDP请求
在这里插入图片描述
TCP面向连接的流式传输,一次可以只收一部分数据。
而UDP 报文传输,一次只能接收一个包,且recvfrom()一次需要读取完整的报文。因此若MTU=1500字节,而UDP 发送的数据包过大,需要拆包发送。

5、KCP协议

KCP(Kernel Congestion Control Protocol)是一种高速可靠性传输协议,它在UDP协议的基础上进行了优化和改进,可以有效地解决网络丢包、拥塞等问题,提高数据传输效率。严格意义上讲,KCP并不是一种网络传输协议,它是为UDP写的可靠传输算法。

5.1 KCP与TCP的对比

1、选择性重传 vs 全部重传:
TCP丢包时会全部重传从丢的那个包开始以后的数据,即回退n帧;而KCP是选择性重传,只重传真正丢失的数据包。

2、延迟ACK vs 非延迟ACK
TCP为了充分利用带宽,会延迟发送ACK,这样超时计算会算出较大 RTT时间,延长了丢包时的判断过程。KCP的ACK是否延迟发送可以调节。

3、UNA vs ACK+UNA
ARQ模型响应有两种,UNA(此编号前所有包已收到,如TCP)和ACK(该编号包已收到),光用UNA将导致全部重传,光用ACK则丢失成本太高,以往协议都是二选其一,而 KCP协议中,除去单独的 ACK包外,所有包都有UNA信息。

4、非退让流控
KCP正常模式同TCP一样使用公平退让法则,即发送窗口大小由:发送缓存大小、接收端剩余接收缓存大小、丢包退让及慢启动这四要素决定。但传送及时性要求很高的小数据时,可选择通过配置跳过后两步,仅用前两项来控制发送频率。以牺牲部分公平性及带宽利用率之代价,换取了开着BT都能流畅传输的效果。

5.2 KCP流程

第一步,就是创建一个kcp实例,然后进行初始化,相当于一个句柄。
ikcpcb* ikcp_create(IUINT32 conv, void *user)

第二步,设置发送回调函数,底层用哪种socket都没问题,只要能把数据发送出去,建议使用UDP,比较简单。
void ikcp_output(ikcpcb *kcp, int (*output)(const char *buf, int len,
	ikcpcb *kcp, void *user))

第三步,更新KCP状态。KCP运行于用户空间,所以需要手动去更新每个实例的状态,其实主要就是检测哪些数据包该重传了。
void ikcp_update(ikcpcb *kcp, IUINT32 current)

第四步,发送数据。调用ikcp_send之后,KCP最后会使用上面设置的ikcp_output函数来发送数据(KCP自己并不关心如何发送数据)int ikcp_send(ikcpcb *kcp, const char *buffer, int len)

第五步,预接收数据。在应用主动调用recvfrom读取udp数据,,然后再调用ikcp_input将裸数据交给KCP,这些数据有可能是KCP控制报文,并不是我们要的数据。
int ikcp_input(ikcpcb *kcp, const char *data, long size)

第六步,接收数据。此时收到的数据才是真正的数据,重组操作在调用ikcp_recv之前就完成了。
int ikcp_recv(ikcpcb *kcp, char *buffer, int len)

第七步,释放一个kcp对象
void ikcp_release(ikcpcb *kcp)

在这里插入图片描述

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

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

相关文章

软件测试03:软件工程和软件生命周期

软件测试03&#xff1a;软件工程和软件生命周期 软件危机 软件危机是指落后的软件生产方式无法满足迅速增长的计算机软件需求&#xff0c;从而导致软件开发与维护过程中出现一系列严重问题的现象。 软件工程 基本软件危机对于计算机发展的阻碍&#xff0c;1968年&#xff0…

史上最详细的安装Kali-linux教程(附视频教程)

之前不少人问kali怎么安装&#xff0c;今天就发一篇利用VM虚拟机安装kali的详细教程&#xff0c;每一步都截图了&#xff0c;让大家尽可能的清楚每一步的操作。 1.2 使用 VM 虚拟机安装 Kali 1.2.1 官方下载 Kali Linux 官方网址&#xff1a;http://www.Kali.org 下载方式分…

跨域 —— 反向代理配置

跨域问题在讲Node.js学习中编写接口的时候就已经讲到了&#xff0c;由后端配置解决跨域问题&#xff0c;使用cors中间件解决跨域问题以及使用JSONP解决跨域&#xff08;仅支持GET请求&#xff09;&#xff0c;具体可以看一下这篇文章的内容&#xff1a;十二、Express接口编写 —…

python面向对象操作3(速通版)

目录 一、多态和类名 1.标准多态 2.实例属性和实例方法 3.类对象和类属性 4.对象保存 二、方法 1.类方法 3.四种方法的区别 三、模块 1.导入模块 2.自动模块导入 3.模块导入的几种形式 3.1模块导入的两种方式和别名 3.2 from 模块 import 成员 4.两种方法的区别…

【运筹优化】最短路算法之A星算法 + Java代码实现

文章目录 一、A星算法简介二、A星算法思想三、A星算法 java代码四、测试 一、A星算法简介 A*算法是一种静态路网中求解最短路径最有效的直接搜索方法&#xff0c;也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近&#xff0c;最终搜索速度越快。 二、A星算…

day52_Spring

今日内容 零、 复习昨日 一、Spring 零、 复习昨日 一、引言 以前 public class HelleServlet extends HttpServlet{UserService service new UsrServiceImpl();void doGet(){service.findUser();} }public interface UserService{User findUser(); } public class UserServ…

Tigase-Server 8.3.0在windows11下安装

一、JDK安装&#xff1a; tigase-server要求JDK 17,请先下载JDK17, 下载地址&#xff1a;https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.exe 配置环境变量&#xff1a;JAVA_HOME{JDK安装目录} 二、数据库安装&#xff1a;tigase-server8.3在windows下…

【算法系列 | 4】深入解析排序算法之——归并排序

序言 你只管努力&#xff0c;其他交给时间&#xff0c;时间会证明一切。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记一级论点蓝色&#xff1a;用来标记二级论点 决定开一个算法专栏&#xff0c;希望能帮助大…

Chrome内核插件开发报错:Unchecked runtime.lastError:的原因及解决办法。

本篇文章主要讲解,chrome内核插件开发时报错:Unchecked runtime.lastError: Extensions using event pages or Service Workers must pass an id parameter to chrome.contextMenus.create 的原因及解决办法。 日期:2023年6月10日 作者:任聪聪 报错现象: 查看报错路径,在…

项目经理必备!这四个高效管理工具帮你实现项目管理目标

在项目管理中&#xff0c;图形工具可以帮助我们让项目信息可视化&#xff0c;让项目管理更加高效&#xff0c;对于项目经理而言&#xff0c;这些工具都是好帮手。让我们一起看看&#xff0c;项目经理常用的管理工具都有那些吧~ 1&#xff0c;甘特图 甘特图是计划和管理项目的好…

【Spring使用注解更简单的实现Bean对象的存取】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、前言&#xff1a; 二、储存Bean对象和使…

天黑的时候如果下雨了,会比平常更亮一些

目录 一、最近的感受 二、自我的审视 三、如何变得强大 1.保持善良 2.不过度追求公平 3.在痛苦中找到自己的意义 4.令人振奋的生命力 四、情绪调节中的个人见解及如何处理情绪后的学习 1.运动 2.散步 3.找好朋友倾诉 五、总结 一、最近的感受 天黑的时候如果下雨了…

设计模式(十一):结构型之组合模式

设计模式系列文章 设计模式(一)&#xff1a;创建型之单例模式 设计模式(二、三)&#xff1a;创建型之工厂方法和抽象工厂模式 设计模式(四)&#xff1a;创建型之原型模式 设计模式(五)&#xff1a;创建型之建造者模式 设计模式(六)&#xff1a;结构型之代理模式 设计模式…

C语言:写一个代码,使用 试除法 打印100~200之间的素数(质数)

题目&#xff1a; 使用 试除法 打印100~200之间的素数。 素数&#xff08;质数&#xff09;&#xff1a;一个数只能被写成一和本身的积。 如&#xff1a;7只能写成1*7&#xff0c;那就是素数&#xff08;质数&#xff09;了。 思路一&#xff1a;使用试除法 总体思路&#xff…

HTML5 介绍

目录 1. HTML5介绍 1.1 介绍 1.2 内容 1.3 浏览器支持情况 2. 创建HTML5页面 2.1 <!DOCTYPE> 文档类型声明 2.2 <html>标签 2.3 <meta>标签 设置字符编码 2.4 引用样式表 2.5 引用JavaScript文件 3. 完整页面示例 4. 资料网站 1. HTML5介绍 1.1 介绍 …

带你手撕一颗红黑树

红黑树&#xff08;C&#xff09; 红黑树简述红黑树的概念红黑树的性质红黑树结点定义 一&#xff0c;红黑树的插入插入调整插入代码 二&#xff0c;红黑树的验证三&#xff0c;红黑树的删除待删除的结点只有一个子树删除结点颜色为红色删除结点颜色为黑色 删除的结点为叶子节点…

直流稳压电源与信号产生电路(模电速成)

目录 一、直流稳压电源 1、直流稳压电路 2、串联型稳压电路 3、集成稳压电路 二、信号产生电路 1、振荡电路 2、波形发生器 一、直流稳压电源 1、直流稳压电路 直流电源由 变压器、整流、滤波、稳压 四部分组成 整流&#xff1a;将交流变为直流 滤波&#xff1a;减小…

AI人工智能之科研论文搜索集锦

AI人工智能之科研论文搜索集锦 前言1. Google学术搜索2. Google搜索3. Arxiv#Example&#xff1a; 4. Github#Example&#xff1a; 5. Paperwithcode6. Connectedpapers7. OpenReview 总结 前言 如今越来越多领域都会与计算机、人工智能方面进行跨领域融合&#xff0c;一个万物…

帮忙投票的链接怎么弄的微信怎么创建投票链接设置投票

近些年来&#xff0c;第三方的微信投票制作平台如雨后春笋般络绎不绝。随着手机的互联网的发展及微信开放平台各项基于手机能力的开放&#xff0c;更多人选择微信投票小程序平台&#xff0c;因为它有非常大的优势。 1.它比起微信公众号自带的投票系统、传统的H5投票系统有可以图…

EMC学习笔记(二)模块划分及特殊器件的布局

模块划分及特殊器件的布局 1.模块划分1.1 按功能划分1.2 按频率划分1.3 按信号类型划分1.4 综合布局 2.特殊器件的布局2.1 电源部分2.2 时钟部分2.3 电感线圈2.4 总线驱动部分2.5 滤波器件 谈PCB的EMC设计,不能不谈PCB的模块划分及关键器件的布局。这一方面是某些频率发生器件、…