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

第三章 数据链路层 | 计算机网络(谢希仁 第八版)

文章目录

  • 第三章 数据链路层
    • 3.1 使用点对点信道的数据链路层
      • 3.1.1 数据链路和帧
      • 3.1.2 三个基本问题
    • 3.2 点对点协议PPP
      • 3.2.1 PPP协议的特点
      • 3.2.2 PPP协议的帧格式
      • 3.2.3 PPP协议的工作状态
    • 3.3 使用广播信道的数据链路层
      • 3.3.1 局域网的数据链路层
      • 3.3.2 CSMA/CD协议
      • 3.3.3 使用集线器的星形拓扑
      • 3.3.4 以太网的信道利用率
      • 3.3.5 以太网的MAC层
    • 3.4 扩展的以太网
      • 3.4.1 在物理层扩展以太网
      • 3.4.2 在数据链路层扩展以太网
      • 3.4.3 虚拟局域网
    • 3.5 高速以太网
      • 3.5.1 100BASE-T 以太网
      • 3.5.2 吉比特以太网
      • 3.5.3 10吉比特以太网和更快的以太网
      • 3.5.4 使用以太网进行宽带接入


第三章 数据链路层

  • 数据链路层的点对点信道和广播信道的特点。PPP 协议和 CSMA/CD 协议的特点。
  • 数据链路层的三个基本问题:封装成帧、透明传输、差错检测。
  • 以太网 MAC 层的硬件地址。
  • 适配器、转发器、集线器、网桥、以太网交换机的作用和使用场合。

在这里插入图片描述


路由器转发分组时只涉及到下面三层。


3.1 使用点对点信道的数据链路层


3.1.1 数据链路和帧

数据链路既包含物理线路也包含必要的通信协议,将实现协议的软件和硬件加到链路上就构成了数据链路。
常用网络适配器(既包括硬件也包括软件)来实现这些协议,一般适配器包括了数据链路层和物理层两层的功能。
帧是点对点信道的数据链路层的协议数据单元。网络层的协议数据单元是IP数据报,又称分组。
数据链路层将网络层交下来的数据构成帧发送到链路上,以及把接收到的帧里的数据取出并上交给网络层。


在这里插入图片描述


点对点信道的数据链路层在通信时的主要步骤:

  1. 结点A的数据链路层把网络层交下来的IP数据报加上首部和尾部封装成帧。
  2. 结点A把封装好的帧发送给结点B。
  3. 结点B对接收到的帧进行差错检验,若无差错,从帧中提取出IP数据报上交给网络层,若有差错丢弃这个帧。

3.1.2 三个基本问题

数据链路层的三个基本问题:封装成帧、透明传输、差错检验

封装成帧
给 IP 数据报加上首部和尾部就构成了数据链路层的帧,IP 数据报成为帧的数据部分。
链路层协议规定了帧中数据部分的长度上限——最大传送单元(MTU)。
首部和尾部包括帧定界符(即确定帧的界限)和其他控制信息。
帧定界符包括开始符(SOH)和结束符(EOT),分别是一串8为二进制数字。
帧定界符的作用:确定帧的界限。当出现差错时可以根据帧定界符识别是否是一个完整的帧。

透明传输
透明传输是因为控制字符产生的。
透明传输即表示无论传送什么样的数据,都能按照原样无差错地通过数据链路层。

字节填充:因为存在帧定界符,如果传输的数据中出现了和SOH、EOT等控制字符一样的文本,就在文本前面插入一个转义字符(ESC),接受端收到数据后在发送给网络层之前删除这个插入的转义字符。如果转义字符也出现在数据中,就在它前面再插入一个转义字符。


在这里插入图片描述


差错检测

  • 比特差错:传输时产生差错,0变成了1或1变成了0.
  • 误码率BER:一段时间内,传输错误的比特占所传输比特总数的比率。提升信噪比可以减小误码率。
  • 差错检验的方法:循环冗余检验CRC

循环冗余检验的原理:
在要传输的数据后加上n位的冗余码(成为帧检验序列FCS),如何得出冗余码:
让数据乘以2^n(相当于在后面加了n个0),然后除以一个事先约定的 n+1 位的除数P,得出 n 位的余数 R 就作为冗余码加到数据后面。接收端将收到的每一个帧除以同样的除数 P,若余数为 0 就表明没有差错,否则就是有差错,丢弃这个帧。

循环冗余检验使用硬件完成,速度很快。

循环冗余检验只能识别比特差错,无法识别帧丢失、帧重复、帧失序,因此不是可靠传输。

  • 对于通信质量较差的无线传输链路,数据链路层协议使用帧编号、确认和重传机制。即接收方收到正确的帧就向发送方发送确认,如果发送方没有收到确认就表明出现差错,就进行重传直到收到对方的确认。

  • 对于通信质量较好的有线传输链路,只进行CRC检验,不使用确认和重传机制。即不需要数据链路层向上提供可靠传输,而是由上层协议来改正差错。

本章的 PPP 协议和 CSMA/CD 协议都不是可靠传输的协议。


3.2 点对点协议PPP

点对点协议 PPP 是目前点对点链路中应用最广泛的数据链路层协议。


3.2.1 PPP协议的特点

PPP 协议是用户和 ISP 通信时使用的数据链路层协议。

PPP 协议应满足的需求

  1. 简单。这是首要的需求。互联网体系结构中最复杂的部分在 TCP 协议中,网际协议 IP 和数据链路层协议都不是可靠传输。
  2. 封装成帧。PPP 协议规定使用特殊的字符作为帧定界符。
  3. 透明传输。
  4. 支持多种网络层协议。PPP 协议要能够在同一条物理链路上同时支持多种网络层协议。
  5. 支持多种类型链路。包括串行的或并行的、同步的或异步的等。例如 PPPoE(在以太网上运行的PPP),用户通过以太网上网时使用的是PPPoE协议,它将 PPP 帧再封装到一个以太网帧中。
  6. 差错检测。如果收到有错的帧就丢弃。
  7. 最大传送单元。要为每一种类型的点对点链路设置最大传送单元MTU。注意 MTU 是数据部分的最大长度。
  8. 网络层地址协商。PPP 协议要提供一种机制使通信的两个网络层的实体能通过协商知道彼此的网络层地址。
  9. 数据压缩协商。PPP 协议要提供一种方法来协商使用数据压缩算法。

TCP/IP 协议族中,可靠传输由 TCP 协议负责。PPP 不负责纠错等。PPP 只支持点对点的链路通信,且只支持全双工链路。

PPP 协议的组成

PPP 协议有三个组成部分:

  1. 一个将 IP 数据报封装到串行链路的方法。
  2. 一个用来建立、配置和测试数据链路连接的链路控制协议LCP。
  3. 一套网络控制协议 NCP,其中的每一个协议支持不同的网络层协议。

3.2.2 PPP协议的帧格式

各字段的含义
PPP 的首部和尾部分别为4个字段和2个字段。

首部的第一个字段和尾部的第二个字段都是标志字段 F,规定为 0x7E,它标志着一个帧的开始或结束。两个连续的帧之间只需要一个 F,如果连续出现两个标志字段,表示这是一个空帧,应该丢弃。

首部的第二个和第三个字段 目前都没有实际含义。第四个字段是 2 字节的协议字段,它表明了信息部分的数据类型(可能是IP数据报也可能是其他类型的数据)。尾部的第一个字段是帧检验序列 FCS。


在这里插入图片描述


字节填充
PPP 使用异步传输时使用了字节填充,转义符为 0x7D。

零比特填充
PPP 协议用在 SONET/SDH 链路上时使用同步传输,此时采用零比特填充方法来实现透明传输。

零比特填充的方法:当信息字段中出现 5 个连续的 1,立即填入一个 0,这样信息字段中就不会出现 6 个连续的 1(PPP 的帧定界符中有 6 个连续的 1)。


3.2.3 PPP协议的工作状态

PPP 链路从建立到释放的全过程
用户拨号接入 ISP 后,就建立了从用户到 ISP 的物理连接。
这时用户向 ISP 发送一系列的链路控制协议 LCP 分组,以便建立 LCP 连接。
然后网络控制协议 NCP 给新接入的用户电脑分配一个临时的 IP 地址。
等用户通信完毕后,NCP 释放网络层连接,收回分配的 IP 地址,然后 LCP 释放数据链路层连接,最后释放物理层连接。

PPP 链路的状态变化:链路静止——链路建立——鉴别——网络层协议——链路打开——链路终止——链路静止。

  • 链路静止:PPP 链路的其实和终止状态都是链路静止状态。
  • 链路建立:当个人电脑当建立了到路由器的物理层连接后,PPP 进入链路建立状态,目的是建立链路层的 LCP 连接。
    通过发送 LCP 的配置请求帧(是一个 PPP 帧,协议字段为 LCP 对应的代码,信息字段包括特定的配置请求)来协商配置选项,链路的另一端可以回复配置确认帧、配置否认帧或配置拒绝帧。
  • 鉴别:若鉴别身份失败就转到链路终止状态,若成功就进入网络层协议状态
  • 网络层协议:这时 PPP 链路的两端的网络控制协议 NCP 根据网络层的不同协议互相交换网络层特定的网络控制分组。PPP 链路的两端可以运行不同的网络层协议。
  • 链路打开:此时链路的两个 PPP 端点可以彼此发送分组。
    数据传输结束后链路的一端发送终止请求 LCP 帧请求终止链路连接,收到终止确认后转到链路终止状态。
  • 链路终止:终止后进入链路静止状态。
  • 链路静止

在这里插入图片描述


可以看到,PPP 协议不是纯粹的数据链路层协议,还包含了物理层和网络层的内容。


3.3 使用广播信道的数据链路层

广播信道可以进行一对多的通信,局域网用的就是广播信道。

局域网可以按照拓扑结构进行分类。


在这里插入图片描述



3.3.1 局域网的数据链路层

局域网的最主要特点:
网络为一个单位所拥有,且地理范围和站点数目都有限。

局域网的优点:

  1. 具有广播功能,可以从一个站点很方便地访问全网。局域网上的主机可以共享连接在局域网上的各种硬件和软件资源。
  2. 便于系统的扩张和逐渐演变
  3. 提高了系统的可靠性、可用性和生存性。

以太网是局域网的一种,绝大多数局域网都是以太网双绞线是局域网中的主流传输媒体。

实现共享信道有两种方法:

  1. 静态划分信道,如频分复用、时分复用、码分复用等,但不适合局域网。
  2. 动态媒体接入控制,又称多点接入。
    特点是信道并非在用户通信时固定分配给用户:
a. 随机接入:特点是用户可以随机地发送消息。如果有两个用户同时发送,在共享媒体上就会产生碰撞,是发送失败。这时就需要解决碰撞的网络协议,即 CSMA/CD 协议。
b. 受控接入:特点是用户不能随机发送信息而必须服从一定的控制。

以太网应用的主要是随机接入。
由于历史原因以太网层被拆分为两个子层:逻辑链路控制 LLC媒体接入控制 MAC。现在 LLC 基本已经消失了,主要是 MAC 协议。

适配器的作用
计算机与外界局域网的连接是通过适配器进行的,适配器以前又称网卡。
适配器和局域网之间的通信通过电缆或双绞线以串行传输方式进行的,而适配器与计算机之间的通信是通过 I/O 总线并行传输的,因此适配器的一个重要功能就是进行数据串行传输和并行传输的转换。

适配器实现的功能包含了数据链路层和物理层两个层次的功能。

适配器收到正确的帧后,使用中断来通知计算机,并把数据交付给协议栈中的网络层。当计算机要发送 IP 数据报时,就由协议栈把分组交给适配器,适配器将其组装成帧后发送到局域网(封装成帧、透明传输、差错检错等功能都是由适配器完成的)。

计算机的硬件地址存储在适配器中,而软件地址——IP地址存储在计算机中。


在这里插入图片描述



3.3.2 CSMA/CD协议

局域网上的计算机常被称为工作站、站点等。

为了通信的简便,以太网采取了以下两种措施:

  1. 采用较为灵活的无连接的工作方式,即不必建立连接就可以直接发送数据。
    适配器对发送的数据帧不编号,也不要求对方发回确认。它提供的是尽最大努力的交付,是不可靠的交付。对有差错帧是否进行重传由高层来决定。
    同一时间只能有一台计算机发送数据,如果发生冲突,就使用 CSMA/CD 协议来协调。
  2. 以太网发送的数据使用的是曼彻斯特编码。

CSMA/CD 协议的要点

  • 多点接入:多点接入说明是总线型网络,许多计算机以多点接入的方式连接在一根总线上。协议的实质就是载波监听和碰撞检测。
  • 载波监听:使用电子技术检测信道上有没有其他计算机也在发送。不管是发送前还是发送中,每个站都要不停地检测信道。
  • 碰撞检测:边发送边监听。如果几个站同时发送数据,总线上的信号电压变化会增大,就表明发生了碰撞。这时就立即停止发送。

在使用 CSMA/CD 协议时,不能同时发送和接收,因此使用 CSMA/CD 协议的以太网只能进行半双工通信(双向交替通信)。

发生碰撞是因为传播时延,A 发送了数据但是还没传到 B 处,B 就不知道有人发送了数据。
当 A 和 B 同时发送数据产生碰撞后,他们发送数据都失败,都要推迟一段时间重新发送。
因为不知道是否会发生碰撞,所以以太网存在发送的不确定性。
A 发送数据后最多 2θ 时间就知道是否碰撞,这 2θ 时间称为争用期。如果经过争用期还没碰撞,表明发送成功。
如果发生碰撞,以太网使用截断二指数退避算法来确定碰撞后重传的时机。
以太网规定了争用期的时长,这就约束了以太网的地理范围不能太大,不然传播时延会超过争用期限制。
以太网规定最短帧长为 64 字节(一个争用期可以发送的字节数),如果争用期发生碰撞就会停止发送,因此信道上长度小于 64 字节的帧就是无效帧。
碰撞后除了立即停止发送数据外还要继续发送一个人为干扰信号,通知所有用户现在发生了碰撞。

以太网还规定了帧间最小间隔 96 比特时间,这是为了使刚收到数据帧的栈清理缓存,准备接收下一帧。


在这里插入图片描述


CSMA/CD 协议的要点归纳

  1. 准备发送:适配器从网络层获得一个分组,加上首部和尾部组成以太网帧,放入适配器缓存中。在发送前先检测信道。
  2. 检测信道:若检测到信道忙,则不停地检测直到信道空闲。若检测到空闲,并在 96 比特时间内保持空闲(保证了帧间最小间隔),就发送这个帧。
  3. 在发送过程中仍不停地检测,即适配器要边发送边监听。此时有两种情况:
  • 发送成功:争用期内一直未检测到碰撞。发送成功后回到 1。
  • 发送失败:争用期内检测到碰撞,立即停止发送,并按规定发送人为干扰信号。适配器接着执行指数退避算法,等待足够时间后回到 2。若重传 16 次仍不成功,就停止重传并向上报错。

以太网发送完一帧后要把已发送的帧保留一下。如果争用期检测到碰撞,推迟一段时间后还要重传。


3.3.3 使用集线器的星形拓扑

现在的以太网采用星形拓扑,在星形中心使用可靠性非常高的集线器。每个站用两对双绞线,分别用于发送和接收。
集线器的特点:

  • 表面上使用集线器的局域网在物理上是一个星形网,但是在逻辑上仍是一个总线网,各站共享逻辑上的总线,还是使用 CSMA/CD 协议。
  • 一个集线器有很多接口,像是一个多接口的转发器。
  • 集线器工作在物理层,每个接口仅负责转发比特,不进行碰撞检测。

在这里插入图片描述



3.3.4 以太网的信道利用率

因为发生碰撞会浪费信道资源,所以以太网的信道利用率达不到100%。

减少端到端的传播时延、可以提高信道利用率,因此以太网的连线的长度不能太长,同时以太网的帧长不能太短。


3.3.5 以太网的MAC层

MAC 层的硬件地址
局域网中,硬件地址又叫 MAC 地址。

IEEE 为局域网规定了一种 6 字节的全球地址,是局域网上的每一台计算机中固化在适配器中的地址。因此如果更换了新的适配器,硬件地址也就变了。

适配器上的标识符 EUI-48 就是计算机的硬件地址。

路由器通过适配器连接到局域网时,适配器上的硬件地址标志路由器的一个接口。
如果路由器同时连到多个网络上,就需要多个适配器有多个硬件地址。

局域网中适配器收到的帧有三种:

  • 单播帧(一对一):即收到的帧的 MAC 地址与本站的地址相同。
  • 广播帧(一对全体)。
  • 多播帧(一对多)。

适配器至少能够识别前两种帧。

以太网适配器有一种特殊的工作方式:混杂方式。混杂方式的适配器只要”听到“有帧再传输就悄悄接收下来。
混杂方式可以用来监视和分析以太网上的流量,黑客也常用混杂方式非法获取信息。

MAC 层的帧格式:

  • 最常用的 MAC 帧格式是”以太网V2标准“,此外还有 IEEE 的 802.3 标准。
  • MAC 帧的首部共有源地址字段、目的地址字段、用来标识上层使用什么协议的类型字段这3个字段,尾部有一个帧检验序列FCS。
  • MAC 帧没有帧定界符也没有帧长度字段。
    因为它用的是曼彻斯特码,曼彻斯特码的码元中间有一个电压跳变。当发送方发完一个帧后就不发送码元了,这是接收方发现没有跳变了就知道帧结束了。
  • MAC 帧在向下传送到物理层时要在帧前面插入 8 字节,包括一个前同步码和一个帧开始定界符。前同步码用来通知接收端调整时钟频率以与发送端的时钟同步。
  • MAC 帧的最小长度是 64 字节,其中数据字段最小长度是 46 字节。如果不够就要进行填充。IP数据报的首部有一个”总长度“字段,网络层根据它来识别填充字段的长度并丢弃掉。

3.4 扩展的以太网

有时会对以太网的范围进行扩展。
这种扩展的以太网在网络层看来仍然是一个网络。


3.4.1 在物理层扩展以太网

由于 CSMA/CD 协议的限制,以太网的主机之间距离不能太远。

可以使用光纤来扩展主机和集线器之间的距离,因为光纤的时延小带宽宽,所以可以很轻松地将主机和集线器的距离扩展到几千米。

可以将多个以太网通过主干集线器连接起来形成一个更大的以太网。


在这里插入图片描述


多个以太网通过连接进行扩展后的优点是可以实现不同以太网间的通信,且扩大了地理范围。
缺点是碰撞域会增大,发送数据产生碰撞的概率增加。


3.4.2 在数据链路层扩展以太网

扩展以太网更多的是在数据链路层扩展。
以太网通过以太网交换机(又称第二层交换机)来在数据链路层进行扩展。

以太网交换机的特点:

  • 以太网交换机实际上是一个多接口的网桥,每个接口直接与一台主机或另一个交换机相连,一般工作在全双工方式。
  • 以太网交换机具有并行性,可以同时连接多对接口,使多对主机同时通信。相互通信的主机都独占传输媒体,无碰撞地传输数据。
    – 以太网交换机是一种即插即用设备,它内部的帧交换表(又称地址表)是通过自学习算法自动地逐渐建立起来的。

以太网交换机的最大优点:

交换机的最大优点:并行性。
多对主机同时通信并不会平分总带宽,因为每对主机独占其传输媒体的带宽,所以每对主机的带宽还是原带宽。

传统的10Mbit/s 的共享式以太网,如果有 10 个用户,则每个用户的平均带宽为 1Mbit/s,而用以太网交换机来连接这些主机,10 个用户的带宽都是 10Mbit/s,相当于总带宽 100Mbit/s。

以太网交换机的自学习功能

实现自学习的两个关键点:

  • 若有主机发送数据,就把该主机的MAC地址与对应接口存入交换表。
  • 若交换表中找不到数据接收方的对应接口,就对所有接口进行广播。

在这里插入图片描述


因对接口连接的主机可能会改变,主机的网络适配器也可能改变,所以交换表中的每个项目都有有效时间,时间过了就会删除。

从总线以太网到星形以太网
总线以太网使用 CSMA/CD 协议,以半双工方式工作。
而以太网交换机不使用共享总线,没有碰撞问题,因此不使用 CSMA/CD 协议,而是以全双工方式工作。


3.4.3 虚拟局域网

使用以太网交换机可以方便地实现虚拟局域网 VLAN。

虚拟局域网 VLAN:它是由一些局域网网段构成的与物理位置无关的逻辑组,这些网段具有某些共同的需求。每一个 VLAN 的帧都有一个明确的标识符,指明发送这个帧的计算机属于哪一个 VLAN。

虚拟局域网是局域网给用户提供的一种服务,不是一种新型局域网。

下图中每一个 VLAN 的计算机可以处于不同的局域网中。


在这里插入图片描述



3.5 高速以太网

现在的以太网的速率已经从传统的 10Mbits/s 发展到了 1Gbit/s 的吉比特以太网。


3.5.1 100BASE-T 以太网

100BASE-T 是在双绞线上传送 100Mbit/s 基带信号的星形拓扑以太网,仍使用 CSMA/CD 协议,又称快速以太网。
100BASE-T 可以使用以太网交换机,当使用以太网交换机时工作在全双工状态,且不使用 CSMA/CD 协议。
快速以太网使用的 MAC 帧格式仍然是 IEEE802.3 标准规定的帧格式。


3.5.2 吉比特以太网

吉比特以太网有以下几个特点:

  • 允许在 1Gbit/s 下以全双工和半双工两种方式工作。
  • 使用 IEEE 802.3 协议规定的帧格式。
  • 在半双工方式下使用 CSMA/CD 协议,在全双工方式不使用。
  • 与 10BASE-T 和 100BASE-T 向后兼容。

吉比特以太网在半双工时,采用了“载波延伸”方法,延长争用期与发送的 MAC 帧最小长度到 512 字节。这在发送短帧时需要进行大量填充造成了额外开销。

还增加了“分组突发”的功能,当很多短帧要发送时,第一个短帧采用载波延伸的方法进行填充,后面的则一个接一个地发送而不需填充。


3.5.3 10吉比特以太网和更快的以太网

10GE 的帧格式与 10Mbit/s, 100Mbit/s 和 1Gbit/s 的帧格式完全相同,最小帧长和最大帧长也相同。
10GE 只工作在全双工方式,不使用 CSMA/CD 协议,这使它的传输距离极大地提高。
以太网技术发展很快,10GE 后面又制定了 40GE 和 100GE 的标准,他们都只工作在全双工方式。传输距离可达几十千米。

现在以太网的工作范围已经扩大到城域网和广域网,它的优点是:

  • 技术成熟。
  • 互操作性好。
  • 价格便宜。广域网中使用以太网时价格比同步光纤网SONET便宜很多。
  • 端到端的以太网连接使帧的格式全都是以太网的格式,不需要进行帧格式转换。

以太网的发展证明了以太网的优点:

  • 可扩展(从 10Mbit/s 到 10 Gbit/s)。
  • 灵活(多种媒体、全/半双工,共享/交换)。
  • 易于安装。
  • 稳健性好。

3.5.4 使用以太网进行宽带接入

现在也使用以太网进行宽带接入互联网。

以太网接入可以提供双向的宽带通信,且可以根据需要灵活地升级(如从 10M 到 10G)。

但是以太网的帧格式中没有用户名字段和让用户键入密码来鉴别用户身份的过程。
于是诞生了 PPPoE(在以太网上运行PPP),它把 PPP 协议中的 PPP 帧封装到以太网中来传输。

现在的光纤宽带接入 FTTx 都是用 PPPoE。

相关文章:

第三章 数据链路层 | 计算机网络(谢希仁 第八版)

文章目录 第三章 数据链路层3.1 使用点对点信道的数据链路层3.1.1 数据链路和帧3.1.2 三个基本问题 3.2 点对点协议PPP3.2.1 PPP协议的特点3.2.2 PPP协议的帧格式3.2.3 PPP协议的工作状态 3.3 使用广播信道的数据链路层3.3.1 局域网的数据链路层3.3.2 CSMA/CD协议3.3.3 使用集线…...

李沐机器学习环境配置相关

李沐机器学习环境配置相关 condapython环境安装指令安装miniconda安装cpu版本torch安装jupyter测试GPU是否可以使用 conda 退出 conda 环境 conda deactivate进入都d2l环境 conda activate d2l启动jupyter notebook: jupyter notebookpython 列出所有安装的包 pip lsit环…...

零基础Linux_16(基础IO_文件)笔试选择题:文件描述符+ionde和动静态库

目录 一. 文件描述符等 1. Linux下两个进程可以同时打开同一个文件,这时如下描述错误的是: 2. 以下关于标准输入输出错误的描述正确的是 3. 以下描述正确的是 4. 以下描述正确的是 [多选] 5. 在bash中,在一条命令后加入”1>&2”…...

基于OpenCV的灰度图的图片相似度计算

from skimage.metrics import structural_similarity as ssim import matplotlib.pyplot as plt import cv2 def picture_recognization(imagname):# 读取两张图片image1 cv2.imread(D:/AutoTest/PythonProject/standard_img/ imagname)image2 cv2.imread(D:/AutoTest/Pytho…...

【python海洋专题二十】subplots_adjust布局调整

上期读取soda,并subplot 但是存在一些不完美,本期修饰 本期内容 subplots_adjust布局调整 1:未调整布局的 2:调整布局 往期推荐 【python海洋专题一】查看数据nc文件的属性并输出属性到txt文件 【python海洋专题二】读取水深…...

TensorFlow入门(二十四、初始化学习参数)

参数的初始化关系到网络能否训练出好的结果或者是以多快的速度收敛,对训练结果有着重要的影响。 初始化学习参数需要注意的规则 不可以将网络中的所有参数初始化为0,也不能全部初始化为同一个值。如果参数全部初始化为0或者是同一个值,会使得所有神经元的输出都是相同的,进而造…...

工厂WMS系统货架位管理:优化仓储效率

货架位管理作为WMS系统中的重要环节,对于提高工厂的仓储效率和精确库存管理至关重要。本文将从多个角度全方位介绍工厂的WMS系统货架位管理,探讨其重要性以及如何优化、应用该系统,提升工厂的仓储效率和运营水平。 1. 优化仓库空间利用&…...

[C++随想录] 继承

继承 继承的引言基类和子类的赋值转换继承中的作用域派生类中的默认成员函数继承与友元继承与静态成员多继承的结构棱形继承的结构棱形虚拟继承的结构继承与组合 继承的引言 概念 继承(inheritance)机制是面向对象程序设计使代码可以 复用的最重要的手段,它允许程序…...

ARM-day9

按键控制小灯、蜂鸣器、风扇&#xff0c;按一次启动&#xff0c;第二次关闭 key_it.c #include "key_it.h"//按键3的配置 void key3_it_config() {//RCC使能GPIOF时钟RCC->MP_AHB4ENSETR | (0x1<<5);GPIOF->MODER & (~(0x3<<16));EXTI->E…...

2386: [余姚2015] 幸运数字(luck)

目录 题目描述 输入 输出 样例输入 样例输出 提示 来源: 代码&#xff1a; 题目描述 今年圣诞节&#xff0c;小明收到了很多礼物&#xff0c;每个礼物上都有一个数字&#xff0c;表示对小明的祝福。可是小明有自己的想法&#xff0c;对小明来说&#xff0c;4或者7的倍数…...

【JUC系列-13】深入理解DelayQueue延迟队列的底层原理

JUC系列整体栏目 内容链接地址【一】深入理解JMM内存模型的底层实现原理https://zhenghuisheng.blog.csdn.net/article/details/132400429【二】深入理解CAS底层原理和基本使用https://blog.csdn.net/zhenghuishengq/article/details/132478786【三】熟练掌握Atomic原子系列基本…...

Leetcode---365周赛

题目列表 2873. 有序三元组中的最大值 I 2874. 有序三元组中的最大值 II 2875. 无限数组的最短子数组 2876. 有向图访问计数 一、有序三元组中的最大值I 看一眼该题的数据范围&#xff0c;直接三层for循环暴力枚举&#xff0c;时间复杂度O(n^3)&#xff0c;代码如下 class…...

Java使用opencv实现人脸识别、人脸比对

1. opencv概述 OpenCV是一个开源的计算机视觉库&#xff0c;它提供了一系列丰富的图像处理和计算机视觉算法&#xff0c;包括图像读取、显示、滤波、特征检测、目标跟踪等功能。 opencv官网&#xff1a;https://opencv.org/ opencv官网文档&#xff1a;https://docs.opencv.or…...

Redis HyperLogLog的使用

Redis HyperLogLog知识总结 一、简介二、使用 一、简介 Redis HyperLogLog是一种数据结构&#xff0c;用于高效地计算基数&#xff08;集合中唯一元素的数量&#xff09;。它的主要作用是用于在内存中高效地存储和计算大量数据的基数&#xff0c;而无需完全存储所有的数据。Hy…...

Apisix-Ingress服务发现详解

apisix Apache APISIX 是一个基于微服务 API 网关&#xff0c;其不仅可以处理南北向的流量&#xff0c;也可以处理东西向的流量即服务之间的流量。Apache APISIX 集成了控制面板和数据面&#xff0c;与其他 API 网关相比&#xff0c;Apache APISIX 的上游、路由、插件全是动态的…...

spring6-事务

文章目录 1、JdbcTemplate1.1、简介1.2、准备工作1.3、实现CURD①装配 JdbcTemplate②测试增删改功能③查询数据返回对象④查询数据返回list集合⑤查询返回单个的值 2、声明式事务概念2.1、事务基本概念①什么是事务②事务的特性 2.2、编程式事务2.3、声明式事务 3、基于注解的…...

JavaFx学习问题2--音频、视频播放失败情况

文章目录 一、路径注意事项&#xff1a;① 用相对路径的时候别忘了前面的斜杠② uri问题 二、播放不了的问题① 获取的媒体文件路径本身就是不对的② 必须是uri③ 特殊情况 额外收获: 一、路径注意事项&#xff1a; 完整代码如下: import javafx.application.Application; im…...

第55节—— redux-toolkit中的createReducer——了解

一、概念 当我们使用 Redux 开发应用程序时&#xff0c;一个非常重要的概念就是 reducer。一个 reducer 是一个纯函数&#xff0c;它接受先前的状态和一个动作&#xff0c;然后返回一个新状态。每个动作都会引起状态的变化&#xff0c;从而使应用程序状态管理更加清晰和可控。…...

JUC并发编程——JUC并发编程概述及Lock锁(重点)(基于狂神说的学习笔记)

基于bilibili狂神说JUC并发编程视频所做笔记 概述 什么是JUC JUC时java.util工具包中的三个包的简称 java.util.concurrent java.util.concurrent.atomic java.util.concurrent.locks 业务&#xff1a;普通的线程代码中&#xff0c;我们常使用Runnable接口 但Runnable没有返…...

深入了解 Java 中的时间信息定义、转换、比较和操作

1. 简介 在过去的传统Java日期处理中&#xff0c;经常面临着一些问题。比如&#xff0c;java.util.Date和java.util.Calendar在表示日期和时间时存在着一些奇怪的行为&#xff0c;如月份从0开始计数、对日期进行格式化的方式繁琐不直观等。这些问题给开发带来了一定的困扰。 …...

2023年中国智能矿山发展历程及趋势分析:智能矿山健康有序发展[图]

智能矿山系统对矿山生产提质增效的效果已经开始显现&#xff1a;对不合规、有风险的行动进行及时预警&#xff0c;减少安全事故发生概率&#xff0c;避免因停产整顿产生的巨额亏损&#xff1b;精细化管理整个生产流程&#xff0c;避免过往传统粗放的流程导致的浪费&#xff0c;…...

acwing算法基础之基础算法--整数离散化算法

目录 1 知识点2 模板 1 知识点 整个范围很大&#xff0c;但存在的数据点很少。比如从 − 1 0 9 -10^9 −109到 1 0 9 10^9 109&#xff0c;但总共只有 1 0 6 10^6 106个数。 可以采用离散化的思想来做&#xff0c;即将离散的大数值映射成连续的小数值&#xff08;一般是 1 , …...

基于SSM框架的安全教育平台

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…...

Kafka生产者使用案例

1.生产者发送消息的过程 首先介绍一下 Kafka 生产者发送消息的过程&#xff1a; 1)Kafka 会将发送消息包装为 ProducerRecord 对象&#xff0c; ProducerRecord 对象包含了目标主题和要发送的内容&#xff0c;同时还可以指定键和分区。在发送 ProducerRecord 对象前&#xff0c…...

EasyX图形库实现贪吃蛇游戏

⭐大家好&#xff0c;我是Dark Falme Masker,学习了动画制作及键盘交互之后&#xff0c;我们就可以开动利用图形库写一个简单的贪吃蛇小游戏&#xff0c;增加学习乐趣。 ⭐专栏&#xff1a;EasyX部分小游戏实现详细讲解 最终效果如下 首先包含头文件 #include<stdio.h> #…...

利用 Amazon CodeWhisperer 激发孩子的编程兴趣

我是一个程序员&#xff0c;也是一个父亲。工作之余我会经常和儿子聊他们小学信息技术课学习的 Scratch 和 Kitten 这两款图形化的少儿编程工具。 我儿子有一次指着书房里显示器上显示的 Visual Studio Code 问我&#xff0c;“为什么我们上课用的开发界面&#xff0c;和爸爸你…...

2023年中国分子筛稀土催化材料竞争格局及行业市场规模分析[图]

稀土催化材料能够起到提高催化剂热稳定性、催化剂活性、催化剂储氧能力&#xff0c;以及减少贵金属活性组分用量等作用&#xff0c;广泛应用于石油化工、汽车尾气净化、工业废气和人居环境净化、燃料电池等领域。 2015-2023年中国稀土催化材料规模及预测 资料来源&#xff1a;…...

vue3插件——vue-web-screen-shot——实现页面截图功能

最近在看前同事发我的vue3框架时&#xff0c;发现他们有个功能是要实现页面截图功能。 vue3插件——vue-web-screen-shot——实现页面截图功能 效果图如下&#xff1a;1.操作步骤1.1在项目中添加vvue-web-screen-shot组件1.2在项目入口文件导入组件——main.ts1.3在需要使用的页…...

简单总结Centos7安装Tomcat10.0版本

文章目录 前言JDK8安装部署Tomcat 前言 注意jdk与tomcat的兼容问题&#xff0c;其他的只要正确操作一般问题不大 Tomcat 是由 Apache 开发的一个 Servlet 容器&#xff0c;实现了对 Servlet 和 JSP 的支持&#xff0c;并提供了作为Web服务器的一些特有功能&#xff0c;如Tomca…...

ffmpeg中AVCodecContext和AVCodec的关系分析

怎么理解AVCodecContext和AVCodec的关系 AVCodecContext和AVCodec是FFmpeg库中两个相关的结构体&#xff0c;它们在音视频编解码中扮演着不同的角色。 AVCodecContext&#xff1a;是编解码器上下文结构体&#xff0c;用于存储音视频编解码器的参数和状态信息。它包含了进行音视…...

2023年中国门把手产量、销量及市场规模分析[图]

门把手行业是指专门从事门把手的设计、制造、销售和安装等相关业务的行业。门把手是门窗装饰硬件的一种&#xff0c;用于开启和关闭门窗&#xff0c;同时也具有装饰和美化门窗的作用。 门把手行业分类 资料来源&#xff1a;共研产业咨询&#xff08;共研网&#xff09; 随着消…...

HTML 核心技术点基础详细解析以及综合小案例

核心技术点 网页组成 排版标签 多媒体标签及属性 综合案例一 - 个人简介 综合案例二 - Vue 简介 02-标签语法 HTML 超文本标记语言——HyperText Markup Language。 超文本&#xff1a;链接 标记&#xff1a;标签&#xff0c;带尖括号的文本 标签结构 标签要成…...

BAT学习——批处理脚本(也称为BAT文件)常用语法元素与命令

批处理脚本&#xff08;也称为BAT文件&#xff09;使用Windows的批处理语言编写&#xff0c;它具有一些常用的语法元素和命令。以下是一些BAT编程的常用语法元素和命令&#xff1a; 命令行命令&#xff1a; 批处理脚本通常包含一系列Windows命令&#xff0c;例如echo&#xff0…...

AMD AFMF不但能用在游戏,也适用于视频

近期AMD发布了AMD Software Adrenalin Edition预览版驱动程序&#xff0c;增加了对平滑移动帧&#xff08;AMD Fluid Motion Frames&#xff0c;AFMF&#xff09;功能的支持&#xff0c;也就是AMD的“帧生成”技术&#xff0c;与DLSS 3类似&#xff0c;作为FidelityFX Super Re…...

CSS 常用样式浮动属性

一、概述 CSS 中&#xff0c;浮动属性的作用是让元素向左或向右浮动&#xff0c;使其他元素围绕它排布&#xff0c;常用的浮动属性有以下几种&#xff1a; float: left; 使元素向左浮动&#xff0c;其他元素从右侧包围它。 float: right; 使元素向右浮动&#xff0c;其他元素…...

Linux引导故障排除:从问题到解决方案的详细指南

1 BIOS初始化 通电->对硬件检测->初始化硬件时钟 2 磁盘引导及其修复 2.1 磁盘引导故障 磁盘主引导记录&#xff08;MBR&#xff09;是在0磁道1扇区位置&#xff0c;446字节。 MBR作用&#xff1a;记录grub2引导文件的位置 2.2 修复 步骤&#xff1a;1、光盘进…...

【vim 学习系列文章 6 -- vim 如何从上次退出的位置打开文件】

文章目录 1.1 vim 如何从上次退出的位置打开文件1.2 autogroup 命令学习1.2.1 augroup 基本语法 1.3 vim call 命令详细介绍 1.1 vim 如何从上次退出的位置打开文件 假设我打开了文件 test.c&#xff0c;然后我向下滚动到第 50 行&#xff0c;然后我做了一些修改并关闭了文件。…...

怎样学习C#上位机编程?

怎样学习C#上位机编程&#xff1f; 00001. 掌握C#编程和.NET框架基础。 00002. 学WinForm应用开发&#xff0c;了解控件使用和事件编程。 00003. 熟悉基本数据结构和算法&#xff0c;如链表、栈、队列。 00004. 理解串口通信协议和方法&#xff0c;用于与硬件交互。 00005…...

【算法-动态规划】两个字符串的删除操作-力扣 583

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…...

【06】基础知识:typescript中的泛型

一、泛型的定义 在软件开发中&#xff0c;我们不仅要创建一致的定义良好的API&#xff0c;同时也要考虑可重用性。 组件不仅能支持当前数据类型&#xff0c;同时也能支持未来的数据类型&#xff0c;这在创建大型系统时提供了十分灵活的功能。 在像 C# 和 Java 这样的语言中&…...

flutter 绘制原理探究

文章目录 Widget1、简介2、源码分析Element1、简介2、源码分析RenderObjectWidget 渲染过程总结思考Flutter 的核心设计思想便是“一切皆 Widget”,Widget 是 Flutter 功能的抽象描述,是视图的配置信息,同样也是数据的映射,是 Flutter 开发框架中最基本的概念。 在 Flutter…...

[Java]SPI扩展功能

一、什么是SPI Java SPI&#xff08;Service Provider Interface&#xff09;是Java官方提供的一种服务发现机制。 它允许在运行时动态地加载实现特定接口的类&#xff0c;而不需要在代码中显式地指定该类&#xff0c;从而实现解耦和灵活性。 二、实现原理 基于 Java 类加载…...

机器人命令表设计

演算命令 CLEAR 将数据 1 上被指定的编号以后的变数的内容&#xff0c;以及数据 2 上仅被指定的个数都清除至 0。 INC 在被指定的变数内容上加上 1。 DEC 在被指定的变数内容上减掉 1。 SET 在数据 1 上设定数据 2。 ADD 将数据 1 和数据 2 相加&#xff0c;得出的结果保存在数…...

STM32--WDG看门狗

文章目录 WDG简介IWDGIWDG的超时计算WWDGWWDG超时和窗口值设定独立看门狗工程WWDG工程 WDG简介 WDG看门狗&#xff08;Watchdog Timer&#xff09;是一种常见的硬件设备&#xff0c;在STM32F10系列中&#xff0c;有两种看门狗&#xff0c;分别是独立看门狗和窗口看门狗&#x…...

(※)力扣刷题-字符串-实现 strStr()(KMP算法)

28 实现 strStr() 实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串&#xff0c;在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在&#xff0c;则返回 -1。 示例 1: 输入: haystack “hello”, needle “ll” 输出: 2 示例…...

Redis 集群 Redis 事务 Redis 流水线 Redis 发布订阅 Redis Lua脚本操作

Redis 集群 & Redis 事务 & Redis 流水线 & Redis 发布订阅 Redis 集群linux安装redis主从配置查看当前实例主从信息 Redis Sentinelsentinel Redis Cluster Redis 事务Redis 流水线Redis 发布订阅Redis Lua脚本操作 Redis 集群 linux安装redis 下载安装包&#…...

【算法与数据结构】--常见数据结构--栈和队列

一、栈 栈&#xff08;Stack&#xff09; 是一种基本的数据结构&#xff0c;具有后进先出&#xff08;LIFO&#xff09;的特性&#xff0c;类似于现实生活中的一叠盘子。栈用于存储一组元素&#xff0c;但只允许在栈顶进行插入&#xff08;入栈&#xff09;和删除&#xff08;…...

Linux shell编程学习笔记11:关系运算

Linux Shell 脚本编程和其他编程语言一样&#xff0c;支持算数、关系、布尔、字符串、文件测试等多种运算。前面几节我们研究了 Linux shell编程 中的 字符串运算 和 算术运算&#xff0c;今天我们来研究 Linux shell编程中的的关系运算。 一、关系运算符功能说明 运算符说明…...

JS标准库

学习一门编程语言不仅是掌握其语法。同等重要的是学习其标准库&#xff0c;从而熟练掌握语言本身提供的所有工具。 1 定型数组 js常规数组与C和Java等较低级语言的数组类型还是有很大区别。ES6新增了定型数组&#xff0c;与这些语言的低级数组非常接近。 定型数组严格来说并…...

Android 12.0 hal层添加自定义hal模块功能实现

1. 前言 在12.0的系统rom定制化开发中,在 对hal模块进行开发时,需要通过添加自定义的hal模块来实现某些功能时,就需要添加hal模块的相关功能,接下来就来实现一个案例来供参考 接下来就来具体实现这个功能 2.hal层添加自定义hal模块功能实现的核心类 hardware\interfaces…...