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

第八章,STP(生成树协议)

image-20240527184247445

广播风暴----广播帧在二层环路中形成逆时针或顺时针的转动的环路,并且无限循环,最终导致设备宕机,网络瘫痪。

MAC地址表的翻摆(漂移)----同一个数据帧,顺时针接收后将记录MAC地址及接口的对应信息,之后,逆时针还会再更改一次MAC地址表,如果循环,导致MAC地址表内容一直在变化

多重复数据帧

STP是一个经典的、开放的解决以太网二层环路问题的技术

802.1D生成树协议

802.1D----标准STP---IEEE
802.1W----RSTP----快速生成树
802.1S----MSTP----多生成树协议

PVST\PVST+-----思科
VBST---华为

基本概念

桥ID---每一个运行STP的交换机都拥有的唯一的一个桥ID。一共8字节,2字节的桥优先级+6字节的桥MAC地址

根桥----指的就是通过STP算法计算出的STP树的根节点。

根桥式STP算法中最重要的一个参考点,STP协议在开始工作后,第一件事就是在网络中选举出根桥设备

在交换网络中,根桥有且只能有一个

根桥选举规则:网络中拥有最小桥ID的交换机将成为根桥

华为交换机缺省的桥优先级=32768。该参数可以修改,但是必须修改为4096的倍数

image-20230414143208956

开销(Cost)与根路径开销(RPC)

STP的接口开销值是根据不同的开销值算法、接口速率和接口工作模式共同决定。

image-20230414145904140

缺省情况下,使用IEEE 802.1t算法需要保证交换网络中所有STP设备使用一致的计算方法

跟路径开销---RPC----指的是任意一个节点到达根桥节点的总开销

接口ID

交换机使用接口ID来标识每一个接口,接口ID主要用来在特定场景下选举角色。

16bit组成,4bit的接口优先级+12bit的接口编号

默认情况下,接口优先级为128;只能修改为16的倍数

STP的报文---BPDU

网桥协议数据单元

  • 配置BPDU

  • TCN BPDU --- 拓扑发生变更时,进行通知的报文

BPDU载荷被直接封装在以太网数据帧中,数据帧的目的MAC地址是组播MAC地址:0180-c200-0000

配置BPDU

每台交换机在初始化的过程中,都会从自己激活了STP协议的接口向外发送配置BPDU

当STP协议收敛完成后,只有根桥才会周期性发送配置BPDU(2S)非根网桥会在收到上游设备传递来的配置BPDU后,触发更新将自己的BPDU报文向下游设备通告

image-20221019174257022

PVI---协议版本ID
    STP----0
    RSTP---2
    MSTP---3

BPDU Type----BPDU类型
    0x00---STP的配置BPDU
    0x80---STP的TCN BPDU
    0x02---RSTP\MSTP
    
标记位
    最高位:TCA---拓扑变更确认标记
    最低位:TC----拓扑变更标记
    
消息寿命---代表该BPDU从发出到现在经过多少台设备
    单位:设备数量
    初始值=0,每经过一台交换机,数值+1
    存在一个Max Hop参数--->最大消息寿命,默认值20

最大寿命(最大生存时间)---可以理解为死亡时间
    当超过该时间,则设备认为网络出现问题,链路出现故障等。20S

TCN BPDU报文

当设备接收到一个只有4字节大小的BPDU,就是TCN BPDU,则设备会知晓此时网络拓扑发生变化了

image-20230414165037109

image-20221019174613413

1、本地交换链路发生故障后,STP将重新收敛,为了加快刷新全网交换机的MAC地址表,故障交换机会向本地其余运行了STP协议的接口发送TCN BPDU报文。
2、邻居交换机收到TCN报文,将回复一个TCA标记位置为1的配置BPDU,用于可靠传输。
    该过程会一直持续到根网桥收到这个TCN BPDU。
3、之后根网桥会向下游设备发送TC标记位置为1的配置BPDU,并逐级发送到每一台交换机身上。
4、所有交换机在收到TC标记位置为1的配置BPDU后,会立即将MAC地址表的老化时间临时从300S调整到15秒(转发延迟),使得MAC地址表可以尽快刷新,以便适应新的网络拓扑。

STP角色选举

根桥选举(RB)

image-20230414150947886

  • 选举范围:整个交换网络中。

  • 每一台设备都会发送配置BPDU,配置BPDU中的BID字段为自己的桥ID,RID也是自己的桥ID--->每一台设备都会认为自己的根网桥。

  • 选举方法----选举具备最小桥ID数值的设备称为根网桥。

  • 根网桥的地址是具备可抢占性的。---一旦发生抢占,则会导致STP协议重新收敛。

根接口(RP)

  • 选举范围:每一个非根网桥设备上。

  • 根接口----非根网桥上所有接口中可以收到最优BPDU的接口。---根接口有且只有一个

    • 在STP收敛完成后,只有根网桥会周期性的发送配置BPDU,而非根网桥会根据收到的配置BPDU来计算自己的配置BPDU,然后将计算出的配置BPDU向下游发送。

    • 在计算过程中,设备会将最优的BPDU信息保存在自己的接口。

最优BPDU的比较原则

  1. 选择具有最小根桥ID的BPDU

    • 目的:是为了从众多的交换机中选举出根网桥。

  2. 比较入向的配置BPDU的RPC,选择最小的接口作为根端口

  3. 如果RPC相同,则比较对端设备的BID,选择较小的BID设备所对应的接口作为根端口

  4. 如果对端设备的BID相同,则比较对端的PID数值,PID小的端口为根端口

  5. 如果对端设备的PID相同,则比较本地的PID数值,PID小的端口为根端口

1、根桥ID
2、最小RPC
3、最小BID
4、最小PID

指定端口-DP

  • 选举范围:在每一个链路中选举出一个指定端口。

  • 这个接口是这条链路上所有接口中到大根桥的最优接口,并且,该接口负责向该链路中发送BPDU报文

  • 对于非根网桥而言,所有接口中收到的最优BPDU的接口将成为根接口,随后,非根网桥使用自己收到的最优BPDU,为本设备上的==其他接口各自计算一个BPDU报文==

    • 设备根据根网桥发送的配置BPDU,从而计算出自己接口的BPDU报文。并且该接口也可以收到对端发送来的BPDU报文。

    • 比较两个配置BPDU报文,选举出最优的BPDU报文。

    • 发送出最优BPDU报文的接口称为指定端口。--->一条链路两个接口,对端的接口被称为非指定端口。

  • 根端口的选举过程是非根网桥将自己所收到的所有BPDU进行比较,而指定接口的选举过程则是非根网桥用自己计算出的BPDU跟别的设备发送过来的BPDU进行对比

  • 一般而言,根网桥的所有接口都是指定接口;存在根端口的链路上,对端必然是指定端口

非指定接口--NDP

  • 一般也被称为阻塞端口。

  • 所有的非指定接口都会被STP协议阻塞,而被阻塞的接口既不会接收也不会转发业务数据,另外该接口也不会发送BPDU报文,但是,可以接收BPDU报文

STP的角色选举过程
  1. STP交换机初始启动后,都会认为自己是根网桥,并在发送给其他交换机的BPDU报文中宣告自己的根桥。因此,此时的BPDU中的根桥ID为各自设备的网桥ID。

    • 交换机收到网络中其他设备发阿松的BPDU后,会比较BPDU中的根桥ID和自己的BID。从而选举出BID最小的交换机作为根网桥,其他设备为非根网桥。

    • 根网桥可以被抢占。抢占后STP协议会重新收敛。

  2. 在选举出根桥后,根桥设备周期性发送BPDU---2S。而非根网桥周期性接收BPDU报文。

  3. 每个交换机根据从自己不同接口收到的BPDU报文中选择出最优的BPDU,从而选举出根端口

    • 比较RPC

    • 比较对端BID

    • 比较对端PID

    • 比较本地PID

  4. 每台交换机的每一条链路选举一个指定端口

    • 交换机将本接口与本接口收到的BPDU进行对比,若本接口BPDU较优,则本接口称为指定接口。否则本接口称为非指定端口。

      • RPC

      • BID

      • 链路两端的PID

  5. 在确定了根端口和指定端口后,交换机上剩余的所有端口被称为非指定端口。并且在逻辑上阻塞这些非指定端口

    • 一旦非指定端口被逻辑阻塞,STP收敛完成,生成STP树。

    • 阻塞端口不能收发业务数据,不能转发BPDU,可以接收和处理BPDU。

根网桥的选举非常重要,因为STP的一切工作都是基于根网桥的位置而定的,如果根网桥选举的位置不恰当,那么可能会造成流量走向异常的问题

解决方案:在三层架构组网中,汇聚层设备恰好是网关所在地,本身PC的流量就要经过汇聚层设备,所以一般将根网桥的位置放在网关所在地

STP的接口状态

image-20230418022900048

  • 阻塞

    • STP协议激活后接口进入的第一个状态。

    • 处于该状态的接口不能收发业务数据、不能学习MAC地址,不能发送BPDU,但是可以接收BPDU

    • 所有设备处于阻塞状态,网络中没有任何BPDU报文,当20S最大老化时间超时后,则所有设备认为网络中原本应该发送BPDU报文的根网桥设备出现故障,所以需要重新进行STP收敛,每台设备的每个接口会进入到下一个状态。

  • 侦听

    • 进行STP协议的角色选举。

    • 处于该状态的接口不能收发业务数据、不能学习MAC地址,但是可以收发BPDU报文

    • 在此时,每台设备认为自己是根网桥,发送BPDU报文,完成STP角色选举。

    • 在这个状态需要停留一个转发延迟时间(15S),当时间超时后,则进入下一个状态。

      • 只有根端口和指定端口会进入下一个状态,而非指定端口会退回到阻塞状态

  • 学习

    • 可以侦听业务数据,并且根据业务流量来学习MAC地址信息,但是,不会转发业务数据

    • 目的:是为了提前充实设备的MAC地址表,在后续的数据转发过程中,不需要在进行洪泛操作,因为MAC地址表中存有所有PC对应信息。

    • 停留一个转发延迟时间---15S

  • 转发

    • 正常收发业务数据和BPDU报文

STP的收敛时间

802.1D生成树的收敛是基于计时器完成。

  • STP的首次收敛---50S

  • 根网桥故障---50S

    • image-20230418030247556

  • 直连链路故障----30S

    • image-20221019205848271

  • 非直连链路故障---50S

STP基本配置

image-20240529184057772

[sw1]stp enable    ---开启STP协议,华为默认是开启STP生成树
[sw1]stp mode stp  ---修改生成树的工作模式为STP


[sw1]display stp   ---查看本地完整STP信息
[sw1]display stp  brief  ---查看STP接口状态简表


修改STP根网桥
[sw1]stp root primary   ---将SW1设定为STP的主根网桥,本质含义是将桥优先级修改为0
[sw2]stp root secondary ---将SW2设定为STP的备份根网桥,本质是将桥优先级修改为4096

直接修改STP桥优先级
[sw3]stp priority 8192  ----修改时,必须为4096的倍数


[sw1-GigabitEthernet0/0/24]stp port priority ?  --修改接口优先级
  INTEGER<0-240>  Port priority, in steps of 16
  


[sw1]stp pathcost-standard ?   ---修改开销值计算方式
  dot1d-1998  IEEE 802.1D-1998
  dot1t       IEEE 802.1T   ---默认
  legacy      Legacy   ---华为私有
  
  
[sw1-GigabitEthernet0/0/22]stp cost ?  ---直接修改某个接口的开销
  INTEGER<1-200000000>  Port path cost

RSTP---快速生成树协议

STP协议的问题
1、收敛速度慢----STP基于计时器的方式进行接口状态切换
2、链路利用率低

802.1W---主要解决了STP协议收敛速度慢的问题,没有解决链路利用率低的问题,所以,在RSTP中,还是一个交换网络一棵树。---向下兼容STP协议。

改进点1---端口角色

STP---根端口、指定端口、非指定端口
RSTP--根端口、指定端口、替代端口、备份端口
    替代和备份端口都属于阻塞端口。
    
替代端口----理解为根端口的备份。
    如果根端口发生故障,替代端口可以称为新的根端口,加快网络的收敛速度。
    在一个非根网桥设备上,根端口必须存在,但是替代端口可以存在没有也可以存在多个。
备份端口----理解为指定端口的备份
    备份端口实际上是一台设备上由于收到了自己所发送的BPDU报文从而被阻塞的端口。

改进点2---端口状态

image-20230418162553322

改进点3---RST BPDU

标记字段---使用了原本中间的6bit信息。

image-20221019213147640

bit 6---表示同意的含义,用于P/A机制
bit 5---转发状态
bit 4---学习状态
bit 3和bit 2---表示端口角色
bit 1---表示提议的含义,用于P/A机制

RSTP和STP不同,RSTP在网络稳定后,无论是根网桥还是非根网桥,都会周期性的发送配置BPDU

P/A机制----加快收敛

修改了状态切换的机制,将原本STP的基于计时器的状态切换方式修改为,选择出端口角色后立即切换状态

image-20240529194127013

1、A设备被选举为根网桥,故GE0/0/1接口称为指定端口。
    根网桥从该接口发送P标记置为1的BPDU报文,请求将本接口状态从丢弃切换到转发状态。加快收敛
    备注:想要切换为转发状态的前提是后续网络中没有环路。
    
2、B设备收到该BPDU报文后,会将本地所有除了根端口的其他端口全部阻塞,保障后续网络无环。
    这个过程被称为同步过程。
    
3、B设备完成同步过程后,将从根端口向上发送A标记位置为1的BPDU报文,并且将根端口的状态切换到转发状态。

4、A设备收到BPDU报文后,将接口切换为转发状态。

RSTP通过P/A机制来保证一个指定端口得以从丢弃状态快速进入转发状态,从而加速了生成树的收敛速度。在P/A机制中存在一个“同步状态”,实际上就是将其他全部接口设置为丢弃状态,防止临时环路的产生

改进点4---对配置BPDU的处理
  1. 配置BPDU的发送方式

    • STP---只有根网桥周期发送,非根网桥需要收到BPDU报文后,在发送自己的

    • RSTP---所有设备周期性发送

  2. 更短的BPDU超时时间

    • STP--最大老化时间20S

    • RSTP---最大老化时间-6S

  3. 次优BPDU的处理

    • 在STP的交换机的每一个接口中,都会保存一份BPDU报文。对于根端口和非指定端口而言,保存的是上游设备发送的BPDU报文,而对于指定端口而言,保存的是自己根据根端口的BPDU计算出的BPDU报文

      • 如果接口收到了一份BPDU报文,而该接口当前保存的BPDU比接收到的BPDU更优,那么接收的BPDU就是次优BPDU。---不如接口保存的BPDU报文

    • STP----当指定接口收到次优BPDU报文,它将立即发送自己的BPDU报文;而对于非指定端口,当收到次优BPDU报文,它将等待接口所保存的BPDU老化之后,再重新计算新的BPDU报文,并将新的BPDU报文发送出去。---->为什么非指定端口需要在最长20S的时间后才能启动状态迁移

    • RSTP----无论接口的角色如何,只要接口收到次优BPDU报文,便立即发送自己的BPDU,加速收敛

改进点5---快速收敛机制
  1. 根端口和指定端口的快速切换

  2. P/A机制

  3. 边缘端口

    • 如果交换机上某个端口位于整个网络的边缘---不在于其他交换机相连的接口,直接与PC或服务器直连的接口。

    • 边缘接口不参与生成树的计算,当边缘接口被激活时。这个接口可以立即切换到转发状态,并且开始收发业务数据流量

    • 边缘接口的关闭或激活不会影响RSTP的拓扑变化的

    • [sw3-GigabitEthernet0/0/22]stp edged-port enable ---将该接口设定为边缘接口,该接口不需要发送BPDU报文,因为边缘接口一般是连接PC的接口。

      边缘端口还是会持续性发送BPDU报文

      [sw1-GigabitEthernet0/0/1]stp bpdu-filter enable ---开启BPDU过滤,该接口就不会再发送BPDU报文。-----激活该功能后,该接口还是可以收到BPDU报文,但是设备会忽略掉这个报文。

    • 注意:一旦边缘端口收到配置BPDU报文,就丧失了边缘端口属性,成为普通的STP端口,重新进行STP计算,引发网络震荡

改进点6---保护功能

BPDU保护

当交换机激活BPDU保护功能,如果边缘接口收到的BPDU报文,则交换机会将该接口关闭,同时发送日志进行告警。

image-20240529204437296

SW1接口配置边缘接口,开启BPDU保护,然后让SW2发送配置BPDU

[Huawei]stp bpdu-protection ---开启BPDU保护功能

结果导致SW1的接口被shutdown,默认交换机不会自动开启,需要网络管理员手工执行undo shutdown命令开启接口。

根保护

image-20230419032834318

原因:新加入的第三方设备SW4的BID小于SW1,因为STP的根网桥是可抢占的,所以会抢占根网桥角色,导致二层网络重新收敛,引发网络震荡。

根保护:当根网桥的指定接口激活根保护功能后,该接口如果收到更优的BPDU报文,会忽略这个BPDU报文,并将接口切换为丢弃状态

[Huawei-GigabitEthernet0/0/24]stp root-protection ---根保护功能只有在指定接口上激活才有效

当接口不再接受更优的BPDU报文,则一段时间(2*转发延迟)后,接口自动恢复到转发状态

环路保护

image-20230419033305693

一般交换机的根接口以及处于丢弃状态的替代接口都会出现这种情况

在网络正常时,接口持续接收BPDU报文,而当网络出现链路的单向故障或者网络拥塞等问题,这些接口无法正常接收BPDU报文,会导致交换机进行RSTP重新计算,接口角色和状态发生改变,给网络中引发环路。

  1. 根端口上激活环路保护功能

    • 如果该接口长时间没有收到BPDU报文,那么交换机会重新选举根端口并将该接口调整为指定接口。

    • 并且将接口的状态切换为丢弃。

  2. 给替代端口激活环路保护功能

    • 如果该接口长时间没有收到BPDU报文,那么交换机会将替代端口调整为指定接口。

    • 并且接口的状态切换为丢弃。

[Huawei-GigabitEthernet0/0/22]stp loop-protection ---开启环路保护

拓扑变更保护

image-20230419033949053

如果网络环境不稳定,导致TC BPDU频繁洪泛,又或者网络中存在攻击者,而攻击者发送大量的TC报文,那么交换机的性能将收到极大的消耗。

而激活拓扑变更保护后,将在单位时间内只进行一定次数的TC报文处理,如果超出这个次数上限,那么只会按照规定的次数进行处理,而对于超出的部分,需要等待一段时间处理

[Huawei]stp tc-protection ---开启拓扑变更保护功能,单位时间:2S;次数:1次

[Huawei]stp tc-protection threshold 2 ---修改单位时间内处理TC报文的次数

改进点7---拓扑变更机制改进

image-20230419030312788

  • SW3的根端口收不到根网桥发送的BPDU后,设备所有的接口启动一个计时器(TC TIME,时间为Hello Time的两倍,4S),并且清空本地所有端口学习到的MAC地址信息。然后向外发送TC标记位置为1的BPDU报文。

  • 一旦计时器超时,则本地停止发送BPDU报文。

  • 其他交换机收到该报文后,清空MAC地址表,启动计时器,向上游发送TC标记位置为1的BPDU报文。重复该过程。

MSTP---多实例生成树---802.1S

instance---实例---->一个或多个VLAN的集合

instance-ID---->12bit---->多个VLAN属于一个实例,基于实例来计算生成树。

instance 0---->该实例默认存在,并且所有VLAN都属于该实例。

在BID中,桥优先级只使用前4bit,而后12bit被称为扩展系统ID,用来携带实例ID信息,区分不同树发送的BPDU报文

MSTI---多生成树实例。--->MSTP基于实例创建一个MSTI,而每一个MSTI都是完全独立的

MSTP--->--->将一个二层网络划分为多个小的MST域。

  • 相同的域名

  • 相同的修订登记

  • 相同的VLAN和instance的映射关系

配置

image-20240602142617755

[sw1]stp enable 
[sw1]stp mode mstp 

[sw1]stp region-configuration   ---进入到MSTP域视图界面
[sw1-mst-region]region-name HCIP  ----默认名称为本地MAC地址
[sw1-mst-region]revision-level ?  ---修改修订等级,默认为0
  INTEGER<0-65535>  Revision level 
[sw1-mst-region]instance 1 vlan 2 to 10
[sw1-mst-region]instance 2 vlan 11 to 20
[sw1-mst-region]active region-configuration   ---激活配置


display stp region-configuration  ---查看STP协议配置内容

相关文章:

第八章,STP(生成树协议)

广播风暴----广播帧在二层环路中形成逆时针或顺时针的转动的环路&#xff0c;并且无限循环&#xff0c;最终导致设备宕机&#xff0c;网络瘫痪。 MAC地址表的翻摆&#xff08;漂移&#xff09;----同一个数据帧&#xff0c;顺时针接收后将记录MAC地址及接口的对应信息&#xff…...

《面向对象程序设计-C++》实验五 虚函数的使用及抽象类

程序片段编程题 1.【问题描述】 基类shape类是一个表示形状的抽象类&#xff0c;area( )为求图形面积的函数。请从shape类派生三角形类(triangle)、圆类&#xff08;circles&#xff09;、并给出具体的求面积函数。注&#xff1a;圆周率取3.14 #include<iostream> #in…...

PCIe - ZCU106(RC) + KU5P(EP) + 固化

目录 1. 简介 1.1 Data Mover 1.2 描述符 2. ZCU102 2.1 Ubuntu OS 2.2 USB Host 2.2.1 连接拓扑 2.2.2 设备类型 2.2.3 USB 跳帽设置 2.3 无线网卡 2.4 PCIe Info 2.4.1 Diagram 2.4.2 lspci -tv 2.4.3 lspci -v 2.4.2.1 设备基本信息 2.4.2.2 控制与状态寄存…...

网络编程核心技术解析:从Socket基础到实战开发

网络编程核心技术解析&#xff1a;从Socket基础到实战开发 一、Socket编程核心基础 1. 主机字节序与网络字节序&#xff1a;数据传输的统一语言 在计算机系统中&#xff0c;不同架构对多字节数据的存储顺序存在差异&#xff0c;而网络通信需要统一的字节序标准&#xff0c;这…...

SQL注入总结

一.sql注入 原理&#xff1a;当一个网站存在与用户交互的功能&#xff08;如登录表单、搜索框、评论区等&#xff09;&#xff0c;并且用户输入的数据未经充分过滤或转义&#xff0c;直接拼接到后台数据库查询语句中执行时&#xff0c;就可能引发SQL注入漏洞。攻击者可以通过构…...

conda 安装cudnn

通过 Conda 安装 cuDNN 确保你有 NVIDIA GPU 和 CUDA Toolkit&#xff1a;首先&#xff0c;确保你的系统上安装了 NVIDIA GPU 和 CUDA Toolkit。你可以通过运行以下命令来检查 CUDA 是否已安装&#xff1a;nvcc --version 如果没有安装 CUDA&#xff0c;你需要先从 NVIDIA CU…...

强啊!Oracle Database 23aiOracle Database 23ai:使用列别名进行分组排序!

大家好&#xff0c;这里是架构资源栈&#xff01;点击上方关注&#xff0c;添加“星标”&#xff0c;一起学习大厂前沿架构&#xff01; 从 Oracle Database 23ai 开始&#xff0c;您可以在 GROUP BY 和 HAVING 子句中直接使用列别名。此功能在早期版本的 Oracle Database 中不…...

RAG 2.0 深入解读

一、Introduction 过去一年可谓是RAG元年&#xff0c;检索增强生成技术迅速发展与深刻变革&#xff0c;其创新与应用已深刻重塑了大模型落地的技术范式。站在2025年&#xff0c;RAG不仅突破了早期文本处理的局限&#xff0c;更通过多模态融合、混合检索优化和语义鸿沟跨越等突…...

Excel Vlookup

VLOOKUP(A2, Sheet2!A:B, 2, 0) 代表的是检查A2,匹配源是sheet2表AB两列 Sheet2!A:B&#xff1a;指定要在其中查找数据的范围&#xff0c;这里是 Sheet12中的 A 列和 B 列&#xff0c;A 列是查找的依据列&#xff0c;B 列是要返回值的列。2&#xff1a;表示要返回查找区域中的…...

css媒体查询及css变量

媒体查询是 CSS 样式表最重要的功能之一&#xff0c;所谓媒体查询指的就是根据不同的媒体类型&#xff08;设备类型&#xff09;和条件来区分各种设备&#xff08;例如&#xff1a;电脑、手机、平板电脑、盲文设备等&#xff09;&#xff0c;并为它们分别定义不同的 CSS 样式。…...

CSS网格布局

网格布局将元素占用的空间划分为二维格子&#xff0c;下级元素放置在格子所在的位置上。划分格子的元素叫做网格容器&#xff0c;其 display 属性是 grid &#xff08;块元素&#xff09;或 inline-grid &#xff08;内联块元素&#xff09;。网格容器的下级元素叫做网格项。容…...

Windows远程连接MySQL报错,本地navicat能连接MySQL

一、报错 telnet 119.87.111.79 3306​​“无法打开到主机的连接。在端口 3306: 连接失败”​​ 表明无法通过 TCP 协议连接到目标服务器的 3306 端口。 二、目的 &#xff08;1&#xff09;​​Telnet 测试的目的​​ Telnet 仅用于测试 ​​TCP 端口是否开放​​&#xff…...

Github打不开怎么办?

国内无法打开github&#xff0c;使有watt toolkit一键加速即可打开。 加速器 加速器直接加速Github原站&#xff0c;在开发者使用或者需要登录账号时非常有效 Watt Toolkit&#xff08;原Steam&#xff09; 官网地址&#xff1a;Watt Toolkit 一、进入官网后&#xff0c;点…...

亿级流量系统架构设计与实战(四)

本章关键词 : 读 / 写分离 、 数据缓存 、 缓存更新 、 CQRS 、 数据分片 、 异步写。 高并发架构设计的要点 形成高并发系统的必要条件 高性能、高可用、可扩展。 高性能: 性能代表一个系统的并行处理能力,在同样的硬件设备条件下 , 性能越高 , 越能节约硬件资源。高可…...

Java基础问题——八股盛宴 | 3w字分享

目录 面向对象与面向过程的区别&#xff1f; Java面向对象有哪些特征&#xff0c;如何应用&#xff1f; 介绍下Java中的四种引用&#xff1f; Java中创建对象有几种方式&#xff1f; Java中的序列化和反序列化是什么&#xff1f; 什么是Java中不可变类&#xff1f; Java…...

保障企业的数据安全需要做什么?

守护企业数据安全&#xff0c;犹如构筑一座固若金汤的城堡&#xff0c;需要从技术壁垒、管理护城河、流程吊桥和人员守卫等多维度精心布局&#xff0c;打造环环相扣的立体防御体系。我们从以下关键项分析&#xff1a; 一、技术层面 数据加密 对敏感数据&#xff08;如客户信息、…...

Flutter开发IOS蓝牙APP的大坑

Core Bluetooth 框架限制&#xff1a;iOS 的 Core Bluetooth 框架存在限制&#xff0c;如果指定的特征配置同时允许通知&#xff08;Notifications&#xff09;和指示&#xff08;Indications&#xff09;&#xff0c;调用相关方法设置通知值时&#xff0c;默认仅会开启通知功能…...

LeetCode 解题思路 45(分割等和子集、最长有效括号)

解题思路&#xff1a; dp 数组的含义&#xff1a; 在数组中是否存在一个子集&#xff0c;其和为 i。递推公式&#xff1a; dp[i] | dp[i - num]。dp 数组初始化&#xff1a; dp[0] true。遍历顺序&#xff1a; 从大到小去遍历&#xff0c;从 i target 开始&#xff0c;直到 …...

AI Agent 入门指南:从 LLM 到智能体

AI. AI. AI. 最近耳朵里是不是总是被这些词轰炸&#xff1f;特别是“Agent”、“AI Agent”、“智能体”、“Agentic”…… 感觉一夜之间&#xff0c;AI 就从我们熟悉的聊天框里蹦出来&#xff0c;要拥有“独立思考”和“自主行动”的能力了&#xff1f; 说实话&#xff0c;一…...

高级java每日一道面试题-2025年5月02日-基础篇[反射篇-编码]-使用反射,获取Class对象

如果有遗漏,评论区告诉我进行补充 面试官: 编写代码通过三种方式&#xff08;类名.class、对象.getClass()、Class.forName()&#xff09;获取java.util.ArrayList的Class对象。 我回答: 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#…...

【bug】fused_bias_act_kernel.cu卡住没反应

简述 在推理人脸修复face restoration算法 GPEN的时候&#xff0c;发现有时候fused_bias_act_kernel.cu卡住没反应。 解决 清理下缓存&#xff0c;让程序自己再编译下...

小游戏(2)扫雷游戏

一、简述 鸽子的时间太长了&#xff0c;其实学完数组和函数就应该搞出来这个丐版的小游戏了&#xff0c;不耽误&#xff0c;反正总归是轮到了&#xff0c;嘻嘻。 二、依旧菜单\. 我们这里写的是一个丐版的扫雷游戏&#xff0c;难度就固定了&#xff0c;所以菜单写起来就是玩游…...

如何在vscode中set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`

1.打开工作区设置文件 在 VS Code 中通过文件 -> 首选项 -> 设置&#xff0c;接着在设置窗口的右上角点击打开设置&#xff08;JSON&#xff09;&#xff0c;这会打开settings.json文件。 2.添加环境变量设置 "terminal.integrated.env.linux": { "TF_EN…...

leetcode 24. 两两交换链表中的节点

题目描述 代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next…...

微调大模型如何准备数据集——常用数据集,Alpaca和ShareGPT

微调大模型如何准备数据集——常用数据集,Alpaca和ShareGPT 数据集准备常用数据集自定义数据集AlpacaShareGPT数据集准备 常用数据集 预训练数据集 Wiki Demo (en)RefinedWeb (en)RedPajama V2 (en)Wikipedia (en)Wikipedia (zh)Pile (en)...

使用Homebrew下载配置git和连接GitHub(Mac版)

本文详细介绍了在M系列Mac上安装Homebrew并配置Git的过程&#xff0c;包括git的下载、设置全局用户名和邮箱、生成SSH密钥、添加GitHubSSH密钥以及终端验证。这些步骤有助于用户顺利进行协同开发。 一、下载git 1、终端输入一下命令 brew install git2、这时下载完成 二、配…...

电子电器架构 --- 网关转发时延解析

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

shell-流程控制-循环-函数

1. 2. 3.获取当前目录下的普通文件的文件名作为变量列表打印输出 4.打印出下面语句中字符数不大于6的单词 rabbit is favorite to eat cabbage 5.Shell允许用户指定for语句的步长。当用户需要另外指定步长时 6.批量创建用户&#xff1a; 用户名以test开头&#xff0c;按数字序号…...

Paramiko 性能优化详解

1. 复用连接&#xff1a;减少 SSH 连接开销 SSH 连接的建立涉及 TCP 握手、密钥交换、身份认证等步骤&#xff0c;频繁创建连接会显著降低性能。复用连接是核心优化手段。 优化方法 手动创建 Transport 对象并复用通过同一 Transport 执行多种操作&#xff08;命令、SFTP、端…...

代码随想录图论part03

第十一章&#xff1a;图论part03 孤岛的总面积 &#xff08;深搜&#xff09; 代码随想录 孤岛问题&#xff1a;先处理边缘岛在处理孤岛 沉没孤岛 &#xff08;广搜&#xff09; 代码随想录 水流问题 代码随想录 目的&#xff1a;找水源 思路;逆向思考&#xff0c;找两…...

树上背包学习笔记

树上背包&#xff0c;顾名思义&#xff0c;就是在树上跑背包。每日顾名思义 Q&#xff1a;那么到底为什么要树上跑背包 dp 呢&#xff1f; A&#xff1a;因为我们到现在学的背包 dp 还是属于较浅的一类&#xff0c;什么 01 背包、完全背包还是多重背包&#xff0c;但是如果这…...

CPU:为什么Ryzen 7000系列处理器PCIe通道总数是28,而可用的通道数是24?

AMD Ryzen 7000系列&#xff08;Zen 4架构&#xff09;处理器的 28条PCIe 5.0通道 中&#xff0c;有 4条固定用于连接主板芯片组&#xff08;如X670/B650&#xff09;&#xff0c;剩余的 24条直接分配给用户设备。以下是具体分配逻辑&#xff1a; 1. PCIe通道的总分配 24条直连…...

OpenCV 图形API(80)图像与通道拼接函数-----仿射变换函数warpAffine()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 对图像应用仿射变换。 函数 warpAffine 使用指定的矩阵对源图像进行变换&#xff1a; dst ( x , y ) src ( M 11 x M 12 y M 13 , M 21 x M…...

巧记英语四级单词 Unit7-下【晓艳老师版】

navigate v. 航行&#xff0c;航空 那六扇门gatevibrate v.颤抖&#xff0c;抖动 男生早上起来看到六个文胸在那挂着&#xff0c;春心荡漾virtual a.事实上&#xff0c;实际上的 发音“龌龊”&#xff1b;通常lyvia prep.经过 a想成小乌龟&#xff0c;兔子想到河对面吃草&am…...

idea使用lombok错误,找不到符号,明明编译没问题,运行报错

lombok使用出现的问题 问题找不到方法 经常遇到这样的小伙伴看到这个是不是一头雾水&#xff0c;明明我编译没有我问题&#xff0c;运行就出现问题&#xff0c;真的很生气。 下面介绍解决这个问题的几种方法。 开启 annotation processing 开启之后重启&#xff0c;试试有…...

Transformer面经

请问你对Transformer有什么了解 简要回答的话可以这样&#xff1a; Transformer是一种基于自注意力机制的神经网络架构&#xff0c;它主要用于处理序列数据&#xff0c;如自然语言处理。 核心的组件有&#xff1a;自注意力机制&#xff08;计算序列中每个元素与其他元素的相…...

学习Python的第二天之网络爬虫

30岁程序员学习Python的第二天之网络爬虫的信息提取 BeautifulSoup库 地址&#xff1a;https://beautifulsoup.readthedocs.io/zh-cn/v4.4.0/ 1、BeautifulSoup4安装 在windows系统下通过管理员权限运行cmd窗口 运行pip install beautifulsoup4 测试实例 import requests…...

【基础】Python包管理工具uv使用教程

一、uv简介 uv 是由 Astral&#xff08;前身为 Basis&#xff09;团队开发的 Python 包安装器和解析器&#xff0c;完全使用 Rust 语言编写。与传统 Python 工具不同&#xff0c;uv 将多个工具的功能整合到一个高性能的解决方案中&#xff0c;旨在提供更现代、更高效的 Python…...

【十五】Mybatis动态SQL实现原理

Mybatis动态SQL实现原理 目录 Mybatis动态SQL实现原理 概述 动态 SQL 实现原理 总结 概述 每天日常开发都在使用mybatis&#xff0c;但是很多人并没有花心思去理解mybatis的实现原理&#xff0c;一直处于使用阶段&#xff0c;程序员的使命是改变世界&#xff0c;这一点可能…...

UE5 把翅膀动画额外创建动画蓝图并和角色绑定混合动画

把翅膀和角色合并,把翅膀绑在Spine_3上 在5.3内,需要LayerSetup指定骨骼才能使用混合...

Coding Practice,48天强训(30)

Topic 1&#xff1a;爱吃素&#xff08;素数性质&#xff09; 爱吃素 在强训25的第一题我总结过关于素数的几种判断方式&#xff0c;如果忘了可以回去看 第一次写我是这样写的 #include <bits/stdc.h> using namespace std;bool isPrime(long long &a, long long …...

华为私有协议Hybrid

实验top图 理论环节 1. 基本概念 Hybrid接口&#xff1a; 支持同时处理多个VLAN流量&#xff0c;且能针对不同VLAN配置是否携带标签&#xff08;Tagged/Untagged&#xff09;。 核心特性&#xff1a; 灵活控制数据帧的标签处理方式&#xff0c;适用于复杂网络场景。 2. 工作…...

神经网络之互动练习详解:从基础到拟合非线性数据

神经网络之互动练习详解&#xff1a;从基础到拟合非线性数据 在机器学习的世界里&#xff0c;神经网络是一种强大而神奇的工具&#xff0c;它可以帮助我们解决各种复杂的问题。今天&#xff0c;我们就通过一个有趣的互动练习&#xff0c;来深入了解神经网络的工作原理以及如何…...

遨游科普:2025年,三防平板有多智能?

在极端环境与复杂场景中&#xff0c;专业设备的可靠性始终是行业应用的核心命题。随着物联网、5G通信与边缘计算技术的深度融合&#xff0c;三防平板已突破传统“坚固耐用”的单一属性&#xff0c;进化为集多模通讯、智能感知与场景化扩展于一体的移动智能终端。 AORO P9000三防…...

基于C++的IOT网关和平台7:github项目ctGateway设备协议开发指南

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。 源码指引:github源码指引_初级代码游戏的博客-CSDN博客 系…...

yolov8中的python基础--模块导入篇

import语句有几种不同的写法&#xff0c;它们有不同的用途和优势。 1. 直接 import 语法 import module_name 用途 导入整个模块&#xff0c;使用时需要通过模块名访问其中的内容。 示例 import os print(os.listdir()) # 必须用 os. 前缀 适用场景 当需要频繁使用模块…...

26.2Linux中SPI的驱动实验(编程)_csdn

我尽量讲的更详细&#xff0c;为了关注我的粉丝&#xff01;&#xff01;&#xff01; 这里我们用到的是stm32mp157的板子&#xff0c;所以我们看一下SPI用到的引脚。 1、硬件原理图分析 SPI1_MOSI&#xff08;对应芯片引脚 SDA/SDI &#xff09;&#xff1a;主机输出从机输入…...

uv简单使用

通过uv创建项目和虚拟环境 初始化项目 uv init --package my-project 初始化一个名为 my-project 的新项目&#xff0c;并生成必要的文件结构。 创建虚拟环境 uv venv .venv 激活虚拟环境 # For Windows .venv\Scripts\activate# For macOS/Linux source .venv/bin/acti…...

扩增子分析|微生物生态网络稳定性评估之鲁棒性(Robustness)和易损性(Vulnerability)在R中实现

一、引言 周集中老师团队于2021年在Nature climate change发表的文章&#xff0c;阐述了网络稳定性评估的原理算法&#xff0c;并提供了完整的代码。自此对微生物生态网络的评估具有更全面的指标&#xff0c;自此网络稳定性的评估广受大家欢迎。本系列将介绍网络稳定性之鲁棒性…...

线性回归评价标准

In [1]: 12345 import numpy as npfrom sklearn.linear_model import LinearRegressionimport sklearn.datasets as datasets 12 ()diabetesdiabetes $$datasets.load_diabetes In [2]: Out[2]: {‘data’: array([[ 0.03807591,0.05068012,0.06169621,…,-0.00259226, 0.0…...