2.6 TCP与UDP的可靠性传输

news2024/11/26 6:24:53

目录

  • 一、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/643743.html

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

相关文章

基础知识学习---牛客网C++面试宝典(六)操作系统--第二节

1、本栏用来记录社招找工作过程中的内容&#xff0c;包括基础知识学习以及面试问题的记录等&#xff0c;以便于后续个人回顾学习&#xff1b; 暂时只有2023年3月份&#xff0c;第一次社招找工作的过程&#xff1b; 2、个人经历&#xff1a; 研究生期间课题是SLAM在无人机上的应…

湖南大学CS-2017期末考试解析

【特别注意】 答案来源于@wolf 是我在备考时自己做的,仅供参考,若有不同的地方欢迎讨论。 【试卷评析】 这张卷子有点老了,部分题目可能有用。如果仔细研究应该会有所收获。 【试卷与答案】 一.(6 分,每空 0.5 分) 下表中%r1,%r2 为两个四位的寄存器,请仿照第一行…

考虑3D海底环境的风电场集电系统

摘要 风能是目前国内外应用较为广泛的一种绿色可再生能源&#xff0c;近几年我国风电产业的发展十分迅速。然后&#xff0c;越来越多的风力发电系统建并网&#xff0c;风力发电产生的电能受外界因素影响较大&#xff0c;具有一定的随机性和波动性&#xff0c;给并网后的电力系统…

代码随想录算法训练营第三十五天| 860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

柠檬水找零 题目链接&#xff1a;力扣 这道题 我一开始用纯模拟的方法也能写出来&#xff0c;后来发现和卡哥给的答案差不多&#xff0c;其贪心的点在&#xff1a; 当账单是20的情况&#xff0c;优先消耗一个10和一个5因为美元10只能给账单20找零&#xff0c;而美元5可以给账…

为什么要进行基坑监测,基坑监测包括哪些内容?

首先我们来了解一下为什么要进行基坑监测&#xff1f;基坑作为基础建设的底层组成成分&#xff0c;关系着上层建筑的稳固安全&#xff0c;进行基坑监测主要是为了确保工程的安全、有效地管理工程施工&#xff0c;以下是具体的原因介绍&#xff1a; 1. 减少工程风险&#xff1a;…

服务限流算法

服务限流算法有哪些 计数器法&#xff08;固定窗口&#xff09;&#xff1a;原理就是限制每秒处理请求数不超过阈值。比如一个接口一分钟可以处理1000次请求&#xff0c;那么可以设置一个计数器&#xff0c;当有一次请求过来&#xff0c;计数器就加1&#xff0c;如果一分钟以内…

【分布式存储】聊一下分布式存储之复制机制

上一篇文章中&#xff0c;主要聊了下数据分片的主要内容&#xff0c;我们知道&#xff0c;**通过数据分片其实可以解决数据存储的高性能以及可拓展&#xff0c;但是也导致了用join和使用分布式事务进行查询和存储数据的问题&#xff0c;**属于按下葫芦浮起瓢。但是在分布式领域…

【大数据之Hive】十一、Hive-HQL查询之基本查询

基础语法 select [all | distinct] select_expr,select_expr, ...from table)name --从什么表查[where where_condition] --过滤[group by col_list] --分组查询[having col_list] --分组后过滤[order by col_list] --排序[cluster by col_list | …

基础知识学习---牛客网C++面试宝典(七)操作系统--第三节

1、本栏用来记录社招找工作过程中的内容&#xff0c;包括基础知识学习以及面试问题的记录等&#xff0c;以便于后续个人回顾学习&#xff1b; 暂时只有2023年3月份&#xff0c;第一次社招找工作的过程&#xff1b; 2、个人经历&#xff1a; 研究生期间课题是SLAM在无人机上的应…

从 数据工程 到 Prompt 工程

动动发财的小手&#xff0c;点个赞吧&#xff01; 数据工程构成了数据科学过程的很大一部分。在 CRISP-DM 中&#xff0c;这个过程阶段称为“数据准备”。它包括数据摄取、数据转换和数据质量保证等任务。在本文[1]章中&#xff0c;我们使用 ChatGPT 和 Python 解决了典型的数据…

用HTML5制作精美战机游戏

每天要被大学老师催H5作业&#x1f44f;&#x1f3fb;&#x1f44f;&#x1f3fb;&#x1f44f;&#x1f3fb; 不如看看本文&#xff0c;代码齐全&#xff0c;直接用来做参考案例&#x1f44c;&#x1f3fb; 干货满满不看后悔&#x1f44d;&#x1f44d;&#x1f44d; 代码…

用友畅捷通CRM SQL注入漏洞复现

0x01 产品简介 用友畅捷通CRM是面向小企业全力打造的简单、实用的客户关系管理应用。帮助企业用好自己的客户资源、管好商机跟进过程、引导好业务员跟单行为&#xff0c;促进团队销售能力的提升&#xff1b;通过查询和分析&#xff0c;识别企业的价值客户&#xff0c;融合电话、…

JUC笔记(二)

多线程编程核心 在前面&#xff0c;我们了解了多线程的底层运作机制&#xff0c;我们终于知道&#xff0c;原来多线程环境下存在着如此之多的问题。在JDK5之前&#xff0c;我们只能选择synchronized关键字来实现锁&#xff0c;而JDK5之后&#xff0c;由于volatile关键字得到了…

湖南大学CS-2021期末考试解析

【特别注意】 答案来源于@wolf 是我在备考时自己做的,仅供参考,若有不同的地方欢迎讨论。 【试卷评析】 有必要一做。 【试卷与答案】 1.简答题(10 分) 小明设计了一款机器,整数和浮点数都占 10 个 bit,其中整数采用补码表示,浮点数采用 IEEE 754 标准。 (1)…

matlab横向连接字符组成文件路径

f fullfile(myfolder,myfile.tif) %字符串中不包含反斜杠 f strcat(myfolder\,myfile.tif) %字符串中包含反斜杠,strcat函数直接拼接得到的结果一致

【软件测试】测试用例设计要点总结

文章目录 考试题型简答题(一) 等价类划分1.1 划分等价类1.2 设计测试用例 (二) 边界值分析2.1 列出边界值分析表2.2 设计测试用例 (三) 因果图分析3.1 确定原因和结果3.2 确定原因和结果之间的逻辑关系3.3 在因果图上使用标准的符号标明约束条件 (四) 判定表驱动4.1 将因果图转…

【轻量化网络系列(7)】EfficientNetV2论文超详细解读(翻译 +学习笔记+代码实现)

前言 今天我们要学习的是EfficientNetV2 &#xff0c;该网络主要使用训练感知神经结构搜索和缩放的组合&#xff1b;在EfficientNetV1的基础上&#xff0c;引入了Fused-MBConv到搜索空间中&#xff1b;引入渐进式学习策略、自适应正则强度调整机制使得训练更快&#xff1b;进一…

深入了解 OkHttp 协议:优雅的网络请求框架

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;不想…

Spring Boot项目的搭建和运行

✨Spring Boot项目的搭建和运行 &#x1f351;Spring Boot概述&#x1f34a;&#x1f34a;传统框架技术存在的问题&#x1f34a;&#x1f34a;主要特点&#x1f34a;&#x1f34a;环境要求 &#x1f351;聚合工程/父子模块&#x1f351;第一个Spring Boot项目&#x1f351;目录…

《UNUX环境高级编程》(1)UNIX基础

1、引言 2、UNIX体系结构 操作系统 一种软件&#xff0c;控制计算机硬件资源&#xff0c;提供程序运行环境。操作系统包含了内核和一些其他软件&#xff08;如shell、公用函数库、应用程序等&#xff09;。例如Linux就是GNU操作系统的内核&#xff0c;因此也称为GNU/Linux操作…