生成树详解(STP、RSTP、MSTP)
目录
1、STP
1.概述
2.基本概念
3.端口角色及其作用
4.报文结构
5.STP的端口状态
6.三种定时器
7.STP选举步骤
8.配置BPDU的比较原则
9.TCN BPDU
10.临时环路的问题
11.传统STP的不足
拓扑变更处理过程
2、RSTP
1.端口角色
2.端口状态
3.P/A(Proposal/agreement)协商
4.环路的预防
5.STP和RSTP的区别
6.RSTP中MAC地址表的清空
7.RSTP保护功能
(1)UplinkFast:
(2)BackboneFast:
(3)Portfast:
(4)BPDUFilter:
(5)BPDU保护:
(6)BPDU过滤:
(7)Root保护:
(8)环路保护:
(9)TC-BPDU泛洪保护:
8.STP/RSTP缺陷
3、MSTP
1.MSTP对STP和RSTP的改进
2.MSTP与VRRP结合
1、STP
1.概述
背景:
在保证网络冗余性的情况下,消除二层环路。当网络中部署生成树协议时,交换机之间便会开始交互相关协议报文,并经过一系列计算得到一个无环的网络拓扑;当网络存在环路时,会将网络中的一个或多个接口进行阻塞(Block),从而打破二层环路。
生成树协议应用于园区网络的二层网络中,进行链路备份和消除环路。
二层环路带来的问题:
-
广播风暴:广播帧泛洪
-
MAC地址表漂移
在三层IP中有TTL解决环路问题,TTL默认值为64,每经过一个路由器减1。
核心思想:
比较BPDU,打开好的端口,阻塞差的端口,打破环路,建立无环的逻辑拓扑。
2.基本概念
-
桥ID(Bridge ID,BID)=网桥优先级(2字节)+网桥MAC(6字节):
-
缺省优先级32768(0~65535),Cisco:4096的倍数,HUAWEI:1024的倍数,越小越优先。
-
每一台交换机都有一个唯一的BID。
-
BID最小的设备会被选举为根桥(先比较优先级再比较MAC地址)。
-
-
端口ID(Port ID,PID)=端口优先级+端口ID:
-
优先级范围0~240,16的倍数,缺省情况下为128。
-
用来标识每个接口,选举指定接口(DR)。
-
-
开销(Cost):
-
接口的Cost用于计算到达根的开销。
-
接口的缺省Cost除了与其速率、工作模式,还与交换机使用的STP Cost计算方法有关。
-
接口带宽越大,Cost值越小
-
华为使用IEEE 802.1t标准,思科使用IEEE 802.1d-1998标准。
-
-
根路径开销(Root Path Cost,RPC):
-
一台设备的某个接口到根桥的RPC等于从根桥到该设备沿途所有入方向接口的Cost值累加。
-
3.端口角色及其作用
-
根桥(ROOT):
-
每隔Hello Time(2s)周期性发送配置BPDU,用于设备检查链路是否出现故障
-
根桥收到TCN后,在半分钟内按照每隔2秒周期性地发送TC报文(Forward Delay+Max Age)
-
-
根端口(RP):
-
收到根桥发来的配置BPDU报文
-
当拓扑发生变化时,向根桥发送TCN
-
-
指定端口(DP):
-
向下游发送配置BPDU,每经过一台交换机,配置BPDU将会发生变化(BID、PID)(再生式的泛洪)
-
接受来自下游桥的拓扑变化信息
-
-
非指定端口:
-
接受对端配置BPDU信息
-
不转发用户流量
-
4.报文结构
1、STP使用的MAC地址
-
Source MAC:给二层协议使用的MAC地址
-
Destination MAC:以01-80-C2开头的二层组播MAC(专门为二层协议提供的组播MAC)
-
根据三层的组播IP产生的组播MAC地址:以01-00-5E开头
2、BPDU(Bridge protocol data unit)网桥协议数据单元:
分类:
-
配置BPDU(0x00):
-
端口使用STP,则配置BPDU就会按照HelloTime定时器规定的时间间隔从指定端口发出
-
根端口收到配置BPDU时,如果优先级比自己的配置BPDU高,就会根据收到的配置BPDU中携带的信息更新自己的BPDU,并从指定接口向下游发送,否则丢弃该配置BPDU
-
指定端口收到比自己差的配置BPDU时,会立刻向下游设备发送自己的BPDU
-
-
TCN BPDU(0x80):当交换机的某个端口出现故障,会通过根端口向根桥发送TCN BPDU告知根桥,根桥收到后,会将拓扑变更发送至网络中的所有交换机,所有的交换机在15秒内刷新MAC地址表
作用:维护整个生成树的生命周期
-
通过Root ID、RPC、Bridge ID、Port ID的一个或者多个参数选举出最好的BPDU来生成树
-
通过定时器来保证生成树的稳定性
-
当拓扑发生改变,通过发送拓扑变更消息(Flag位)告知拓扑的变化
5.STP的端口状态
STP 端口状态迁移机制 :
① :端口初始化或者使能,进入阻塞状态
② :端口被选为根端口或者指定端口,进入侦听状态
③ :端口的临时状态停留时间(一个Forward Delay时间)到,进入下一状态(学习状态或者转发状态),端口被选为根端口或指定端口
④ :端口不再是根端口、指定端口或者指定状态,进入阻塞状态
⑤ :端口被禁用或者链路失效
对端口状态和端口角色的思考
Q:STP使能后端口进入Blocking状态,对BPDU只收不发,如何进行全网BPDU交互的?
A:端口使能STP后进入Blocking后,默认经过20秒后进入Listening,默认经过15秒后进入Learning,此时这个状态会进行全网BPDU的交互,学习到所有SW的BPDU信息,从而选举RB、RP、DP、NDP
Q:上面是只讲了端口状态的转换,而STP是先把端口角色确定下来后才进行端口状态转换,既然使能STP,端口进入Blocking 状态,并没有交互网络中BPDU,那么最开始如何进行端口角色的选举?
A:因为最开始的时候,使能STP的交换机都会把自己当作根桥,这时候就有了本地的BPDU信息,这个时候就直接把端口角色确定下来了,并开始端口状态的迁移,到了之后的Learning状态,才会发生全网BPDU的交互
6.三种定时器
Hello Time | Hello Timer定时器时间的大小控制配置BPDU发送间隔。 |
Forward Delay Timer | Forward Delay Timer定时器时间的大小控制端口在Listening和Learning状态的持续时间。15s |
Max Age | Max Age定时器时间的大小控制存储配置BPDU的超时时间,超时认为根桥连接失败。20s |
-
Hello Time:
-
默认为2s,只能在根桥上进行修改
-
作用:保证生成树的健壮性
-
调整定时器:
-
调大:
-
优点:降低设备的负担
-
缺点:生成树不稳定
-
-
调小:
-
优点:生成树稳定
-
缺点:设备负担过大
-
-
-
-
Message Age:
-
从根桥到当前桥的接受到BPDU的总时间,若从根桥发出,则Message Age为0,每经过一个桥,配置BPDU就会加1
-
调整定时器:
-
调大:
-
优点:不会引起临时环路
-
缺点:收敛性差
-
-
调小:
-
优点:收敛性好
-
缺点:会引起临时环路
-
-
-
-
Max age:
-
BPDU的老化时间,默认为20s
-
调整定时器:
-
调大:
-
优点:不会误判为链路故障
-
缺点:间接故障不能及时发现
-
-
调小:
-
优点:间接故障能被及时发现
-
缺点:会被误判为链路故障
-
-
-
7.STP选举步骤
-
选举根桥:在所有运行STP协议的交换机上选举一个唯一的根桥。
-
BPDU数据帧中BID值最小的交换机将成为根桥
-
-
选举根端口:在所有非根网桥交换机上的不同端口之间选举出一个到根网桥最近的端口作为根端口。
-
端口到根桥RPC最小
-
上行设备BID最小
-
上行设备PID最小
-
本地端口PID最小
-
-
选举指定端口:在每一条链路上选举出一个指定端口。
-
网桥到根桥RPC最小
-
本地BID最小
-
本地PID最小
-
-
阻塞其它端口
8.配置BPDU的比较原则
-
比较根桥ID——RID(优先级+MAC地址) ,越小越优先
-
比较RPC,越小越优先
-
比较发送端的BID(优先级+MAC地址(越小越优先))
-
比较发送端的PID(优先级+端口号(越小越优先))
一般来说,二层优先级越小越优先,三层优先级越大越优先。
第一条原则主要用于在网络中选举根桥,后面的原则主要用于选举根接口及指定接口。
9.TCN BPDU
TCN BPDU的作用:加快mac表的超时以更新转发表项(要与树的形状同步)
-
当网络拓扑发生变化时,交换机会从自己的根端口向外发送TCN BPDU报文
-
接收到TCN BPDU报文的交换机向发送者发送TCA报文标识对TCN的确认
-
根交换机接收到TCN BPDU报文向网络中发送TC BPDU报文标识拓扑变化
-
收到TC BPDU报文的交换机将MAC地址表清空
10.临时环路的问题
11.传统STP的不足
问题一:STP初始化时间过长
设备运行STP初始化场景。STP从初始状态到完全收敛至少需经过30s
初始时,交换机之间会相互发送、监听BPDU,并计算生成树。 STP算法是采用被动等待计时器超时的方式来判断已收集全网所有的 BPDU,进而再进行计算。
从Listening到Forwarding需要30s:
Listening->Learning:STP 为避免临时环路,必须等待足够长的时间(即确保BPDU 能同步发送至全网各节点)确保全网的端口状态全部确定,才能进入转发。
Learning->Forwarding:在 STP 进入转发前还需根据收到的用户流量构建MAC地址表,仍需等待计时器超时才能进入转发。
问题二:端口状态转换时间过长
SWC与SWA的直连链路down掉,其NDP端口切换成RP端口并进入转发状态至少需要经过30s。
问题三:对次优BPDU处理的机制
在STP中,交换机除指定端口外的其他端口收到次优BPDU都不会做处理。
SWB与SWA的直连链路down掉,则SWC的NDP端口切换成DP端口并进入转发状态大约需要50s。
问题四:连接终端的端口仍需要等待超时
交换机连接终端的链路进入转发需要经过30s
STP 中,连接终端的链路也要进行生成树计算且链路进入转发需等待2个Forward Delay时间。
事实上,只要保证该端口下连接的是终端设备就不会出现环路,即没有必要进行STP计算和等待计时器超时
问题五:STP的拓扑变更机制
先由变更点朝根桥方向发送TCN消息,收到该消息的上游交换机就会回复TCA消息进行确认;最后TCN消息到达根桥后,再由根桥发送TC消息通知设备删除桥MAC地址表项,机制复杂,效率低下
拓扑变更处理过程
-
在网络拓扑发生变化后,下游设备会不间断地向上游设备发送TCN BPDU报文。
-
上游设备收到下游设备发来的TCN BPDU报文后,只有指定端口处理TCN BPDU报文。其它端口也有可能收到 TCN BPDU报文,但不会处理。
-
上游设备会把配置BPDU报文中的Flags的TCA位设置1,然后发送给下游设备,告知下游设备停止发送TCN BPDU 报文。
-
上游设备复制一份TCN BPDU报文,向根桥方向发送。
-
重复上述步骤,直到根桥收到TCN BPDU报文。
-
根桥把配置BPDU报文中的Flags的TC位置1后发送,通知下游设备直接删除桥MAC地址表项。
2、RSTP
1.端口角色
RSTP 中根端口和指定端口角色的定义和 STP 相同。RSTP 增加了三种端口角色:替换端口 (Alternate Port)、备份端口(Backup Port)和边缘端口(Edge Port)。
-
替换端口为网桥提供一条到达根桥的备用路径,当根端口或主端口被阻塞后,替换端口将成为新的根端口。
-
备份端口为网桥提供了到达同一个物理网段的冗余路径,当指定端口失效后,备份端口将转换为新的指定端口。 当开启了生成树协议的同一台设备上的两个端口互相连接而形成环路时,设备会将其中一个端口阻塞,该端口就是备份端口。
-
边缘端口是不与其他设备或网段连接的端口,边缘端口一般与用户终端设备直接相连。
边缘端口的特点:
边缘端口会节省30S的延时,端口UP后会立即进入转发状态。
边缘端口的UP/DOWN不会触发拓扑改变。
当边缘端口收到TC BPDU时,会触发交换机更新MAC地址表,但不会更改MAC地址老化时间
边缘端口如果收到配置的BPDU报文会马上变为一个普通端口,进行STP的收敛
边缘端口也会发送配置BPDU报文。
PA协商不会阻塞边缘端口。
替换端口和备份端口:
1、 从配置BPDU报文发送角度来看:
a) Alternate Port 就是由于学习到其它网桥发送的配置BPDU报文而阻塞的端口
b) Backup Port 就是由于学习到自己发送的配置BPDU报文而阻塞的端口
2、 从用户流量角度来看:
a) Alternate Port 提供了从指定桥到根的另一条可切换路径,作为根端口的备份端口
b) Backup Port 作为指定端口的备份,提供了另外一条从根节点到叶节点的备份通路
2.端口状态
3.P/A(Proposal/agreement)协商
针对运行STP设备从初始化到完全收敛至少需要30s的问题,RSTP采用P/A协商机制。由于有来回确认机制和同步变量机制,就无需依靠计时器来保障无环。可以让交换机的互联接口快速进入转发模式。
P/A协商的硬件条件:
只能应用在点到点的链路上(全双工的端口),如果是半双工端口会识别为共享(share)链路,在共享链路上不能使用P/A协商。一旦P/A协商不成功,指定端口的选择就需 要等待两个Forward Delay,协商过程与STP一样。
P/A协商的过程:
-
SW1向SW2发送p置位的BPDU包。
-
同步变量(阻塞除边缘端口以外的其他端口,防止出现环路)。
-
SW2向SW1发送A置位的BPDU包。
-
SW1收到A置位的BPDU包后,端口立即进入Forwarding状态。(一般都是秒级)
P/A协商的详细过程:
什么情况下RSTP报文中需要将Proposal位置位?
一个指定端口进入discarding或learning状态,需要将proposal位置位。
RSTP中收敛时间的优化:
P/A协商:可以让交换机的RP和DP的互联接口快速进入转发状态。
直连故障:AP口变为RP并快速进入转发状态,不需要30s延时。
次优场景:AP口收到次优的RST BPDU包后会马上变为DP口,并向该端口发送最优的RST BPDU包。
非直连链路故障:连续丢失3个RST BPDU包,端口角色就需切换,最长时间为6s。
RSTP中TC置位的RST BPDU包所有桥设备都可以发送,连续发送4s(TC while时间)。
在RSTP中什么情况下才会发送TC BPDU包?
指定端口进入到转发状态。
4.环路的预防
-
开启STP协议,防止接入层交换机的发生自环。
-
接入层上联口开启BPDU Filter,防止BPDU被发送到其他端口,实现单端口的关闭。
-
下联口开启产商私有的防环技术,防止下联Hub的自环。
-
下联口起用BPDU Guard,防止下联普通交换机发生环路,环路时收到的BPDU相同,无法比较,BPDU Guard用于过滤BPDU。
-
下联口开启Portfast,设置连接PC的边缘端口。
5.STP和RSTP的区别
-
新增端口角色(alternate port、backup port)
-
STP有五种端口状态(disable、blocking、listening、learning、forwarding) RSTP只有三种端口状态(discarding、learning、forwarding)
-
RSTP只有配置BPDU、无TCN BPDU(取而代之的是TC BPDU)
-
RSTP包含两种链路:点到点链路、共享链路
-
端口的迁移:只要确定无环,立刻切换为forwarding状态(P/A机制)
快速收敛:RSTP具有更快的收敛时间。
灵活性:RSTP引入了替换端口(alternate port)和备份端口(backup port),以及更精细的状态转换过程。使得RSTP在网络拓扑变化时能够更灵活地调整生成树拓扑,减少了端口状态的改变和数据包的丢失。
支持快速端口:RSTP引入了快速端口(fast port)的概念,这些端口在网络拓扑发生变化时能够更快地进入指定状态,从而加速了生成树协议的收敛过程。
兼容性:RSTP与传统的STP兼容
更少的BPDU交换:RSTP通过减少BPDU(Bridge Protocol Data Unit,桥接协议数据单元)的交换次数来降低网络的开销,这样可以减少网络中的冗余信息和带宽占用。
特性 | STP | RSTP |
收敛速度 | 慢 | 快 |
协议复杂度 | 简单 | 复杂 |
兼容性 | 向下兼容所有支持STP的设备 | 向下兼容STP,需要所有设备都支持RSTP才能发挥其快速收敛的优势 |
应用场景 | 小型局域网 | 大型局域网、数据中心等 |
6.RSTP中MAC地址表的清空
-
TC发送者:清除边缘端口以外的其他端口的MAC地址表项
-
TC接收者:清除了接收TC报文和边缘端口以外的MAC地址表项
7.RSTP保护功能
(1)UplinkFast:
-
作用:减少收敛时间
-
上行链路组由根端口和所有提供去往根桥的替代端口组成,当根端口发生故障,则意味主用的上行链路故障,上行链路组内带有最低开销的端口将会被立即选举为新的根端口。
(2)BackboneFast:
-
作用:缩短非RSTP的收敛时间
-
当某条非直连链路发生故障,BackboneFast会检查是否去往根桥的替代路径
(3)Portfast:
-
作用:加快收敛
-
在接入层交换机的access口上使用,portfast端口一旦接了设备,接口可绕过listening和learning直接进入forwarding。
SW(config-if)#spanning-tree portfast [trunk]
//Spanning-tree portfast特性不能直接配置在trunk模式的接口上,否则即使配上去了,CISCO lOS也不生效,除非该接口变成access模式。如果确实需要在 trunk接口上配置,例如该接口连接了一台支持trunk的服务器,那么就在Spanning-tree portfast命令上增加trunk关键字。
注意,虽然配置了portfast的接口在no shutdown或者link一旦up的时候,会jump to forwarding状态,绕过listening和learning ,但是,这个接口建议必须是连接路由器或PC的。如果连的是交换机,这个接口仍然要接受spanning-tree的计算结果,如果计算结果是block,那么这个接口仍然会被block。这就是为什么你在CISCO IOS上敲入该条命令,lOS 会提示你,说可能会造成短暂的桥接环路。
(4)BPDUFilter:
可以在全局模式下配置,也可以在接口模式下配置,区别如下:
全局配置:spanning-tree portfast bpdufilter default
a)启用了portfast的接口将激活bpdufilter特性
b)接口在link up后瞬间会发送BPDU ( a few ),此后不再发送任何BPDU
c)接口在收到BPDU后立即丢失 portfast及bpdufilter特性,成为一个普通的spanning-tree接口
接口配置:spanning-tree bpdufilter enable
该接口将不会发送BPDU,也忽略接收到的BPDU
在接口上配置,不一定必须portfast特性,可独立实施。当然,建议搭配portfast特性使用。
(5)BPDU保护:
-
黑客在边缘端口接入一台运行生成树的交换机,当边缘端口收到BPDU时会切换为非边缘端口,重新开始进行生成树的计算,引起网络震荡
-
在边缘端口处开启BPDU保护,当收到BPDU报文时,该端口立即关闭,可以有效防止网络震荡
(6)BPDU过滤:
-
端口上所有接收到的配置BPDU 都会被丢弃
(7)Root保护:
-
黑客在根桥处接入一台优先级最高的交换机,该交换机可发送更优的BPDU报文,其他交换机收到更优收的BPDU报文后重新进行生成树的计算,从而引起网络拓扑结构的错误变更
-
在根桥处开启root 保护,当该端口收到更优的RST BPDU后,端口进入Discarding状态,不再转发报文。若一段时间内端口未收到更优的配置BPDU,则会自动恢复到正常的Forwarding状态
(8)环路保护:
-
当非指定接口收不到BPDU时,阻止其成为指定接口
(9)TC-BPDU泛洪保护:
-
黑客在边缘端口接入一台计算机不断伪造和发送TC-BPDU,交换机频繁地删除MAC地址表,交换机设备短时间内会收到很多TC-BPDU报文,频繁的删除操作会给设备造成很大的负担,给网络的稳 定带来很多隐患
-
在边缘端口处配置TC-BPDU保护功能,在单位时间内,交换设备处理TC-BPDU报文的次数可配置,设备只会处理阈值指定的次数
8.STP/RSTP缺陷
RSTP在STP基础上进行了改进,实现了网络拓扑快速收敛。但RSTP和STP还存在同一个缺陷:由于局域网内所有的VLAN共享一棵生成树,因此无法在VLAN间实现数据流量的负载均衡,链路被阻塞后将不承载任何流量,还有可能造成部分VLAN的报文无法转发。
3、MSTP
1.MSTP对STP和RSTP的改进
-
IEEE于2002年发布的802.1S标准定义了MSTP。MSTP兼容STP和RSTP,既可以快速收敛,又提供了数据转发的多个冗余路径,在数据转发过程中实现VLAN数据的负载均衡。
-
MSTP把一个交换网络划分成多个域,每个域内形成多棵生成树,生成树之间彼此独立。每棵生成树叫做一个多生成树实例MSTI(Multiple Spanning Tree Instance),每个域叫做一个多生成树域/MST域(MST Region:Multiple Spanning Tree Region)。
-
所谓生成树实例就是多个VLAN的一个集合。通过将多个VLAN捆绑到一个实例,可以节省通信开销和资源占用率。MSTP各个实例拓扑的计算相互独立,在这些实例上可以实现负载均衡。可以把多个相同拓扑结构的VLAN映射到一个实例里,这些VLAN在端口上的转发状态取决于端口在对应MSTP实例的状态。
2.MSTP与VRRP结合
MSTP与VRRP配合使用,达到冗余备份与负载均衡的双重效果,无论是链路出现故障还是设备出现故障都能在极短的时间内恢复网络的连通性,此模型多见于金融网络。
01.VRRP主和MSTP根保持一致
02.规划多个VRRP,MSTP组,实现服务器网关的备份和负载分担。
03.在汇聚交换机上指定根桥,明确的路径使排错和配置网络变得更为容易。
04.汇聚交换机上联的三层接口采用路由口互联,避免采用SVI互联,限制二层网络的范围。
05.汇聚交换机上不需要参与STP的端口关闭STP特性。
06.汇聚交换机(根桥和备份根桥)与接入交换机互联的端口开启“root保护”功能。
07.汇聚交换机与接入层交换机相连的端口避免配置trunk 保持默认值。
08.接入交换机上行端口开启“环路保护”功能。
09.接入交换机连PC的口开“root保护”功能。
10.接入交换机与服务器直连端口设置为“边缘端口”。
11.接入交换机与服务器相连的端开启“BPDU保护”功能。
12.接入交换机与服务器相连的端开启“私有防环”功能。
13.所有交换机上开启“TC-BPDU保护”功能。
相关文章:
生成树详解(STP、RSTP、MSTP)
目录 1、STP 1.概述 2.基本概念 3.端口角色及其作用 4.报文结构 5.STP的端口状态 6.三种定时器 7.STP选举步骤 8.配置BPDU的比较原则 9.TCN BPDU 10.临时环路的问题 11.传统STP的不足 拓扑变更处理过程 2、RSTP 1.端口角色 2.端口状态 3.P/A(Propo…...
C++趣味编程:基于树莓派Pico的模拟沙漏-倾斜开关与LED的互动实现
沙漏,作为一种古老的计时工具,利用重力让沙子通过狭小通道,形成了计时效果。在现代,我们可以通过电子元件模拟沙漏的工作原理。本项目利用树莓派Pico、倾斜开关和LED,实现了一个电子沙漏。以下是项目的详细技术解析与C++代码实现。 一、项目概述 1. 项目目标 通过倾斜开关…...
Matlab Simulink 电力电子仿真-单相电压型半桥逆变电路分析
目录 一、单相电压型半桥逆变电路仿真模型 1.电路模型 2.电路模型参数 二、仿真分析 三、总结 1.优缺点 2.应用场景 一、单相电压型半桥逆变电路仿真模型 1.电路模型 单相电压型半桥逆变电路是一种常见的逆变电路,主要用于将直流电源转换为交流电源。 &…...
在超表面中琼斯矩阵的使用
琼斯矩阵(Jones Matrix) 是一种线性代数方法,用于描述光的偏振状态和偏振变化,是偏振光学中重要的数学工具。它在 超表面理论设计 中广泛应用,尤其是在设计和调控光与物质相互作用时,例如偏振控制、相位调制…...
threeJs学习 贴图 :地球
效果图: 贴图以后的效果: vue代码: <template><div class"scene_box"><p>创建纹理贴图TextureLoader</p><div class"canvas"></div></div> </template><script s…...
详解Rust多线程编程
文章目录 多线程模型创建和管理线程自定义线程行为线程传递数据线程间通信线程池错误处理与线程Condvar(条件变量)无锁并发高性能并发库 Rust的多线程编程提供了一种安全、高效的方式来进行并发操作。Rust的并发性设计原则之一是确保线程安全,同时避免运行时的开销&…...
Uniapp触底刷新
在你的代码中,使用了 scroll-view 来实现一个可滚动的评论区域,并且通过监听 scrolltolower 事件来触发 handleScrollToLower 函数,以实现“触底更新”或加载更多评论的功能。 关键部分分析: scroll-view 组件: scroll-view 是一…...
【前端】安装hadoop后,前端启动报错,yarn命令
新安装hadoop后,前端启动项目用yarn命令,报错。 报错:系统找不到指定的路径。 No HADOOP_CONF_DIR set. Please specify it either in yarn-env.cmd or in the environment. 解决:删掉hadoop目录下yarn的文件 检查:…...
T620存储安全方案SoC芯片技术手册
系统资源 集成32位国产CPU CK803S;最高工作频率260Mhz CK803S内置16KB I/D Cache,内置32KB DTCM 32KB ROM;256KB SRAM;8KB SRAM(系统专用) 512KB/1MB 片内Flash 安全算法 支持SM4数据加密,加密性…...
Rust循环引用与多线程并发
循环引用与自引用 循环引用的概念 循环引用指的是两个或多个对象之间相互持有对方的引用。在 Rust 中,由于所有权和生命周期的严格约束,直接创建循环引用通常会导致编译失败。例如: // 错误的循环引用示例 struct Node {next: Option<B…...
力扣 二叉树的锯齿形层序遍历-103
二叉树的锯齿形层序遍历-103 此题就是再二叉树层序遍历的基础上,加了反转当前层数组元素的函数reverse(),也可以不反转,直接在遍历当前层的所有节点的for循环里直接进行if判断,根据遍历方向,决定如何插入元素。 clas…...
PyCryptodome:Python中的密码学库
简介 PyCryptodome是一个功能强大的Python密码学库,提供了各种密码学算法的实现,包括对称加密、非对称加密、哈希函数、消息认证码等。它是对Python的Crypto库的一个现代化和增强版,提供了更好的性能和安全性。 Git地址 PyCryptodome的代码可…...
我眼中的“懂重构”(一)
初识重构 2017年的时候,领导让我看公司的一本书《重构——改善代码的既有设计》,这是一本JAVA版本的,前后看了2遍。那时候看书因为不懂看的格外仔细。我只是那时候不懂,然而多年后的今天我仍然发现很多人对重构充满误解。在刚进入…...
Excel中日期格式“年月日 时间”修改为“年月日”
需求: 将Excel中“yyyy-mm-dd hh:mm:ss”格式的时间转换为“yyyy-mm-dd”格式的时间,选中转换后的时间时编辑栏中依然会显示“yyyy-mm-dd hh:mm:ss”格式。 方法一、在原数据列进行转换: 1、选中需要转换的数据列,右键--【设置…...
CSS底层基础:小白速来
1. CSS简介 CSS (Cascading Style Sheets) 是一种用来描述HTML或XML文档样式的语言。它使得开发者能够控制网页的布局和外观,包括字体、颜色、间距等。CSS通过选择器来指定要应用样式的元素,并定义这些元素的具体样式属性。 基本结构示例: …...
【MySQL】库和表的基本操作
目录 库 库的增删查改 字符集与校验集 库的备份与恢复 表 表的创建和删除 用不同的存储引擎创建表的区别 查看表 修改表 添加删除属性 修改改变属性 上篇博客我们讲了数据库的基本理解,对数据库有了一个大致的概念,下面我们来介绍一下库和表的…...
5款AI智能办公工具丨提升办公效率‼️
办公效率低?工作压力大?别担心,这里有五款超实用的AI办公工具,帮你轻松搞定各种任务!🌟 简直不要太实用,快快收藏起来总有一天你会用得上~ 红薯通AI📝写作文案的好帮手,…...
华为HarmonyOS 让应用快速拥有账号能力 -- 3 获取用户手机号
场景介绍 当应用对获取的手机号时效性要求不高时,可使用Account Kit提供的手机号授权与快速验证能力,向用户发起手机号授权申请,经用户同意授权后,获取到手机号并为用户提供相应服务。以下只针对Account kit提供的手机号授权与快…...
lambda strem流表达式处理工具
一个通用的lambda stream流处理工具, 包含了工作中绝大部分场景常用的使用方式 import java.math.BigDecimal; import java.util.*; import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.Function; import java.util.funct…...
Android 编译和使用libheif
项目中需要使用libheif,libde265,libyuv。一下是相应的cmakelist.txt。这里直接使用了静态库。 里面涉及到c包的链接,需要stdc。 ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/liblibde265.a这个路径由于操作过程中copy出现问题,多了一层路径&…...
新一代零样本无训练目标检测
🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年12月2日21点02分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅h…...
神经网络入门实战:(九)分类问题 → 神经网络模型搭建模版和训练四步曲
(一) 神经网络模型搭建官方文档 每一层基本都有权重和偏置,可以仔细看官方文档。 pytorch 官网的库:torch.nn — PyTorch 2.5 documentation Containers库:用来搭建神经网络框架(包含所有的神经网络的框架);…...
写NFC微信小程序跳转Uri标签
本示例使用的发卡器:https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1b8bEEGz&ftt&id615391857885 Dim dispstr As String Dim status As Byte Dim status1 As Byte Dim afi As Byte Dim myctrlword As Byte Dim mypiccserial(0 To 7) …...
Gradle vs. Maven: 到底哪个更适合java 项目?
ApiHug ApiHug - API Design & Develop New Paradigm.ApiHug - API Design & Develop New Paradigm.https://apihug.com/ 首先 ApiHug 整个工具链是基于 gradle 构建,包括项目模版, 插件; 说到 Java 项目管理,有两个巨头脱颖而出&a…...
【赛博保安】安全日记之常用术语(一)
"企业的信息安全治理水平,直接取决于安全团队人员的技术专业度,而非运营经验值。所谓的技术,并非指渗透和挖洞的能力,而是指软件开发、IT 架构、网络拓扑相关的知识和经验。 站在乙方的角度来看,技术薄弱的安全人…...
设计模式 更新ing
设计模式 1、六大原则1.1 单一设计原则 SRP1.2 开闭原则1.3 里氏替换原则1.4 迪米特法则1.5 接口隔离原则1.6 依赖倒置原则 2、工厂模式 1、六大原则 1.1 单一设计原则 SRP 一个类应该只有一个变化的原因 比如一个视频软件,区分不同的用户级别 包括访客࿰…...
008静态路由-特定主机路由
按照如上配置,用192.168.0.1 电脑ping 192.168.1.1 发现能够ping通 用192.168.0.1 电脑ping 192.168.2.1 发现不能ping通 这是因为192.168.0.1 和 192.168.1.1 使用的是同一个路由器R1。 192.168.0.1 和 192.168.2.1 通信需要先经过R1,再经过R2 …...
MySQL 慢查询日志记录 SQL优化 性能优化 日志查询 Explain
介绍 慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。MySQL的慢查询日志默认没有开启,需要在MySQL的配置文件(/etc/my.cnf)中配置针对这些慢查询的SQL语句进行优化。 #开启慢查询开关 s…...
VINS_MONO视觉导航算法【三】ROS基础知识介绍
文章目录 其他文章说明ROSlaunch文件基本概念定义用途 文件结构根标签常用标签\<node>\<param>\<rosparam>\<remap>\<include>\<arg>\<group> 示例基本示例嵌套示例 使用方法启动 *.launch 文件传递参数 总结 ROS topicTopic 的基本…...
Python 3 教程第13篇(集合)
Python3 集合 集合(set)是一个无序的不重复元素序列。 集合中的元素不会重复,并且可以进行交集、并集、差集等常见的集合操作。 可以使用大括号 { } 创建集合,元素之间用逗号 , 分隔, 或者也可以使用 set() 函数创建集…...
cesium 3dtile ClippingPlanes 多边形挖洞ClippingPlaneCollection
原理就是3dtiles里面的属性clippingPlanes 采用ClippingPlaneCollection,构成多边形来挖洞。 其次就是xyz法向量挖洞 clippingPlanes: new this.ffCesium.Cesium.ClippingPlaneCollection({unionClippingRegions: true, // true 表示多个切割面能合并为一个有效的…...
开发者如何使用GCC提升开发效率GUI操作
看此篇前请先阅读https://blog.csdn.net/qq_20330595/article/details/144139026?spm1001.2014.3001.5502 先上效果图 找到对应的环境版本 配置环境 目录结构 CtrlShiftP c_cpp_properties.json {"configurations": [{"name": "Win32","i…...
什么是隐式类型转换?
隐式类型转换(Implicit Type Conversion)是指编译器在没有明确要求的情况下,自动地将一种类型的值转换为另一种类型。C 语言支持隐式类型转换,这通常发生在表达式运算或函数调用中,以确保操作数或参数的类型兼容性。 隐…...
爬虫专栏第三篇:Python 实战:运用 requests 突破京东商品评论获取难题(含 cookie 处理与编码设置技巧
简介:本文以京东商品评论为例,详细介绍了使用requests库获取网页数据的过程,包括从打开商品评价页面、抓包分析找到评论接口,到处理cookie参数、解决cookie字符串解析问题,以及设置正确的编码以成功获取评论数据&#…...
HCIE:详解OSPF,从基础到高级特性再到深入研究
目录 前言 一、OSPF协议基本原理 简介 基本原理 OSPF路由器类型 OSPF网络类型 OSPF报文类型和封装 OSPF邻居的建立的维护 DR和BDR的选举 伪节点 LSDB的更新 OSPF的配置 二、OSPF的高级特性 虚连接(Virtual-Link) OSPF的LSA和路由选择 OSPF…...
第六十六条:谨慎使用本地方法
其实在java中有很多都是采用C或C语言实现的比如native这种的本地方法,感兴趣的可以找源代码看看。 Java Native Interface (JNI) 允许Java应用程序可以调用本地方法(native method),所谓本地方法是指使用本地程序设计语言…...
neo4j如何存储关于liquidity structure的层次和关联结构
在 Neo4j 中存储关于流动性结构(liquidity structure)的层次和关联结构非常适合,因为 Neo4j 是一个基于图的数据库,能够自然地建模和存储复杂的关系和层次结构。下面是如何在 Neo4j 中设计和实现这样的数据模型的详细步骤和示例。…...
45 基于单片机的信号选择与温度变化
目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机,采用DS18B20检测温度,通过三种LED灯代表不同状态。 采用DAC0832显示信号脉冲,通过8位数码管显示温度。 信号脉冲可以根据两个按键分别调整为正弦…...
2、Three.js初步认识场景Scene、相机Camera、渲染器Renderer三要素
三要素之间关系: 有了虚拟场景Scene,相机录像Camera,在相机小屏幕上看到的Renderer Scene当前空间 Mesh人在场景 Camera相机录像 Renderer显示器上 首先先描述下Scene: 这个场景为三要素之一,一切需要展示的东西都需…...
Java基础面试题06:hashCode()和equals()方法的重要性体现在什么地方?
前言 Java中的hashCode()和equals()方法看似是干同一件事,但它们的使用场景和作用却大有不同。为了让程序更高效、更准确地运行,我们需要对这两者有深入的了解,并掌握它们的重写规则。 hashCode()和equals()的基础知识 什么是hashCode&…...
Matlab Simulink HDL Coder开发流程(一)— 创建HDL兼容的Simulink模型
创建HDL兼容的Simulink模型 一、使用Balnk DUT模板二、从HDL Coder库中选择模块三、为DUT开发算法/功能四、为设计创建Testbench五、仿真验证设计功能六、Simulink模型生成HDL代码 这个例子说明了如何创建一个用于生成HDL代码的Simulink模型。要创建兼容HDL代码生成的MATLAB算法…...
C#基础之方法
文章目录 1 方法1.1 定义方法1.2 参数传递1.2.1 按值传递参数1.2.2 按引用传递参数1.2.3 按输出传递参数1.2.4 可变参数 params1.2.5 具名参数1.2.6 可选参数 1.3 匿名方法1.3.1 Lambda 表达式1.3.1.1 定义1.3.1.2 常用类型1.3.1.3 Lambda 表达式与 LINQ1.3.1.4 Lambda 表达式的…...
Pytest框架学习19--参数化2
1、数据源是yaml 安装yaml,使用safe_load方法读取文件,解析出数据 pip install PyYAML # test_data.yaml test_case_1:a: 2b: 3expected_result: 5test_case_2:a: -1b: 10expected_result: 9test_case_3:a: 0b: 0expected_result: 0# test_code.pyimpor…...
VSCode中“Run Code”运行程序时,终端出现中文乱码解决方法
问题描述 在VSCode中“Run Code”运行程序时,终端输出结果出现中文乱码现象: 解决方法 1. 检查系统cmd的默认编码 查看Windows终端当前编码方式的命令: chcp输出结果是一段数字代码,如936,这说明当前的cmd编码方式…...
HarmonyOS 5.0应用开发——列表(List)
【高心星出品】 文章目录 列表(List)列表介绍列表布局设置主轴方向设置交叉轴方向 列表填充分组列表填充 滚动条位置设置滚动位置滚到监听 列表项侧滑 列表(List) 列表介绍 列表作为一种容器,会自动按其滚动方向排列…...
C++设计模式外观模式(Facade)
什么是桥接模式? 桥接模式(Bridge Pattern)是一种结构型设计模式,它的核心目的是解耦抽象部分和实现部分,让它们可以独立变化。在简单的描述中,桥接模式可以让你在不修改原有代码的情况下,分别…...
《Python基础》之Numpy库
目录 简介 一、创建数组 1、根据列表创建数组 2、创建全0数组 3、创建全1数组 4、创建单位矩阵 5、创建随机数数组 二、查看数组的属性 三、 数组的操作 1、索引和切片 2、变形 3、拼接 (1)、vstack() 纵向拼接 (2)、hs…...
Python异步编程与API调用:提高效率与性能的实践指南
引言 在当今的软件开发领域,异步编程已成为提高应用程序性能和响应能力的关键技术。特别是在处理I/O密集型任务,如API调用时,异步编程能够显著提升效率。本文将通过一个具体的示例——使用Python的asyncio和aiohttp库来异步调用APIÿ…...
Zookeeper3.4.14集群安装
Zookeeper3.4.14三节点集群安装 为保证集群高可用,Zookeeper 集群的节点数最好是奇数,最少有三个节点,所以这里搭建一个三个节点的集群。(在一个节点模拟三节点,真实的三节点把ip替换一下即可,按照hadoop案件把网络打…...
电机驱动MCU介绍
电机驱动MCU是一种专为电机控制设计的微控制器单元,它集成了先进的控制算法和高性能的功率输出能力。 电机驱动MCU采用高性能的处理器核心,具有快速的运算速度和丰富的外设接口。它内置了专业的电机控制算法,包括PID控制、FOC(Fi…...