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

计算机网络:数据链路层 - 可靠传输协议

计算机网络:数据链路层 - 可靠传输协议

    • 可靠传输概念
    • 停止-等待协议 SW
    • 回退N帧协议 GBN
    • 选择重传协议 SR


可靠传输概念

如下所示,帧在传输过程中受到干扰,产生了误码。接收方的数据链路层,通过真伪中的真检验序列 FCS 字段的值,也就是检错码可以检测出帧中出现了比特差错。那么接下来该如何处理呢?

在这里插入图片描述

这取决于数据链路层向其上层提供的服务类型:

  • 如果提供的是不可靠传输服务,则仅仅丢弃有误码的帧,其他什么也不做。
  • 如果提供的是可靠传输服务,那就还要想办法实现发送端发送什么,接收端就收到什么

一般情况下,有线链路的雾码率比较低,为了减小开销,并不要求数据链路层向上提供可靠传输服务,即使出现了物码可靠传输的问题,由其上层处理。

然而,对于无线链路,由于其容易受到干扰,雾码率比较高,因此要求数据链路层必须向上层提供可靠传输服务。

最后要注意的是:可靠传输服务并不仅局限于数据链路层,其他各层均可选择实现可靠传输服务

接下来本博客将讲解三种可靠传输协议,这三种可靠传输实现机制的基本原理并不仅限于数据链路层,可以应用到计算机网络体系结构的各层协议中。


停止-等待协议 SW

如图所示,收发双方基于互联网进行通信,纵坐标为时间,发送方给接收方发送数据分组:

在这里插入图片描述

接收方收到后对其进行差错检测,若没有误码,则接受该数据分组并给发送方发送确认。分组简称为ACK发送方收到对所发送数据分组的确认分组后才能发送下一个数据分组

假设这个数据分组在传输过程中出现了误码,接收方收到后对其进行差错检测,发现了误码,则丢弃该数据分组,并给发送方发送否认分组,简称为NAK

在这里插入图片描述

发送方收到对所发送数据分组的否认NAK,分组后就知道了之前自己所发送的数据分组出现了差错而被接收方拒绝,于是立刻重传该数据分组。因此发送方每发送完一个数据分组后,并不能立刻将该数据分组从缓存中删除,只有在收到针对该数据分组的确认分组后,才能将其从缓存中删除。

发送方每发送完一个数据分组后,就停止发送下一个数据分组,等待来自接收方的确认分组或否认分组。

  • 若收到确认分组,则可继续发送下一个数据分组
  • 若收到否认分组,则重发之前发送的那个数据分组。

这样就实现了发送方发送什么,接收方最终都能收到什么,也就是所谓的可靠传输。

但实际情况远比我们想象的要复杂,来看这种情况,发送方给接收方发送数据分组,然而该数据分组在传输过程中丢失了。

在这里插入图片描述

需要说明的是,对于数据链路层点对点信道而言,不太容易出现这种情况,但对于多个网络通过多个路由器互联的复杂互联网环境而言,这种情况是会经常出现的。

对于这种情况,接收方既然收不到数据分组,那么也就不会无缘无故的发送确认或否认分组。如果不采取其他措施,发送方就会一直处于等待接收方确认或否认分组的状态。为了解决该问题,可以在发送方发送完一个数据分组时启动一个超时计时器。若到了超时计时器所设置的重传时间,而发送方仍收不到接收方的确认或否认分组,则重传原来的数据分组,这就叫做超时重传。一般可将重传时间选为略大于从发送方到接收方的平均往返时间。

如图所示,发送方超时重传之前所发送的数据分组:

在这里插入图片描述

接收方正确接收重传的数据分组后,给发送方发送确认分组。发送方收到确认分组后发送下一个数据分组。接收方正确接收该数据分组后给发送方发送确认分组。到目前为止貌似基于停止等待使用确认或否人分组,再加上超时重传的手段,就可以实现可靠传输了。

再来看这种情况,既然发送方发送的数据分组可能丢失,那么接收方发送的确认或否认分组就也有可能丢失。例如发送方发送了一个数据分组,接收方正确接收该数据分组后,给发送方发送确认分组,但该确认分组在传输过程中丢失了。这必然会造成发送方对之前所发送数据分组的超时重传:

在这里插入图片描述

假设这个重传的数据分组也正确到达了接收方,那么现在问题来了,接收方如何判断该数据分组是否是一个重复的分组呢?

为了避免分组重复这种传输错误,必须给每个数据分组带上序号。对于停止等待协议,由于每发送一个数据分组就进行停止等待,只要保证每发送一个新的数据分组,其序号与上次发送的数据分组的序号不同就可以了。因此用一个比特来编号就够了,记序号 0 和 1。

这样根据数据分组的序号接收方,就可以判断出该数据分组是否是重复的。接收方丢弃重复的数据分组,并给发送方发送针对该数据分组的确认分组,以免发送方对该数据分组的再次超时重传

在这里插入图片描述

第一次接受方接收到了DATA0,然后往回传递ACK表示接收到了该分组。发送方没有受到ACK,触发超时重传。当接收方第二次接收到DATA0,就知道这和上一次是同一个分组,把它丢弃再重传一次ACK。当发送方收到ACK,就发送和上一次编号不一样的分组DATA1,接收方收到DATA1,发现和上一次不一样,于是正常接收该分组。

我们通过确认分组丢失的情况,引出了给数据分组编号的问题,请大家思考一下,既然数据分组需要编号,那么确认分组是否也需要编号呢?

来看这种情况:
在这里插入图片描述
发送方发送 0 号数据分组,接收方正确接收后给发送方发送确认分组,由于某些原因,该确认分组迟到了,这必然会导致发送方对 0 号数据分组的超时重传。

在这里插入图片描述

在重传的 0 号数据分组的传输过程中,发送方收到了迟到的确认分组,于是发送 1 号数据分组。接收方收到重传的 0 号数据分组后,发现这是一个重复的数据分组,将其丢弃,并针对该数据分组给发送方发送确认分组,以免发送方再次超时重传该数据分组。现在问题来了,我们可以非常清楚的看到,这是一个对 0 号数据分组的重复确认,但是发送方又如何知道这个ACK是 0 号数据的,而不是 1 号数据的呢?

如果不采取其他措施的话,发送方会误认为这是对 1 号数据分组的确认。如果对确认分组也进行编号,就可以使发送方避免这种误判。如图所示:

在这里插入图片描述

该确认分组的序号为0,发送方通过确认分组的序号知道这是一个重复的确认分组,忽略即可。这个过程叫做确认迟到

我们用给确认分组编号的方法解决了确认迟到所导致的重复确认的问题。需要说明的是,对于数据链路层的点对点信道往返时间比较固定,不会出现确认迟到的情况。因此,如果只在数据链路层实现停止等待协议,可以不用给确认分组编号

接下来我们对停止等待协议的一些注意事项进行一下小结:

  • 接收端检测到数据分组有误码时,将其丢弃,并等待发送方的超时重传。
  • 为了让接收方能够判断所收到的数据分组是否是重复的,需要给数据分组编号。由于停止等待协议的停等特性,只需一个比特编号就够了。记序号 0 和一。
  • 为了让发送方能够判断所收到的确认分组是否是重复的,需要给确认分组编号。数据链路层一般不会出现确认分组迟到的情况,因此在数据链路层实现停止-等待协议,可以不用给确认分组编号。

接下来我们来看看停止等待协议的信道利用率,发送方发送完一个数据分组后就停止发送,并等待接收方对该数据分组的确认。当收到确认分组后,可以发送下一个数据分组:

在这里插入图片描述

  • T D T_{D} TD:发送方发送数据分组所耗费的发送时延
  • RTT:收发双方之间的往返时间
  • T A T_{A} TA: 接收方发送确认分组所耗费的发送时延

途中忽略了接收方对数据分组的处理时延以及发送方对确认分组的处理时延。

总时间为: T D T_{D} TD + RTT + T A T_{A} TA,因此信道的利用率 U 可以用下式来计算:

信道利用率  U = T D T D + R T T + T A \text { 信道利用率 } U=\frac{T_{D}}{T_{D}+R T T+T_{A}}  信道利用率 U=TD+RTT+TATD

T A T_{A} TA一般都远小于 T D T_{D} TD可以忽略,当 RTT 远大于 T D T_{D} TD时,信道利用率会非常低。为了克服停止等待协议,信道利用率很低的缺点,就产生了另外两种协议,即后退N帧协议 GBN 和 选择重传协议。


回退N帧协议 GBN

我们刚介绍了停止等待协议,发送方每发送完一个数据分组,就要停止发送,并等待接收方的确认分组。当收到接收方的确认分组后,才能发送下一个数据分组,如此反复进行。可以看出,发送方每发送完一个数据分组,就至少要等待一个收发双方之间的往返时间。当往返时间较大时,例如卫星链路。停止等待协议的信道利用率很低。若出现超时重传,则信道利用率更低。如图所示,如果发送方在收到接收方的确认分组之前,可以连续发送多个数据分组,则可大大提高信道利用率:

在这里插入图片描述

回退N帧协议,该协议在以上传输的基础上,利用发送窗口来限制发送方可连续发送分组的个数。我们来举例说明,假设采用 3 个比特给分组编序号,因此序号的取值范围是 0- 7。如图所示:
在这里插入图片描述

这是收发双方各自的分组序号。当序号增加到7,下一个序号又从 0 开始。

发送方要维持一个发送窗口,序号落在发送窗口内的数据分组可被连续发送,而不必等收到接收方的相应确认分组后再发送:

在这里插入图片描述

发送窗口的尺寸记为 W T W_{T} WT 。对于本例,其取值范围是[0, 7]。本例取 W T W_{T} WT 的值为5。如果 W T W_{T} WT 的值取为 1,则是停止等待协议。如果 W T W_{T} WT 的值超过取值范围的上限,则会造成严重的错误,我们之后会举例详细说明。

序号落在发送窗口内的数据分组可以连续发送,而序号落在发送窗口外的数据分组不允许发送。

接收窗口的尺寸记为 W R W_{R} WR 对于回退N帧协议,其取值只能为 1,这一点与停止等待协议是相同的。如图所示:

在这里插入图片描述
序号落在接收窗口内的这个数据分组允许接收,而序号落在接收窗口外的数据分组不允许接收。

我们首先来看最简单的情况,也就是无差错的情况,发送方将序号落在发送窗口内的 0- 4 号数据分组依次连续发送出去:

在这里插入图片描述

他们经过互联网的传输,正确到达了接收方,也就是没有出现乱序和误码。接收方按序接收,他们每接收一个数据,接收窗口就向前滑动一个位置,并给发送方发送接收分组的确认分组:

在这里插入图片描述

发送方每接收一个确认分组,发送窗口就向前滑动一个位置,这样就有新的序号落入了发送窗口。发送方可以将收到确认的数据分组从缓存中删除了:

在这里插入图片描述

接下来我们来看累积确认的概念。使用回退N帧协议的接收方可以采用累积确认的方式,也就是说接收方不一定要对收到的数据分组逐个发送确认,而是可以在收到几个数据分组后,对按序到达的最后一个数据分组发送确认ACKn ,表示序号为 n 及以前的所有数据分组都已正确接收了

我们来举例说明累计确认:
在这里插入图片描述

发送方将序号落在发送窗口内的 0- 4 号数据分组依次连续发送出去。他们经过互联网的传输,正确到达了接收方,按序接收。

当接收完 0 号和 1 号数据分组后,给发送方发送了一个累计确认ACK 1。当接收完 2- 4 号数据分组后,又给发送方发送了一个累计确认ACK4。假设ACK 1在传输过程中丢失了,而 ACK 4正确到达了发送方:

在这里插入图片描述

发送方接收ACK 4后就知道了序号为 4 及之前的数据分组已被接收方正确接收了,于是将发送窗口向前滑动 5 个位置。这样就有新的序号落入了发送窗口。从本例可以看出,使用累计确认的其中一个优点就是即使确认分组丢失,发送方也可能不必重传。例如本例中aACK 1丢失了,但并没有造成 1 号数据分组的超时重传。使用累计确认还有其他好处,例如可以减小接收方的开销,减少对网络资源的占用等。

接下来我们来看出现差错的情况,发送方将序号落在发送窗口内的这 5 个数据[5,6,7,0,1]分组依次连续发送出去。他们经过互联网的传输到达了接收方,假设他们在传输过程中受到了干扰,其中 5 号数据分组出现了误码:

在这里插入图片描述

接收方通过数据分组中的检错码发现了错误,于是丢弃该数据分组。而==后续到达的这四个数据分组的序号与接收窗口中的序号不匹配,接收方同样也不能接受他们,将他们丢弃:

在这里插入图片描述

然后对之前按序接收的最后一个数据分组进行确认,也就是发送ACK4,每丢弃一个数据分组就发送一个ACK4 

在这里插入图片描述

这四个ACK4经过互联网的传输到达了发送方。发送方之前就接收过ACK4,当收到这些重复的ACK4 时,就知道了之前所发送的数据分组出现了差错于是可以不等超时计时器超时就立刻开始重传,至于收到几个重复确认就立刻重传,由具体实现来决定。

在本例中,尽管序号为 6701 的数据分组之前已经正确的到达接收方,但由于 5 号数据分组误码不被接受,他们也受到牵连而不被接受发送方还要重传这些数据分组,这就是所谓的 go back N,也就是回退N帧。可见当通信线路质量不好时,回退N帧协议的信道利用率并不比停止等待协议高。

为了减少开销,接收方不一定每收到一个按序到达且无误码的数据分组,就给发送方发回一个确认分组,而是可以在连续收到好几个按序到达且无误码的数据分组后,才针对最后一个数据分组发送确认分组,这称为累积确认


选择重传协议 SR

刚刚我们介绍了回退N帧协议。回退N帧协议的接收窗口尺寸 W T W_{T} WT 能等于一,因此接收方只能按序接收正确到达的数据分组。一个数据分组的误码就会导致其后续多个数据分组不能被接收方按序接收而丢弃,尽管他们没有误码。这必然会造成发送方对这些数据分组的超时重传,显然,这是对通信资源的极大浪费。

为了进一步提高性能,可设法只重传出现误码的数据分组。因此,接收窗口的尺寸 W R W_{R} WR不应再等于一,而应大于一,以便接收方先收下失序到达但无误码,并且序号落在接收窗口内的那些数据分组,等到所缺分组收齐后再一并送交上层。这就是本节课所要介绍的选择重传协议。

需要注意的是,选择重传协议,为了使发送方仅重传出现差错的数据,分组接收方不能再采用累积确认,而需要对每个正确接收到的数据分组进行逐一确认

下面我们来举例说明选择重传协议的工作原理。假设采用 3 个比特给分组编序号,因此序号的取值范围是 0- 7。如图所示:

在这里插入图片描述

  • 发送窗口的尺寸 W T W_{T} WT的取值范围是[1,7],本例取 W T W_{T} WT的值为4。序号落在发送窗口内的这 4 个数据分组可以连续发送。而序号落在发送窗口外的数据分组不允许发送
  • 接收窗口的尺寸 W R W_{R} WR的取值一般情况下可与发送窗口的尺寸 W T W_{T} WT的取值相同,在本例中,其值为4。序号落在接收窗口内的这 4 个数据分组允许接收,而序号落在接收窗口外的数据分组不允许接收

发送方将序号落在发送窗口内的这四个数据分组依次连续发送出去。他们经过互联网的传输陆续到达接收方,但其中的 2 号数据分组丢失了:

在这里插入图片描述

只要序号落入接收窗口内且无误码的数据分组,接收方都会接收, 先接受0 号和 1 号数据分组,并发送 0 号和 1 号确认分组,接收窗口向前滑动两个位置:

在这里插入图片描述

这样就有 4 和 5 这两个新的序号落入接收窗口。接收方接收 3 号数据分组并发送 3 号确认分组:

在这里插入图片描述

但接收窗口不能向前滑动,因为 3 号数据分组是未按需到达的数据分组。

发送方每按序收到一个确认分组发送窗口就向前滑动一个位置。发送方接收 0 号和 1 号确认分组,发送窗口向前滑动两个位置,这样就有 4 和 5 这两个新的序号落入发送窗口,发送方将序号落入发送窗口的 4 号和 5 号数据分组发送出去:

在这里插入图片描述

发送方接收 3 号确认分组,但发送窗口不能向前滑动,因为这是一个未按序到达的确认分组。发送方还未收到 3 之前的 2 号确认分组。不过需要记录 3 号数据分组已收到确认,这样该数据分组就不会超时重发

在这里插入图片描述

4 号和 5 号数据分组到达接收方,接收他们并发送 4 号和 5 号确认分组,但接收窗口不能向前滑动,因为他们是未按序到达的数据分组,接收方还未收到他们之前的 2 号数据分组:

在这里插入图片描述

假设在 4 号和 5 号确认分组的传输过程中,发送方针对 2 号数据分组的重传计时器超时了,发送方重传 2 号数据分组:

在这里插入图片描述

4 号和 5 号确认分组陆续到达发送方接收他们,但发送窗口不能向前滑动,因为他们是未按序到达的确认分组,发送方还未收到他们之前的 2 号确认分组,不过需要记录 4 号和 5 号数据。分组已收到确认,这样他们就不会超时重发:

在这里插入图片描述

发送方之前重传的 2 号数据。分组到达接收方,接收方接收该数据分组并发送 2 号确认。分组接受窗口现在可以向前滑动四个位置,这样就有 6701 这四个新的序号落入接收窗口:

在这里插入图片描述

2 号确认分组经过互联网的传输到达发送方接收,该确认分组发送窗口现在可以向前滑动四个位置,这样就有 6701 这四个新的序号落入发送窗口。发送方现在就可以继续将这四个序号的数据分组依次发送出去了:

在这里插入图片描述

可见,选择重传协议是对回退N帧协议的优化,将接收窗口扩大,哪怕数据不是按照顺序发送的,也可以接收。这样就可以避免对一些已经正常传递的数据的重发,提升效率。


相关文章:

计算机网络:数据链路层 - 可靠传输协议

计算机网络:数据链路层 - 可靠传输协议 可靠传输概念停止-等待协议 SW回退N帧协议 GBN选择重传协议 SR 可靠传输概念 如下所示,帧在传输过程中受到干扰,产生了误码。接收方的数据链路层,通过真伪中的真检验序列 FCS 字段的值&…...

苍穹外卖07(缓存菜品,SpringCache,缓存套餐,添加购物车菜品和套餐多下单,查看购物车,清除购物车,删除购物车中一个商品)

目录 一、缓存菜品 1 问题说明 2 实现思路 3 代码开发:修改DishServiceImpl 4 功能测试 二、SpringCache 1. 介绍 2. 使用语法 1 起步依赖 2 使用要求 3 常用注解 4 SpEL表达式(了解备用) 5 步骤小结 3.入门案例 1 准备环境 2 使用入门 1 引导类上加…...

C语言第三十八弹---编译和链接

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 编译和链接 1、翻译环境和运行环境 2、翻译环境 2.1、预处理(预编译) 2.2、编译 2.2.1、词法分析 2.2.2、语法分析 2.2.3、语义分…...

无人售货奶柜:开启便捷生活的新篇章

无人售货奶柜:开启便捷生活的新篇章 在这个快节奏的现代生活中,科技的革新不仅为我们带来了前所未有的便利,更在不经意间改变着我们的日常。其中,无人售货技术的出现,尤其是无人售货奶柜,已经成为我们生活…...

STM32为什么不能跑Linux?

STM32是一系列基于ARM Cortex-M微控制器的产品,它们主要用于嵌入式系统中。而Linux则是一个开源的类Unix操作系统,主要面向的是桌面电脑、服务器等资源丰富的计算机。虽然理论上可以将Linux移植到STM32上运行,但是由于两者之间存在着很多技术…...

Dubbo 3.x源码(18)—Dubbo服务引用源码(1)

基于Dubbo 3.1,详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了Dubbo的服务导出的源码,在DubboBootstrapApplicationListener#startSync方法中,在调用了exportServices方法进行服务导出之后,立即调用了referServices方法…...

设计模式:工厂模式和抽象工厂模式的区别

定义 工厂模式(Factory Pattern)通常指的是工厂方法模式(Factory Method Pattern),它定义了一个创建对象的方法,由子类决定要实例化的类。工厂方法让类的实例化推迟到子类。 抽象工厂模式(Abstract Factory Pattern)提供了一个接口,用于创建相关或依赖对象的家族,而…...

python面试题(36~50)

36、如何取一个整数的绝对值? 这可以通过abs函数来实现。 abs(2) #> 2 abs(-2) #> 2 37、如何将两个列表组合成一个元组列表? 可以使用zip函数将列表组合成一个元组列表。这不仅仅限于使用两个列表。也适合3个或更多列表的情况。 a [a,b,c] b [1,2,3] [(k,v) fo…...

Vue 样式技巧总结与整理[中级局]

SFC(单文件组件)由 3 个不同的实体组成:模板、脚本和样式。三者都很重要,但后者往往被忽视,即使它可能变得复杂,且经常导致挫折和 bug。 更好的理解可以改善代码审查并减少调试时间。 这里有 7 个奇技淫巧…...

cesium加载.tif格式文件

最近项目中有需要直接加载三方给的后缀名tif格式的文件 <script src"https://cdn.jsdelivr.net/npm/geotiff"></script> 或者 yarn add geotiff npm install geotiff 新建tifs.js import GeoTIFF, { fromBlob, fromUrl, fromArrayBuffer } from geotif…...

分布式全闪占比剧增 152%,2023 年企业存储市场报告发布

近日&#xff0c;IDC 发布了 2023 年度的中国存储市场报告。根据该报告&#xff0c;在 2023 年软件定义存储的市场占比进一步扩大&#xff0c;分布式全闪的增长尤其亮眼&#xff0c;其市场份额从 2022 年的 7% 剧增到 2023 年的 17.7%&#xff0c;增长了 152%。 01 中国企业存…...

LeetCode 707. 设计链表(单链表、(非循环)双链表 模板)

你可以选择使用单链表或者双链表&#xff0c;设计并实现自己的链表。 单链表中的节点应该具备两个属性&#xff1a;val 和 next 。val 是当前节点的值&#xff0c;next 是指向下一个节点的指针/引用。 如果是双向链表&#xff0c;则还需要属性 prev 以指示链表中的上一个节点…...

深入了解Flutter中Overlay的介绍以及使用

Flutter Overlay 介绍 在 Flutter 中&#xff0c;Overlay 是一种特殊的 Widget&#xff0c;它可以用来在应用程序的其他部分之上显示内容。Overlay 非常适合用于显示模态对话框、弹出菜单、工具提示等。 Overlay 的工作原理 Overlay 位于 Flutter 的渲染树之外&#xff0c;这…...

文本直接生成2分钟视频,即将开源模型StreamingT2V

Picsart人工智能研究所、德克萨斯大学和SHI实验室的研究人员联合推出了StreamingT2V视频模型。通过文本就能直接生成2分钟、1分钟等不同时间&#xff0c;动作一致、连贯、没有卡顿的高质量视频。 虽然StreamingT2V在视频质量、多元化等还无法与Sora媲美&#xff0c;但在高速运…...

时序预测 | Matlab实现SOM-BP自组织映射结合BP神经网络时间序列预测

时序预测 | Matlab实现SOM-BP自组织映射结合BP神经网络时间序列预测 目录 时序预测 | Matlab实现SOM-BP自组织映射结合BP神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现SOM-BP自组织映射结合BP神经网络时间序列预测&#xff08;完整源码…...

FPGA高端图像处理开发板-->鲲叔4EV:12G-SDI、4K HDMI2.0、MIPI等接口谁敢与我争锋?

目录 前言鲲叔4EV----高端FPGA图像处理开发板核心板描述底板描述配套例程源码描述配套服务描述开发板测试视频演示开发板获取 前言 在CSDN写博客传播FPGA开发经验已经一年多了&#xff0c;帮助了不少人&#xff0c;也得罪了不少人&#xff0c;有的人用我的代码赢得了某些比赛、…...

linux练习-交互式传参

在shell脚本中&#xff0c;read 向用户显示一行文本并接受用户输入 #!/bin/bash read -p 依次输入你的姓名、年龄、家乡 name age home echo 我是$name,年龄$age,我来自$home...

【数据结构(一)】初识数据结构

❣博主主页: 33的博客❣ ▶文章专栏分类: Java从入门到精通◀ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你学更多数据结构知识 目录 1.前言2.集合架构3.时间和空间复杂度3.1算法效率3.2时间复杂度3.2.1大O的渐进…...

前端三剑客 —— CSS (第六节)

目录 内容回顾&#xff1a; 弹性布局属性介绍 案例演示 商品案例 布局分析 登录案例 网格布局 内容回顾&#xff1a; 变量&#xff1a;定义变量使用 --名称&#xff1a;值&#xff1b; 使用变量&#xff1a; 属性名&#xff1a;var&#xff08;--名称&#xff09;&a…...

MyBatis 解决上篇的参数绑定问题以及XML方式交互

前言 上文:MyBatis 初识简单操作-CSDN博客 上篇文章我们谈到的Spring中如何使用注解对Mysql进行交互 但是我们发现我们返回出来的数据明显有问题 我们发现后面三个字段的信息明显没有展示出来 下面我们来谈谈解决方案 解决方案 这里的原因本质上是因为mysql中和对象中的字段属性…...

Rust语言之属性宏(Attribute Macro)derive

文章目录 Rust语言之属性宏&#xff08;Attribute Macro&#xff09;derive Rust语言之属性宏&#xff08;Attribute Macro&#xff09;derive 属性宏是一种基于属性的宏&#xff0c;用于修改、扩展或注解 Rust 代码。它们通常用于为函数、结构体、枚举、模块等添加元数据或自…...

[技术闲聊]我对电路设计的理解(六)-原理图封装

电路设计的直观体现就是完整的原理图&#xff0c;绘制电路图阶段的第一步&#xff0c;绘制原理图封装库。 封装库一共有两种&#xff0c;一种是原理图封装库&#xff0c;一种是PCB封装库&#xff0c;如下图所示。 原理图封装和PCB封装之间的唯一关联就是 引脚位号&#xff0c;…...

算法(滑动窗口四)

1.串联所有单词的子串 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如&#xff0c;如果 words ["ab","cd","ef"]&#xff…...

学习记录:bazel和cmake运行终端指令

Bazel和CMake都是用于构建软件项目的工具&#xff0c;但它们之间有一些重要的区别和特点&#xff1a; Bazel&#xff1a; Bazel是由Google开发的构建和测试工具&#xff0c;用于构建大规模的软件项目。它采用一种称为“基于规则”的构建系统&#xff0c;它利用构建规则和依赖关…...

蓝桥杯刷题--python-37-分解质因数

3491. 完全平方数 - AcWing题库 nint(input()) res1 i2 while i*i<n: if n%i0: t0 while n%i0: n//i t1 if t%2: res*i i1 if n>1: res*n print(res) 4658. 质因数个数 - AcWing题库…...

Delphi编写的图片查看器

UNIT Unit17;INTERFACEUSESWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,Vcl.StdCtrls, Vcl.ExtDlgs, Vcl.ExtCtrls, Vcl.Imaging.jpeg; //注意&#xff1a;要加入jpej 否侧浏览图…...

Swing中的FlowLayout/WrapLayout在打横排列时候如何做到置顶对齐

前言 最近在开发swing客户端时候碰到一个棘手的问题&#xff1a; Swing中的FlowLayout/WrapLayout在打横排列时候如何做到置顶对齐如果是vue或者react&#xff0c;一搜百度什么都出来了&#xff0c;swing的话&#xff0c;嗯。。。资料有点少而且大部分是stack overflow上面的…...

C# MES通信从入门到精通(8)——C#调用Webservice服务进行数据交互

前言 在上位机开发领域,使用webservice来访问客户的终端Mes系统是一项必备的技能,本文详细介绍了如何在c#中调用webservice服务,不仅介绍了使用添加服务引用直接调用webservice中的方法外还介绍了使用http的post方法调用webservice方法,过程详细且均为实战经验总结,对于初…...

day04-MQ

1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&#xff0c;但是你…...

神经网络汇聚层

文章目录 最大汇聚层平均汇聚层自适应平均池化层 最大汇聚层 汇聚窗口从输入张量的左上角开始&#xff0c;从左往右、从上往下的在输入张量内滑动。在汇聚窗口到达的每个位置&#xff0c;它计算该窗口中输入子张量的最大值或平均值。计算最大值或平均值是取决于使用了最大汇聚…...

简单的企业网站cms/洛阳网站建设优化

修改了my.cnf&#xff0c;需要重启MySQL服务由于是从源码包安装的Mysql&#xff0c;所以系统中是没有红帽常用的servcie mysqld restart这个脚本只好手工重启有人建议Killall mysql。这种野蛮的方法其实是不行的&#xff0c;强制终止的话&#xff0c;如果造成表损坏&#xff0c…...

如何给网站做外部优化/今天发生的重大新闻事件

为什么80%的码农都做不了架构师&#xff1f;>>> 今天老赵在园子里发了一篇文章"警惕匿名方法造成的变量共享"&#xff0c;立即引起了大家的广泛关注(老赵就是园子的"人气天王"&#xff0c;呵呵)&#xff0c;而且这个问题园子里也有其它几篇文章…...

营销型网站的优缺点/域名注册购买

这是一款效果非常炫酷的纯CSS3圆形图片鼠标滑过旋转翻盖特效。该CSS3特效中&#xff0c;当鼠标滑过圆形图片时&#xff0c;图片以顶边的一个定位点为中心向下旋转&#xff0c;显示出下面的圆形说明文本。使用方法HTML结构该特效使用bootstrap网格系统来布局&#xff0c;基本的H…...

网站做调查问卷给钱的兼职/东莞做网站seo

我们有一个财务系统比较看重财务数据的安全性&#xff0c;同时我们拥有两套系统&#xff0c;一个生产环境(Linux)&#xff0c;一个应急备份环境(Windows)。备份环我们有一个财务系统比较看重财务数据的安全性&#xff0c;同时我们拥有两套系统&#xff0c;一个生产环境(Linux)&…...

鸡西市网站建设/源云推广

目录一. 复习事物隔离级别事物隔离级别中可能涉及到的几个问题版本链二. MVCC什么是当前读,快照读什么是ReadView不同隔离解绑下 ReadView 的生成规则MVCC下可见性判断流程1. 读取已提交隔离级别下执行示例2. 可重复读隔离级别下执行示例如何解决幻读为什么可重复读隔离级别下是…...

网站建设税费/sem推广代运营

索引类型 phoenix的索引大致分为两类global index和local index&#xff0c;好像和星环有点类似&#xff0c;其实这是hbase二级索引解决方案里面广为人知的两种方案&#xff0c;侧重点不同&#xff0c;使用场景也不一样。 global index&#xff0c;global是默认的索引格式。官…...