RTP 控制协议 (RTCP) 反馈用于拥塞控制

摘要

有效的 RTP 拥塞控制算法,需要比标准 RTP 控制协议(RTCP)发送方报告(SR)和接收方报告(RR)数据包提供的关于数据包丢失、定时和显式拥塞通知 (ECN) 标记的更细粒度的反馈。

本文档描述了 RTCP 反馈消息,旨在使用 RTP 对交互式实时流量启用拥塞控制。反馈消息设计用于基于发送方的拥塞控制算法,其中 RTP 流的接收方向发送方发送回 RTCP 反馈数据包,其中包含发送方执行拥塞控制所需的信息。

1.简介

对于交互式实时流量,例如视频会议流,典型的协议选择是在用户数据报协议 (UDP) 上运行的实时传输协议 (RTP) [RFC3550]。 RTP 不提供任何服务质量 (QoS)、可靠性或及时交付的保证,并期望底层传输协议能够这样做。仅 UDP 肯定无法满足这一期望。然而,RTP 控制协议 (RTCP) [RFC3550] 提供了一种机制,RTP 流的接收方可以通过该机制定期向该 RTP 流的发送方发送传输和媒体质量度量。发送方可以使用该信息来执行拥塞控制。

由于缺乏用于此目的的标准化消息,拥塞控制算法的设计者开发了专有的 RTCP 消息,这些消息仅传送各自设计所需的参数。直接的结果是,不同的拥塞控制设计不能互操作。为了实现算法演进以及跨设计的互操作性(例如,不同的速率自适应算法),非常需要具有通用的拥塞控制反馈格式。

为了帮助实现单播 RTP 拥塞控制的互操作性,本备忘录指定了一种通用的 RTCP 反馈数据包格式,可供网络辅助动态自适应 (NADA) [RFC8698]、多媒体自时钟速率自适应 (SCReAM) [RFC8298]、谷歌拥塞控制 [Google-GCC] 和共享瓶颈检测 [RFC8382],并且, 希望未来的 RTP 拥塞控制算法也能做到这一点。

2. 术语

关键词“必须”、“不得”、“必需”、“应”、“不应”、“应该”、“不应该”、“推荐”、“不推荐”、“可以”和“可选”当且仅当它们以全部大写形式出现时,本文档中的“应按照 BCP 14 [RFC2119] [RFC8174] 中的描述进行解释,如此处所示。

此外,[RFC3550]、[RFC4585] 和 [RFC5506] 中定义的术语也适用。

3. 用于拥塞控制的 RTCP 反馈

基于对 NADA [RFC8698]、SCReAM [RFC8298]、Google 拥塞控制 [Google-GCC] 和共享瓶颈检测 [RFC8382] 的分析,已确定以下每 RTP 数据包拥塞控制反馈信息是必要的:

RTP 序列号:RTP 流的接收方需要将收到的 RTP 数据包的序列号反馈给发送方,以便发送方可以确定哪些数据包已收到、哪些数据包丢失。许多拥塞控制算法将数据包丢失用作拥塞的指示。

数据包到达时间:RTP 流的接收方需要将每个 RTP 数据包的到达时间反馈给发送方。某些拥塞控制算法将数据包延迟和/或延迟变化(抖动)用作拥塞信号。

数据包显式拥塞通知(ECN)标记:如果使用ECN[RFC3168][RFC6679],则需要在接收到的RTP数据包中反馈2位ECN标记,指示对于每个RTP数据包是否被标记为not-ECT, ECT(0)、ECT(1) 或 ECN 拥塞经历 (ECN-CE)。 (“ECT”代表“支持ECN的传输”。)如果RTP流量使用的路径支持ECN,则发送方可以使用ECN-CE标记信息作为拥塞控制信号。

每个 RTP 流均由其同步源 (SSRC) 标识符。因此,RTCP 反馈格式需要按 SSRC 对其报告进行分组,为每个收到的 SSRC 发送一个报告块。

实际上,我们注意到主机操作系统 (OS) 进程中断可能会在不适当的时间发生。因此,需要记录发送方的 RTP 数据包发送时间以及接收方相应的 RTP 数据包到达时间刻意的照顾。这是因为主机操作系统的持续时间相对于单向延迟估计中所需的精度,中断可能很重要。具体地,需要在发送方发送RTP分组之前的最后机会记录发送时间,并且需要在最早的可用机会记录到达接收方的时间。

3.1. RTCP拥塞控制反馈报告

拥塞控制反馈可以作为定期调度的 RTCP 报告的一部分或在 RTP/AVPF 早期反馈数据包中发送。如果作为早期反馈发送,并且使用 RTP/AVPF 配置文件 [RFC4585] 或 RTP/SAVPF 配置文件 [RFC5124],则拥塞控制反馈可以在非复合 RTCP 数据包 [RFC5506] 中发送。

无论如何传输,拥塞控制反馈都会作为传输层反馈消息(RTCP 数据包类型 205)发送。该RTCP数据包的格式如图1所示:

图 1:RTCP 拥塞控制反馈数据包格式

前 8 个八位位组包括标准 RTCP 标头,其中 PT=205 和 FMT=11 指示这是拥塞控制反馈数据包,并且 SSRC 设置为 RTCP 数据包发送方的 SSRC。

[RFC4585] 的第 6.1 节要求 RTCP 标头后跟 正在报告的 RTP 流的 SSRC。因此,RTCP 标头后面跟着一个用于已从其接收到 RTP 数据包的每个 SSRC 的报告块,后面跟着一个报告时间戳。

每个报告块都以它正在报告的接收到的 RTP 流的 SSRC 开始。接下来,报告块包含每个 RTP 数据包的 16 位数据包度量块,该数据包的序列号在 begin_seq 到 begin_seq+num_reports 范围内(含)(使用算术模 65536 计算,以考虑可能的序列号环绕)。如果报告块中包含的 16 位数据包度量块的数量不是 2 的倍数,则必须在最后一个数据包度量块之后添加 16 位零填充,以使数据包度量块的末尾与下一个数据包度量块对齐。 32 位边界。 num_reports 的值可以为 0,表示该 SSRC 不包含任何数据包度量块。每个 报告块不得包含超过 16384 个数据包度量块(即,它不得在单个报告中报告超过四分之一的序列号空间)。

每个16位数据包度量块的内容包括R、ECN和ATO字段,如下所示:

已接收(R,1 位):一个布尔值,指示数据包是否已接收 已收到。 0 表示尚未接收到数据包,并且该 16 位数据包度量块中的后续 15 位(ECN 和 ATO)也设置为 0 并且必须被忽略。 1 表示已收到数据包,需要解析块中的后续位。

ECN(2 位):数据包的回显 ECN 标记。如果未收到或未使用 ECN,这些位将设置为 00。

到达时间偏移(ATO,13 位):RTP 数据包到达接收器的时间,作为该 RTCP 拥塞控制反馈报告的报告时间戳 (RTS) 字段所表示的时间之前的偏移。 ATO 字段以 1/1024 秒为单位(选择该单位是为了给出与 RTS 字段的精确偏移),因此,例如,ATO 值 512 表示 相应的 RTP 数据包在 RTS 字段表示的时刻之前恰好半秒到达。如果测量值大于 8189/1024 秒(该值将编码为 0x1FFD),则必须报告值 0x1FFE 以指示超出范围的测量。如果测量不可用或者 RTP 数据包的到达时间晚于 RTS 字段表示的时间,则必须为数据包报告 ATO 值 0x1FFF。

RTCP 拥塞控制反馈报告数据包以报告时间戳字段(RTS,32 位)结束。这表示该数据包报告的时刻,也是计算到达时间偏移值的时刻。 RTS 字段的值源自用于生成 RTCP 发送方报告 (SR) 数据包中的 NTP 时间戳字段的同一时钟。它被格式化为 NTP 格式时间戳的中间 32 位,如 [RFC3550] 第 4 节中所述。

RTCP 拥塞控制反馈数据包应包含每个活动 SSRC 的报告块。给定 SSRC 的连续报告中报告的序列号范围通常是连续的,但可以发送重叠的报告(并且需要在以下情况下发送)

其中 RTP 数据包重新排序发生在连续报告之间的边界上)。如果一个 RTP 数据包在一份报告中被报告为已接收,则该数据包也必须在随后发送的涵盖其序列号范围的任何重叠报告中报告为已接收。

如果发送覆盖重叠序列号范围的反馈报告,则后面的反馈报告中的信息可以针对包括在两个反馈报告中的RTP分组更新在之前的报告中发送的任何数据。

如果相对于 RTP 数据包的数量而言,RTCP 拥塞控制反馈数据包的发送频率较低,则它们可能会很大。如果 RTCP 拥塞控制反馈数据包太大而无法容纳在路径 MTU 内,则其发送方应将其拆分为多个反馈数据包。 RTCP 报告间隔的选择应使得反馈数据包发送得足够频繁,以至于它们足够小以适合路径 MTU。([RTCP-Multimedia-Feedback]讨论了如何选择报告间隔;RTP拥塞控制算法规范也可以提供指导。)

如果接收到特定 RTP 数据包的重复副本,则必须报告第一个到达副本的到达时间。如果复制数据包的任何副本都带有 ECN-CE 标记,则必须报告该数据包的 ECN-CE 标记;否则,报告第一个到达的副本的 ECN 标记。

如果在报告间隔内没有从 SSRC 接收到数据包,则可以发送报告块,其中 begin_seq 设置为先前从该 SSRC 接收到的最高序列号,并且 num_reports 设置为 0(或者可以简单地省略报告)。对应的发件人报告/接收器报告 (SR/RR) 数据包将具有非增加的扩展最高序列号接收字段,该字段将通知发送方尚未收到数据包,但可以简化处理以在拥塞控制反馈报告中也提供该信息。

指示某些 RTP 数据包丢失的报告块不应被解释为重传丢失数据包的请求。如果已协商重传有效负载格式,则此类报告的接收方可能会选择重传此类数据包,但不要求这样做。

4. 反馈频率和开销

在报告的速度和准确性以及报告的开销之间需要权衡。 [RTCP-多媒体反馈]讨论了这种权衡,提出了理想的 RTCP 反馈率,并提供了有关如何配置(例如,RTCP 带宽分数)以适当使用本备忘录中描述的报告块的指导。 RTP 拥塞控制算法规范也可以提供指导。

人们普遍认为,反馈越频繁,拥塞控制算法效果越好。然而,RTCP带宽和传输规则对RTCP反馈消息可以从RTP接收器发送到RTP发送器的频率设置了一些上限。

在许多情况下,在报告开销变得过多之前,每帧发送一次反馈是上限,尽管这取决于媒体速率,并且高速率媒体流可能需要更频繁的反馈[RTCP-多媒体反馈]。分析[反馈要求]还表明,一些候选拥塞控制算法可以使用 50-200 ms 的反馈间隔范围,以不太频繁的反馈进行操作。应用程序需要根据拥塞控制算法的选择、预期的媒体比特率和可接受的反馈开销,在会话建立时协商适当的拥塞控制反馈间隔。

5. 反馈包丢失的响应

与所有 RTCP 数据包一样,RTCP 拥塞控制反馈数据包可能会丢失。所有 RTP 拥塞控制算法必须指定它们如何响应反馈数据包的丢失。

RTCP 数据包不包含序列号,因此必须根据自上次反馈数据包以来的时间来推断反馈数据包的丢失。如果仅丢失一个拥塞控制反馈数据包,则适当的响应是假设拥塞水平与先前的报告大致保持相同。然而,如果多个连续的拥塞控制反馈数据包丢失,则媒体发送方应该快速降低其发送速率,因为这可能表明路径故障。 RTP断路器规范[RFC8083] 提供进一步的指导。

6.SDP信令

定义了一个新的“ack”反馈参数“ccfb”,与“a=rtcp-fb:”会话描述协议(SDP)扩展一起使用,以指示使用第 3 节中定义的 RTP 拥塞控制反馈数据包格式。该SDP参数扩展的ABNF定义[RFC5234]是:

rtcp-fb-ack-param = <参见 [RFC4585] 的第 4.2 节>

rtcp-fb-ack-param =/ccfb-parccfb-par = SP“ccfb”与“ccfb”反馈一起使用的有效负载类型必须是通配符类型(“*”)。这意味着拥塞控制反馈是针对会话中使用的所有有效负载类型发送的,包括任何前向纠错(FEC)和重传有效负载类型。生成的 SDP 属性的示例如下:

a=rtcp-fb:* ack ccfb

这些SDP反馈参数的提供/应答规则是 RTP/AVPF 配置文件 [RFC4585] 的第 4.2 节中指定。

SDP 提议可能表明支持本备忘录中指定的拥塞控制反馈机制以及提供基本相同语义的一个或多个替代拥塞控制反馈机制。在这种情况下,应答方应该包括其答案中仅提供一种拥塞控制反馈机制。如果收到包含同一组拥塞控制反馈机制的后续提议,则生成的答案应尽可能选择与原始答案中相同的拥塞控制反馈机制。

当SDP BUNDLE扩展[RFC8843]用于复用时,“a=rtcp-fb:”属性具有多路复用类别IDENTICAL-PER-PT[RFC8859]。

7. 与 RFC 6679 的关系

[RFC6679]中描述了显式拥塞通知(ECN)与 RTP 的使用,它指定了如何与 RTP 协商 ECN 的使用,并定义了 RTCP ECN 反馈数据包来携带 ECN 反馈报告。它使用 SDP“a=ecn-capable-rtp:”属性来协商 ECN 的使用,并使用“a=rtcp-fb:”属性和“nack”参数“ecn”来协商 RTCP ECN 的使用数据包。

当 ECN 与本备忘录中定义的 RTP 拥塞控制反馈数据包一起使用时,RTCP ECN 反馈数据包没有用处,因为它提供了重复的信息。当拥塞控制反馈与 RTP 和 ECN 一起使用时,生成的 SDP 提议必须包含用于协商 ECN 支持的“a=ecn-capable-rtp:”属性,以及与“ack”参数“ccfb”表示可以使用RTP拥塞控制反馈包。 “a=rtcp-fb:”属性还可以包括“nack”参数“ecn”以指示还支持 RTCP ECN 反馈数据包。如果SDP 为 RTP 拥塞控制反馈数据包和 RTCP ECN 反馈数据包提供信号支持,应答方应该在其 SDP 应答中信号支持一种格式,但不能同时支持两种格式,以避免发送重复的反馈。

当将 ECN 与 RTP 结合使用时,请遵循 [RFC6679] 第 7.2 节中的指南

必须遵循在 RTP 会话中启动 ECN 的使用。还必须遵循 [RFC6679] 第 7.3 节中关于在 RTP 会话中持续使用 ECN 的指南,但反馈是使用本备忘录中描述的 RTCP 拥塞控制反馈数据包而不是使用 RTP ECN 反馈数据包发送的。同样,[RFC6679]第 7.4 节中的指导相关 必须遵循检测故障的方法,但必要的信息是从 RTCP 拥塞控制反馈数据包而不是从 RTP ECN 反馈数据包中检索的。

8. 设计原理

RTCP SR/RR 数据包的主要功能是报告 RTP 数据包接收的统计数据。这些数据包中发送的接收报告块包含有关观察到的抖动、部分数据包丢失和累积数据包丢失的信息。该信息的目的是可用于支持拥塞控制算法,但经验表明它不足以实现该目的。

高效的拥塞控制算法需要比 SR/RR 数据包提供的有关每个数据包接收质量的更细粒度的信息才能有效做出反应。本备忘录中定义的反馈格式提供了如此细粒度的反馈。

其他几个 RTCP 扩展也提供比 SR/RR 数据包更详细的反馈:

TMMBR:RTP/AVPF 配置文件 [RFC5104] 的编解码器控制消息包括临时最大媒体流比特率请求 (TMMBR) 消息。这用于从 RTP 数据包接收方向发送方传达临时最大比特率限制。尽管 TMMBR 并非旨在取代拥塞控制,但它已被用作进行基于接收器的拥塞控制的一种方法,其中会话带宽足够高,可以发送频繁的 TMMBR 消息,特别是与非复合 RTCP 数据包一起使用时 [RFC5506] 。这种方法要求 RTP 数据包的接收方监视其接收情况,确定拥塞程度,并推荐适合路径上当前可用带宽的最大比特率;它还假设 RTP 发送方可以/将会尊重该比特率。这与本备忘录中建议的基于发送者的拥塞控制方法相反,因此 TMMBR 不能用于传达基于发送者的拥塞控制所需的信息。然而,TMMBR 可以被视为一种补充机制,可以告知发送方接收方当前对可接受的最大比特率的看法。

传达接收器对最大可用比特率的估计的机制提供了类似的反馈。

RTCP 扩展报告 (XR):定义了许多 RTCP XR 块来报告数据包丢失、到达时间 [RFC3611]、延迟 [RFC6843] 和 ECN 标记 [RFC6679] 的详细信息。可以将多个此类 XR 块组合成一个复合 RTCP 数据包,以报告有效的基于发送方的拥塞控制所需的详细丢失、到达时间和 ECN 标记信息。

然而,由于需要堆叠多个报告,结果在带宽和复杂性方面都有很高的开销。

传输范围的拥塞控制:本备忘录中定义的格式提供了每个 SSRC 的单独反馈。另一种方法是向每个 RTP 数据包添加标头扩展,其中包含单个传输范围的数据包序列号,然后让接收方发送 RTCP 报告,提供有关这些附加序列号的反馈 [RTP-Ext-for-CC]。由于报头扩展,这种方法将每个 RTP 数据包的大小增加了 8 个八位位组,但减少了 RTCP 反馈数据包的大小,并且如果它保持适用于所有数据包的单一速率限制,则可以简化发送方的速率计算。发送的 RTP 数据包,无论其类型如何 SSRC。同样,使用整个运输范围的反馈使其更加 很难根据在每个 SSRC 上观察到的接收和/或丢失模式来调整发送速率或响应丢失的数据包(例如,执行差分速率控制和 基于每个流丢失的数据包的知识来修复音频和视频流)。运输范围的反馈也不太适合更广泛的 RTP 框架,这使得 广泛使用每个 SSRC 序列号和反馈。

考虑到这些问题,我们认为设计一种新的 RTCP 反馈机制来为基于发送者的拥塞控制算法传递信息是适当的。新的拥塞控制反馈 第 3 节中描述的 RTCP 数据包提供了这样的机制。

9. IANA 考虑因素

IANA 在“RTPFB 有效负载类型的 FMT 值”表 [RFC4585] 中注册了一条新的 RTP/AVPF 传输层反馈消息,如第 3.1 节中所定义:

名称:CCFB

全名:RTP拥塞控制反馈

值:11

参考:RFC 8888

IANA 还注册了一项新的 SDP“rtcp-fb”属性“ack” SDP“ack”和“nack”属性值中的参数“ccfb”

注册表:

值名称:ccfb

长名称:拥塞控制反馈

可用于:ack

多路复用器:每个 PT 相同

参考:RFC 8888

10. 安全考虑

RTP 规范 [RFC3550]、适用的 RTP 配置文件(例如,[RFC3551]、[RFC3711] 或 [RFC4585])的安全考虑, 以及正在使用的 RTP 拥塞控制算法(例如,[RFC8698], [RFC8298]、[Google-GCC] 或 [RFC8382])适用。

故意生成不准确的 RTCP 拥塞控制反馈报告的接收方可能会欺骗发送方以高于路径可支持的速率进行发送,从而导致路径拥塞。这种情况将对该接收器的体验质量,可能会导致共享路径的其他流量拒绝服务以及媒体发送器的资源使用量过度增加。由于 RTP 是一种不可靠的传输,发送方可以故意丢弃数据包,在 RTP 序列号空间中留下间隙,而不会造成严重损害,以检查接收方是否正确报告丢失。 (这需要小心完成,并对所发送的媒体数据有一定的了解,以限制对用户体验的影响。)

可以修改 RTCP 拥塞控制反馈数据包的路径攻击者可以更改报告以欺骗发送方以过高或过低的速率发送,从而导致拒绝服务。安全 RTCP 配置文件 [RFC3711] 可用于验证 RTCP 数据包以防止此类攻击。

可以欺骗 RTCP 拥塞控制反馈数据包的偏离路径攻击者同样可以欺骗发送方以不正确的速率发送,从而导致拒绝服务。这种攻击很困难,因为攻击者还需要猜测 SSRC 和序列号到目的地传输地址。与路径攻击一样,安全 RTCP 配置文件 [RFC3711] 可用于验证 RTCP数据包以防止此类攻击。

关于转载

转载此文请注明出处,“引用于新睿云.弘电脑”,否则请回避。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【每日力扣】235. 二叉搜索树的最近公共祖先与39. 组合总和问题描述

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害。 235. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义…

简易版 RPC 框架实现 2.0 -netty实现

这一篇理解如果有难度&#xff0c;可能对netty不是很理解&#xff0c; 可以关注我netty专栏&#xff0c;还有另外一篇&#xff1a; 用 Netty 自己实现简单的RPC&#xff0c; 这一篇是学习netty的时候写的&#xff0c;更倾向于分析netty相关的知识&#xff0c; 今天我是学习dubb…

Delphi7应用教程学习1.3【练习题目】:文本及悬停文字的显示

这个例子主要用到了btn的Hint 属性&#xff0c;Hint是提示的意思。 还有Delphi7还是很好用的&#xff0c;改变了的属性是粗体&#xff0c;默认没有改变的属性为细体。

插入排序:一种简单而有效的排序算法

插入排序&#xff1a;一种简单而有效的排序算法 一、什么是插入排序&#xff1f;二、插入排序的步骤三、插入排序的C语言实现四、插入排序的性能分析五、插入排序的优化六、总结 在我们日常生活和工作中&#xff0c;排序是一种非常常见的操作。比如&#xff0c;我们可能需要对一…

B端界面又丑又乱,也不会总结规范,来,我给5个规范模板,照着学

发5个别人总结的规范&#xff0c;一定会对你的B端系统改进&#xff0c;有帮助的。

TSINGSEE青犀AI烟火识别等算法打造电瓶车消防安全解决方案

一、背景分析 根据国家消防救援局的统计&#xff0c;2023年全国共接报电动自行车火灾2.1万起&#xff0c;相比2022年上升17.4%&#xff0c;电动自行车火灾安全隐患问题不容忽视。 电瓶车火情主要问题和原因&#xff1a; 电瓶车/电池质量良莠不齐用户安全意识薄弱&#xff0c…

虚拟机NAT模式配置

注意这里IP要和网关在同一网段&#xff0c;且虚拟机默认网关末尾为.2&#xff08;如果默认网关配置为.1会与宿主机冲突&#xff0c;导致无法ping通外网&#xff09; 点击NAT模式下的NAT设置即可查看默认网关 这里的网关可以理解为主机与虚拟机交互的入口

蓝桥杯算法训练VIP-数组查找及替换

题目 1634: 蓝桥杯算法训练VIP-数组查找及替换 时间限制: 3s 内存限制: 192MB 提交: 1629 解决: 890 题目描述 给定某整数数组和某一整数b。要求删除数组中可以被b整除的所有元素&#xff0c;同时将该数组各元素按从小到大排序。如果数组元素数值在A到Z的ASCII之间&#xff0…

MySQL:SQL优化

1. 插入优化 使用insert语句单条单条数据插入效率偏低&#xff0c;建议使用insert批量插入数据&#xff0c;批量控制在500-1000条数据较为合适&#xff0c;当面对数以百万的数据时&#xff0c;可以使用load指令&#xff0c;提升插入数据效率 相关指令 #客户端连接服务端加上参…

Java后端面试经验分享,~纯分享

本文将从面试、工作、学习三个方面分享最近面试的一些心得以及以后发展的一些规划&#xff0c;仅供参考&#xff0c;哈哈&#xff0c;毕竟本人也很菜&#xff0c;因为菜才要多学习。一会儿也会分享两本Java面试题库&#xff08;题库是b站大学找的&#xff0c;一会儿我也会分享出…

C# Onnx C2PNet 图像去雾 室内场景

目录 介绍 效果 模型信息 项目 代码 下载 C# Onnx C2PNet 图像去雾 室内场景 介绍 github地址&#xff1a;GitHub - YuZheng9/C2PNet: [CVPR 2023] Curricular Contrastive Regularization for Physics-aware Single Image Dehazing [CVPR 2023] Curricular Contrasti…

DataGrip 面试题及答案整理,最新面试题

DataGrip的数据库兼容性和多数据库支持如何实现&#xff1f; DataGrip实现数据库兼容性和多数据库支持的方式包括&#xff1a; 1、广泛的数据库支持&#xff1a; DataGrip支持多种数据库&#xff0c;包括但不限于MySQL, PostgreSQL, SQL Server, Oracle, SQLite, 和MongoDB&a…

C++:类之六脉神剑——默认成员函数

个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 一、默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为 空类 。 空类中真的什么都…

管理类联考–复试–政治--二十大--记忆宫殿

文章目录 整体记忆宫殿门床头柜床书桌阳台 口诀记忆法 整体 记忆宫殿 要有逻辑的放到房间了 何为逻辑&#xff0c;如下大佬总结的便是&#xff0c;或者可自行总结&#xff0c;有前后顺序&#xff0c;做事逻辑即可 第一步&#xff1a;将逻辑的点放到房间里的点&#xff0c;…

每日OJ题_简单多问题dp⑥_力扣714. 买卖股票的最佳时机含手续费

目录 力扣714. 买卖股票的最佳时机含手续费 状态机分析 解析代码 力扣714. 买卖股票的最佳时机含手续费 714. 买卖股票的最佳时机含手续费 难度 中等 给定一个整数数组 prices&#xff0c;其中 prices[i]表示第 i 天的股票价格 &#xff1b;整数 fee 代表了交易股票的手续…

cannot find -xml2: No such file or directory的解决方法

一&#xff0c;问题现象 在编译库的时候出现如下图所示的报错&#xff1a;C:/msys64/mingw32/bin/…/lib/gcc/i686-w64-mingw32/13.2.0/…/…/…/…/i686-w64-mingw32/bin/ld.exe: ca nnot find -lxml2: No such file or directory collect2.exe: error: ld returned 1 exit s…

spring boot集成redis实现共享存储session

spring boot集成redis实现共享存储session redis实现共享存储session 首先下载redis,我下载的版本是5.0.14,目前官网貌似找不到5.x版本&#xff0c;可以自行去网上寻找。我这里的springboot版本是2.6.4引入redis依赖 <!-- https://mvnrepository.com/artifact/org.spring…

火车订票管理系统|基于springboot框架+ Mysql+Java+B/S结构的火车订票管理系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 用户功能模块 系统功能设计 数据库E-R图设计 lunwen…

【已解决】Nginx启动[emerg] bind() to 0.0.0.0:80 failed(98:Address alreadyin use)

原因分析 在Ubuntu系统上启动nginx服务时&#xff0c;出现如下报错&#xff1a; 该错误表明端口 80 已经被其他进程占用&#xff0c;导致 Nginx 无法绑定到该端口上。原因就是系统里面显存一个nginx服务。需要先停下来&#xff0c;才能再次启动服务。 解决步骤 1.执行命名服务…

SpringBoot打造企业级进销存储系统 第五讲

package com.java1234.repository;import com.java1234.entity.Menu; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query;import java.util.List;/*** 菜单Repository接口*/ public interface MenuReposit…