生成树数据怎么做工作赚钱 生成树技术原理讲解


STP生成树协议

指定桥(Designated Bridge):在每个网段中,到根桥(Root Bridge)的路径开销的(lowest Root Path Cost)桥将成为指定桥(Designated Bridge),数据包将通过它转发到网段。一旦所有的交换机具有相同的根路径开销(Root Path Cost),那么具有的桥标志级数的(lowest Bridge Identifier)交换机才会被定为指定桥(De signated Bridge)。

为了提高网络可靠性,交换机网络中通常会使用冗余链路,冗余链路会给交换机带来环路风险,并导致 广播风暴 以及 MAC地址表不稳定 等问题,生成树协议STP(Spanning Tree Protocol)可以在提高可靠性的同时又避免环路带来的各种问题。

生成树数据怎么做工作赚钱 生成树技术原理讲解生成树数据怎么做工作赚钱 生成树技术原理讲解


生成树数据怎么做工作赚钱 生成树技术原理讲解


生成树协议的标准是IEEE802.1b。运行生成树算法的网桥/交换机在规定的间隔 (默认2秒)内通过网桥协议数据单元(BPDU)的组播帧与其他交换机交换配置信息 ,其工作的过程如下:

根据交换机的转发原则, 如果交换机从一个端口上接收到的是一个广播帧, 或者是一个目的MAC地址未知的单播帧,则会将这个帧向除源端口之外的所有其他端口转发。如果交换网络中有环路,则这个帧会被无限转发,此时便会形成广播风暴,网络中也会充斥着重复的数据帧。

printf("请输入顶点向量:n");

STP的主要作用: 利用生成树算法、在以太网络中,创建一个以某台交换机的某个端口为根的生成树,自动地在逻辑上阻塞一个或多个冗余端口,避免环路。

STP的基本工作原理为:通过 BPDU (Bridge Protocol Data Unit,桥接协议数据单元)的交互来传递STP计算所需要的条件,随后根据特定的算法,阻塞特定端口,从而得到无环的树形拓扑。

为了计算生成树, 交换机之间需要交换相关的信息和参数, 这些信息和参数被封装在BPDU(Bridge Protocol Data Unit) 中。

BPDU有两种类型:配置BPDU和TCN BPDU(拓扑变更BPDU)。

STP中根桥的选举依据的是桥ID, STP中的每个交换机都会有一个桥ID(Bridge ID) 。 桥ID由16位的桥优先级(Bridge Priority) 和48位的MAC地址构成。 在STP网络中, 桥优先级是可以配置的, 取值范围是0~65535, 默认值为32768。 优先级的设备(数值越小越优先) 会被选举为根桥。 如果优先级相同, 则会比较MAC地址, MAC地址越小则越优先 。

非根交换机在选举根端口时分别依据该端口的 根路径开销、 对端BID(Bridge ID) 、 对端PID(Port ID) 和本端PID。

如果有两个或两个以上的端口计算得到的累计路径开销相同,那么选择收到发送者BID最小的那个端口作为根端口。

运行STP交换机的每个端口都有一个端口ID,端口ID由端口优先级和端口号构成。端口优先级取值范围是0到240,步长为16,即取值必须为16的整数倍。缺省情况下,端口优先级是128。端口ID(Port ID)可以用来确定端口角色,值小者优先。

在网段上抑制其他端口(无论是自己的还是其他设备的)发送BPDU报文的端口,就是该网段的指定端口。

根桥的每个端口总是指定端口。

根端口相对应的端口(即与根端口直连的端口)皆为指定端口。

指定端口的选举也是首先比较累计路径开销,累计路径开销最小的端口就是指定端口。如果累计路径开销相同,则比较端口所在交换机的桥ID,所在桥ID最小的端口被选举为指定端口。如果通过累计路径开销和所在桥ID选举不出来,则比较端口ID,端口ID最小的被选举为指定端口。(同根端口选举)

1、 Forwarding:转发状态。 端口既可转发用户流量也可转发BPDU报文, 只有根端口或指定端口才能进入Forwarding状态。

2、 Learning:学习状态。 端口可根据收到的用户流量构建MAC地址表,但不转发用户流量。 增加Learning状态是为了防止临时环路。

4、 Blocking:阻塞状态。 端口仅仅能接收并处理BPDU, 不能转发BPDU, 也不能转发用户流量。 此状态是预备端口的最终状态。

5、 Disabled:禁用状态。 端口既不处理和转发BPDU报文, 也不转发用户流量。

在稳定的STP拓扑里, 非根桥会定期收到来自根桥的BPDU报文。如果根桥发生了故障,停止发送BPDU报文,下游交换机就无法收到来自根桥的BPDU报文。如果下游交换机一直收不到BPDU报文,Max Age定时器就会超时(Max Age的默认值为20秒),从而导致已经收到的BPDU报文失效,此时,非根交换机会互相发送配置BPDU报文,重新选举新的根桥。根桥故障会导致50秒左右的恢复时间,恢复时间约等于Max Age加上两倍的Forward Delay收敛时间。

1、SWA和SWB使用了两条链路互连,其中一条是主用链路,另外一条是备份链路。生成树正常收敛之后,如果SWB检测到根端口的链路发生物理故障,则其Alternate端口会迁移到Listening、Learning、Forwarding状态,经过两倍的Forward Delay后恢复到转发状态。

2、SWB经过集线器与SWA通过两条链路互连,当主用链路故障时,SWB尚未检测到信号丢失,因此保持原状态不变,但是,根端口已经无法收到来至根桥的BPDU报文,经过T=Max_Age-Message_Age 时间后,原BPDU报文过期,SWB的Alternate端口会迁移到Listening、Learning、Forwarding状态, 经过两倍的Forward Delay后恢复到转发状态。因此,链路经过2xForward_Time + (Max_Age-Message_Age)时间后恢复。

SWB与SWA之间的链路发生了某种故障(非物理层故障),SWB因此一直收不到来自SWA的BPDU报文。 等待Max Age定时器超时后,SWB会认为根桥SWA不再有效,并认为自己是根桥,于是开始发送自己的BPDU报文给SWC,通知SWC自己作为新的根桥。在此期间,由于SWC的Alternate端口再也不能收到包含原根桥ID的BPDU报文。其Max Age定时器超时后,SWC会切换Alternate端口为指定端口并且转发来自其根端口的BPDU报文给SWB。所以,Max Age定时器超时后,SWB、SWC几乎同时会收到对方发来的BPDU。 经过STP重新计算后,SWB放弃宣称自己是根桥并重新确定端口角色。非直连链路故障后,由于需要等待Max Age加上两倍的Forward Delay时间,端口需要大约50秒才能恢复到转发状态。

实验拓扑如上图所示,PCA的IP地址为2.2.2.1/24,PCB的IP地址配置为2.2.2.2/24。

由于网络中存在环路,此时可以看到交换机的所有互联端口以及连接主机的端口的指示灯均快速闪动,表示形成了广播风暴。此时PCA 无法ping通PCB。

在SW1上通过命令stp mode配置生成树协议的模式为RSTP,通过命令stp enable在交换机上使能生成树协议。

SW2、SW3、SW4的配置和SW1相同。启用生成树协议后可以看到交换机各端口指示灯停止快速闪动,网络恢复正常。此时PCA可以ping通PCB。

通过命令display stp brief可以查看交换机各端口的STP状态以及端口角色:

由上可以看出各交换机的根端口为连接SW3的端口,SW3不存在根端口,说明SW3即为网络中的根桥。

2中已知SW3为现根桥,我们可以通过以下命令指定根桥:

该配置将SW1设置为根桥,将SW2设置为备份根桥,我们也可以通过更改桥优先级控制根桥的选举,将SW3的优先级修改为8192,SW2的优先级修改为4096。

查看STP信息:

可以看到,SW2已成为新的根桥。

步骤3后,SW3的GigabitEthernet0/0/3端口为根端口,与根桥SW2互联,端口优先级默认为128,数值越大优先级越小。

注意:此处是修改SW2的端口优先级,而不是修改SW3的端口优先级。

SW3的GigabitEthernet0/0/6端口成为了根端口。

SW4的GigabitEthernet0/0/3为替代端口,SW1的GigabitEthernet0/0/3为指定端口,修改SW1端口GigabitEthernet0/0/2路径开销为2000000。

查看当前端口角色信息。

STP能够提供无环网络,但是收敛速度较慢。如果STP网络的拓扑结构频繁变化,网络也会随之频繁失去连通性,从而导致用户通信频繁中断。快速生成树协议RSTP使用了Proal/Agreement机制保证链路及时协商,从而有效避免收敛计时器在生成树收敛前超时。

RSTP的端口角色共有4种: 根端口、指定端口、Alternate端口和Backup端口。

Alternate端口:由于学习到其它网桥发送的更优配置BPDU报文而阻塞的端口;作为根端口的备份端口。

Backup端口:由于学习到自己发送的更优配置BPDU报文而阻塞的端口;作为指定端口的备份端口。

Discarding状态 , 端口既不转发用户流量也不学习MAC地址。

Learning状态 , 端口不转发用户流量但是学习MAC地址。

Forwarding状态 , 端口既转发用户流量又学习MAC地址。

RSTP收敛遵循STP基本原理。网络初始化时,网络中所有的RSTP交换机都认为自己时“根桥”,并设置每个端口为指定端口,此时,端口为Discarding状态。

每个认为自己是“根桥” 的交换机生成一个RST BPDU报文来协商指定网段的端口状态,此RST BPDU报文的Flags字段里面的Proal位需要置位。当一个端口收到RST BPDU报文时,此端口会比较收到的RST BPDU报文和本地的RST BPDU报文。如果本地的RST BPDU报文优于接收的RST BPDU报文,则端口会丢弃接收的RST BPDU报文,并发送Proal置位的本地RST BPDU报文来回复对端设备。

当确认下游指定端口迁移到Discarding状态后,设备发送RST BPDU报文回复上游交换机发送的Proal消息。在此过程中,端口已经确认为根端口,因此RST BPDU报文Flags字段里面设置了Agreement标记位和根端口角色。

在P/A进程的阶段,上游交换机收到Agreement置位的RST BPDU报文后,指定端口立即从Discarding状态迁移为Forwarding状态,然后,下游网段开始使用同样的P/A进程协商端口角色。

首先,RSTP将网络拓扑的变化定义为端口角色的变化,因为网络拓扑的变化可以描述为某些网络端口在转发/阻塞态之间的转换,而RSTP将端口角色和端口状态进行了明确的定义(这是RSTP比STP优胜的地方)。

其次,RSTP端口角色的变化直接影响端口状态的变化。R-Port、D-Port、Edge Port处于Forwarding状态;Alternated Port(以下简称A-Port)和Backup Port处于Discarding状态。

若某条链路失效,即链路两端的端口从转发态变为阻塞态。从生成树协议的目的来看,并不会使得网络形成环路。RSTP仅需要找到处于合适的阻塞态端口,并将其转为转发态,使拓扑重新连通起来。由于RSTP在计算时已经分配好R-Port的备份端口A-Port,因此若从转发态变为阻塞态的是R-Port,则把对应的A-Port改为转发态;同理,D-Port的则色也可置相应的Backup Port为转发来实现。而Edge Port并不影响生成树的计算,故忽略。这样,当某个(些)端口状态从转发到阻塞,对于RSTP而言,无需重新计算(是不是有点熟悉,好像哪儿见过不用计算直接使用备用路径的算法。聪明的你一定想到了:DUAL)。

由于某条链路的连通有可能导致生成树域成环。在RSTP里,该行为定义为D-Port从阻塞态转化为转发态,相对的检查机制应的就是P/A机制,即从需要进入转发态的D-Port,建议对端进行同步,待收到确认后进入转发态。

对端Bridge在接收到“建议”消息后,一方面阻塞自身所有D-Port,并返回“同意”消息给“建议”消息发送方;另一方面,对自身端口进行同步。同步分两种类型:若端口为E-Port,或者原来就是非转发态,则为“已同步”;若端口原来为转发态,为重新进入转发态,将对对端进行“建议”并等待确认。

下面将结合图例,演示P/A机制的流程:

1、B、E之间建立一条新链路,首先进行端口角色选择;

2、B、E通过该链路交换BPDU,由于B端口发送的BPDU较优(superior),因此B端口角色为D-Port;与此同时,E从B收到的BPDU比从C收到的较优,因此E把连接B的端口转换为Root Port,同时,连接C的端口转换为A-Port。要注意的是,RSTP相对STP进行了根端口转发的改进,一旦确定了旧的R-Port非转发态,且新的R-Port已确定,则新的R-Port立即进入转发态;

3、此刻B端口仍为Discarding状态,并期望进入Forwarding状态,因此它将从该D-Port发送“Proal“置位的配置BPDU给E;E接收到该BPDU后,进入同步状态:即将所有转发态端口转为丢弃,并检查端口同步情况;

4、从同步原理可知,E中只有连接D的端口为转发态,因此E继续阻塞该端口,并向B返回”同意“置位的BPDU。自此,B-E链路进入已完成同步,立即进行流量转发;而由于D连接E的端口为A-Port,不转发BPDU,因此E发出的”Proal“置位BPDU将不会被”Agreement“置位的BPDU回应。该端口将一直保持阻塞态。

实验拓扑如上图所示,交换机各端口均属于VLAN1,PCA的IP地址为2.2.2.1/24,PCB的IP地址配置为2.2.2.2/24。

测试SW2和SW3的连通性:

查看SW2的端口角色

SW2的GigabitEthernet0/0/3为根端口,用ping测试S1到S2的连通性20次。

提示:SW2执行ping作之后立刻关闭SW3的GigabitEthernet0/0/3接口。

查看SW2的端口角色

SW2的GigabitEthernet0/0/6 成为根端口,端口进入FORWARDING状态,1个包超时。

在SW1上通过命令stp mode配置生成树协议的模式为RSTP,通过命令stp enable在交换机上使能生成树协议。

配置SW2为STP生成树,其他配置保持不变。

SW2的GigabitEthernet0/0/3为根端口,用ping测试S1到S2的连通性30次。

提示:SW2执行ping作之后立刻关闭SW3的GigabitEthernet0/0/3接口。

查看SW2端口信息

SW2的GigabitEthernet0/0/6 成为根端口,端口进入FORWARDING状态,16个包超时。

RSTP兼容STP,但收敛方式以STP模式运行。

不管是STP还是RSTP,在网络中进行生成树计算的时候都没有考虑到VLAN的情况。它们都是对单一生成树实例进行应用的。也就是说,在STP和RSTP中所有的VLAN都共享相同的生成树。

为了解决这一个问题,思科提出了第二代生成树 - PVST、PVST+。按照PVST协议规定,每一个VLAN都有一个生成树,而且是每隔2秒就会发送一个BPDU,这对于一个有着上千万个VLAN网络来说,一方面这么多生成树维护起来比较困难,另一方面,为每个VLAN每隔2秒就发送一个BPDU,交换机也是难以承受的。

为了解决PVST带来的困难,思科又提出了第三代生成树 - MST(MSTP)多生成树协议。MSTP可以对网络中众多的VLAN进行分组,把VLAN分到组里。这里的组就是后面讲的MST实例(Instance)。每个实例一个生成树,BPDU只对实例进行发送。这样就达到了负载均衡。

多生成树协议MSTP(Multiple Spanning Tree Protocol)是IEEE 802.1s中定义的一种新型生成树协议。简单说来,STP/RSTP是基于端口的,PVST+是基于VLAN的,而MSTP是基于实例的。与STP/RSTP和PVST+相比,MSTP中引入了“实例”(Instance)和“域”(Region) “的概念。

所谓“实例”就是多个VLAN的一个,这种通过多个VLAN捆绑到一个实例中去的方法可以节省通信开销和资源占用率。MSTP各个实例拓扑的计算是的,在这些实例上就可以实现负载均衡。使用的时候,可以把多个相同拓扑结构的VLAN映射到某一个实例中,这些VLAN在端口上的转发状态将取决于对应实例在MSTP里的转发状态。

所谓“域”,即MST域(MST Region),由域名(Configuration Name)、修订级别(Revision Ll)、格式选择器(Configuration Identifier Format Selector)、VLAN与实例的映射关系(mapping of VIDs to spanning trees),其中域名、格式选择器和修订级别在BPDU报文中都有相关字段,而VLAN与实例的映射关系在BPDU报文中表现摘要信息(Configuration Digest),该摘要是根据映射关系计算得到的一个16字节签名。只有上述四者都一样且相互连接的交换机才认为在同一个域内。如上图所示,每个域内所有交换机都有相同的MST域配置(具有相同的域名;具有相同的VLAN到生成树实例映射配置;具有相同的MSTP修订级别配置)。缺省时,域名就是交换机的桥MAC地址,修订级别等于0,格式选择器等于0,所有的VLAN都映射到实例0上。

MSTP的实例0具有特殊的作用,称为CIST(Common Internal Spanning Tree),即公共与内部生成树,其他的实例称为MSTI(Multiple Spanning Tree Instance),即多生成树实例。CIST由通过STP/RSTP计算得到的单生成树和MSTP计算得到的域组成,是为了保证在所有桥接的局域网是简单的和全连接的。CST(Common Spanning Tree)是STP/RSTP也是MSTP计算出的用于连接MST域的单生成树。IST(Internal Spanning Tree)是在一个给定的MST域内由CIST提供的连通性。如上图所示,如果把每个MST域看作是一个“交换机”,CST就是这些“交换机”通过STP/RSTP或者MSTP协议计算生成的一棵生成树。IST是CIST在MST域内的片段,是一个特殊的多生成树实例。

与STP和RSTP相比,MSTP中引入了总根和域根的概念。总根是一个全局概念,对于所有互连的运行STP/RSTP/MSTP的交换机只能有一个总根,也即是CIST的根;而域根是一个局部概念,是相对于某个域的某个实例而言的。上图所示,所有相连的设备,总根只有一个,而每个域所包含的域根数目与实例个数相关。

与STP和RSTP相比,MSTP中引入了外部路径开销和内部路径开销的概念。外部路径开销是相对于CIST而言的,同一个域内外部路径开销是相同的;内部路径开销是域内相对于某个实例而言的,同一端口对于不同实例对应不同的内部路径开销。

与STP和RSTP相比,MSTP中引入了域边缘端口和Master端口的概念。域边缘端口是连接不同MST域、MST域和运行STP的区域、MST域和运行RSTP的区域的端口,位于MST域的边缘;在某个不包含总根的域中,Master端口是所有边界端口中,到达总根具有最小开销的端口,也就是连接MST域到总根的端口,位于整个域到总根的最短路径上;Alternate端口是Master端口的备份端口,如果Master端口被阻塞后,Alternate端口将成为新的Master端口。

MSTP协议在计算生成树时使用的算法和原理与STP/RSTP大同小异,只是因为在MSTP中引入了域和内部路径开销等参数,故MSTP中的优先级向量是7维,而STP/RSTP是5维。

STP/RSTP中的优先级向量是:

{根桥标识符,根路径开销,桥标识符, 发送BPDU报文端口标识符, 接收BPDU报文端口标识符}

MSTP中的优先级向量是:

{CIST根桥标识符,CIST外部根路径开销,CIST域根标识符,CIST内部根路径开销,CIST指定桥标识符,CIST指定端口标识符,CIST接收端口标识符}

其中STP/RSTP中的桥标识符实际上是发送BPDU的设备的标识符,与MSTP中的CIST指定桥标识符对应。MSTP中的CIST域根标识符有两种情况,一种是总根所在域内,BPDU报文中该字段是参考总根的标识符,另一种情况是不包含总根的域中,BPDU报文该字段是参考主设备的标识符。运行MSTP的实体初始化时认为自己是总根、域根,通过交互配置消息,按照上面介绍的7维向量计算CIST生成树和MSTI。

网络中的设备发送接受BPDU报文,在经过比较配置消息后,在整个网络中选择一个优先级的交换机作为CIST的树根。在每个MST域内MSTP通过计算生成IST;同时MSTP将每个MST域作为单台交换机对待,通过计算在MST域间生成CST。如前所述,CST和IST构成了整个交换机网络的CIST。

在MST域内,MSTP根据VLAN和生成树实例的映射关系,针对不同的VLAN生成不同的生成树实例。每棵生成树进行计算,计算过程与STP/RSTP计算生成树的过程类似。

MSTI的特点:

MSTP拓扑变化处理与RSTP拓扑变化处理过程类似。

在RSTP中检测拓扑是否发生变化只有一个标准:一个非边缘端口迁移到Forwarding状态。

定义VLAN1-10属于INSTANCE 1,VLAN11-20属于INSTANCE 2。

配置SW3在实例2中的优先级为4096,在实例1中的优先级为8192。

查看实例1和实例2的状态

SW2为实例1的根桥,SW3为实例2的根桥。

查看MSTP实例1的端口角色

实例1中SW2为根网桥,SW1的VLAN 1到VLAN10的用户经过GigabitEthernet0/0/1 接口和SW2、 SW3、 SW4的VLAN 1到VLAN10的用户通讯。

局域网中,生成树的工作原理是什么?

for(i=0;i生成树的工作原理:

·通过比较网桥优先级选取根网桥(给定广播域内只有一个根网桥)。

·其余的非根网桥只有一个通向根交换机的端口称为根端口。

·每最小生成树的权值之和为 37个网段只有一个转发端口。

·根交换机所有的连接端口均为转发端口。

注意:生成树协议在交换机上一般是默认开启的,不经人工干预即可正常工作。但 这种自动生成的方案可}}能导致数据传输的路径并非化。因此,可以通过人工设 置网桥优先级的方法影响生成树的生成结果。

数据结构的“图的生成树”是如何定义的?

minedge[i].enex=minedge[k].enex;

生成树定义:

设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个 T(G) 和 B(G)。其中 T(G)是遍历图时所经过的//输入并赋值有路径的边的,B(G) 是遍历图时未经过的边的。显然,G1(V, T) 是图 G 的极小连通子图,即子图G1 是连通图 G 的生成树。

最小生成树 :

给定一个无向网络,在该网的所有生成树中,使得各边权数之和最小的那棵生成树称为该网的最小生成树。

深度优先生成森林:

连通图的生成树不一定是的,不同的遍历图的方法得到不同的生成树;从不同的顶点出发可得到不同的生成树。

连通图本身就是连通分量,其中顶点集+遍历经过的边=生成树。

非连通图的生成森林不一定是的。

非连通图各个连通分量的顶点集+遍历时经过的边=若干颗生成树(生成3、 Listening:侦听状态。 端口可以转发BPDU报文, 但不能转发用户流量。森林)

一个连通图的生成树是一个极小连通子图,它含有图中全部顶点,但只有足以构成一棵树的n-1条边。

交换机生成树协议的工作原理

将SW2的端口GigabitEthernet0/0/3端口优先级设置为32,GigabitEthernet0/0/6端口优int lowcost;先级设置为16:

交换机生成树协议基本原理 如下:

距离子图的最近顶点为 8

生成树协议的基本原理非常简单,自然界生长的树是不会出现环路的,如果网络也能够像一棵树一样的生长就不会出现环路,因此STP协议中定义了根桥、根端口、指定端口、路径开销等概念,目的就在于通过构造一棵自然树的方法达到剪裁冗余环路的目的,同时实现链路备份和路径化。

为了实现这些功能交换机之间就必须进行一些信息交流,这些信息交流单元成为配置消息,为二层报文数据区携带了用于生成树计算的所有有用信息,所有支持STP协议的交换机都会接收并处理收到的BPD

生成树协议选举的过程

//起始初始化

生成树协议是一种桥嵌套协议,在IEEE 802.1d规范里定义,可以用来消除桥回路。它的工作原理是这样的:生成树协议定义了一个数据包,叫做桥协议数据单元BPDU(Bridge Protocol Datac交换机的每个端口都有一个 端口开销 (Port Cost) 参数, 此参数表示该端口在STP中的开销值。 默认情况下端口的开销和端口的带宽有关,带宽越高,开销越小。从一个非根桥到达根桥的路径可能有多条,每一条路径都有一个总的开销值,此开销值是该路径上所有接收BPDU端口的端口开销总和(即BPDU的入方向端口),称为路径开销。非根桥通过对比多条路径的路径开销,选出到达根桥的最短路径,这条最短路径的路径开销被称为 RPC (Root Path Cost, 根路径开销),并生成无环树状网络。 根桥的根路径开销是0。urrentmin=minedge[i].lowcost; Unit)。网桥用BPDU来相互通信,并用BPDU的相关机能来动态选择根桥和备份桥。但是因为从中心桥到任何网段只有一个路径存在,所以桥回路被消除。

在一个生成树环境里,桥不会立即开始转发功能,它们必须首先选择一个桥为根桥,然后建立一个指定路径。在一个网络里边拥有桥ID的将变成一个根桥,全部的生成树网络里面只有一个根桥。根桥的主要职责是定期发送配置信息,然后这种配置信息将会被所有的指定桥发送。这在生成树网络里面是一种机制,一旦网络结构发生变化,网络状态将会重新配置。

当选定根桥之后,在转发数据包之前,它们必须决定每一个网段的指定桥,运用生成树的这种算法,根桥每隔2秒钟从它所有的端口发送BPDU包,BPDU包被所有的桥从它们的根端口过来,根端口是接根桥的那些桥端口。BPDU包括的信息叫做端口的COST,网络分配端口的COST到所有的桥端口,当根桥发送BPDU的时候,根桥设置它的端口值为零。然后沿着这条路径,下一个桥增加它的配置端口COST为一个值,这个值是它接收和转发数据包到下一个网段的值。这样每一个桥都增加它的端口的COST值为它所接收的BPDU的包的COST值,所有的桥都检测它们的端口的COST值,拥有端口的COST值的桥就变为了指定的桥。拥有比较高端口COST值的桥置它的端口进入阻塞状态,变为了备份桥。在阻塞状态,一个桥停止了转发,但是它会继续接收和处理BPDU数据包。

数据结构(十):最小生成树

k=i;

最小生成树是带权无向连通图中权值最小的生成树,根据 图 中生成树定义可知, 个顶点的连通图中,生成树中边的个数为 ,向生成树中添加任意一条边,则会形成环。生成树存在多种,其中权值之和最小的生成树即为最小生成树。

若 为最小生成树 kruskal 算法中使用 getEdgesFromAdjacencyList 函数完成邻接表向边的转换,函数内部存在两层循环,访问邻接表中每个顶点的相邻顶点,复杂度为 。使用对边进行排序,时间复杂度为 ,因为 ,所以时间复杂度可以表述为 。 kruskal 算法中 while 循环取最小权值边,并对边的两个顶点执行 origin 函数判断是否属于同一个子图,时间复杂度为 。所以 kruskal 算法的时间复杂度为 。的一个真子集,即 的顶点和边都是 的顶点和边的子集,构造最小生成树过程为向 中添加顶点和边,添加的原则有两种:

kruskal 算法即为上述种原则,通过选择图中的最小权值边来构造最小生成树,过程中需要注意避免形成环。

step 1:

最小权值边为顶点 7、8 形成的边

step 2:

最小权值边为顶点 3、9 形成的边

step 3:

最小权值边为顶点 6、7 形成的边

step 4:

最小权值边为顶点 3、6 形成的边

step 5:

最小权值边为顶点 1、2 形成的边

step 6:

最小权值边为顶点 3、4 形成的边

step 7:

最小权值边为顶点 1、8 形成的边

step 8:

最小权值边为顶点 4、5 形成的边

这里使用邻接表作为图的存储结构

这里使用 getEdgesFromAdjacencyList 函数完成邻接表到边的转换,使用 sort 完成对边的排序,使用 origin 函数返回每个子图的根。

该函数返回顶点 index 所属子图的根顶点,其中 verts[index] 位置上存储的是顶点 index 的上一个顶点,每个子图中,根顶点的上一个顶点为自身。

kruskal 算法的过程为不断对子图进行合并,直到形成最终的最小生成树。 prim 算法的过程则是只存在一个子图,不断选择顶点加入到该子图中,即通过对子图进行扩张,直到形成最终的最小生成树。

step 1:

step 2:

距离子图的最近顶点为 3

step 3:

距离子图的最近顶点为 9

step 4:

距离子图的最近顶点为 6

step 5:

距离子图的最近顶点为 7

step 6:

step 7:

距离子图的最近顶点为 2

step 8:

距离在SW3上查看端口角色:子图的最近顶点为 1

这里使用邻接表作为图的存储结构

这里使用 verts 列表存储每个顶点元素,每个元素包括两个属性, index 为顶点下标, weight 为顶点距离子图的大小。算法中使用 vertsIndex 列表存储每个顶点元素在 verts 列表中的下标位置。使用 heapSort 堆排序对每个顶点到子图的距离进行排序,即对 verts 列表进行排序,使用堆排序内的 transformToHeap 函数调整 verts 列表为小顶堆。当添加新顶点到子图后,使用 updateVerts 函数完成对相邻顶点的距离更新。

当 verts 列表调整为小顶堆之后,将列表首、尾元素交换,则列表尾元素即为距离子图最近的顶点元素。

对每一个相邻顶点,如果不在子图中,则判断是否更新到子图的距离。更新距离后的 while 循环作,目的为调整堆结构为小顶堆。

prim 算法中构造顶点列表的时间复杂度为 。使用堆排序对顶点列表进行排序,时间复杂度为 。 prim 算法中 while 循环取最近顶点元素,并调整元素取出后列表的堆结构,所以调整复杂度为 ;同时,循环结构内执行 updateVerts 函数,更新每个取出顶点的相邻顶点距离值,所以更新顶点数为 ,因为每个顶点更新距离后,需要调整堆结构为小顶堆,所以更新复杂度为 。所以 prim 算法的总时间复杂度为 。

生成树算法

配置SW2在实例1中的优先级为4096, 在实例2中的优先级为8192。

“生成树”资料

交换机内的生成树算法(STA)使你可以创建一条备用链路(当网络中存在多台交换机时)。在主链路正常工作时,备用链路处于空闲状态(不工作);只有在主链路出现问题时,备用链路才不需要任何人工干预自动地接替主链路。

这种自动重构的功能,使得网络上的用户能够限度地与网络保持正常的连接。生成树算法较复杂,所以,建议在充分研究理解其之后,再更改其一些设置。请仔细阅读并理解下述内容之后,再去更改交换机上的生成树的默认设置。

网络环路的侦测和预防(Network loop detection and prntion):任何两个局域网之间应该只有一条路径,否则,网络中将出现环路。如果存在着多于一条的路径,那么生成树算法将会侦测到环路的发生,并自动选择开销值(c ost)的那条路径作为可使用的路径(主链路),而阻断其它路径,将它们作为备用路径(备用链路)。

自动拓扑重构(Automatic topology re-configuration):当主链路出现故障时,生成树算法将自动启用备用链路,重构网络结构。

生成树的级别(STA 查看SW2端口角色信息Operation Lls)

生成树有两种工作级别:桥级别(bridge ll)和端口级别(port ll)。在桥一级上,生成树算法为每台交换机计算桥的标志级数(Bridge Identifier),然后设定根桥(Root Bridge)和指定桥(Designated Bridges)。而在端口一级上,生成树算法设定根端口(Root Port)和指定端口(Designated Ports)。详述如下:

在桥一级上(On the Bridge Ll):

根桥(Root Bridge):具有最小桥标志级数的(lowest Bridge Identifier)交换机是根桥(Root Bridge)。当然,你希望根桥是环路中所有交换机当中的一台(交换机),以保证能够提供的网络性能和可靠性。

桥标志级数(Bridge Identifier):桥标志级数是桥的优先级(Bridge Priority)和交换机的MAC地址的综合数值,其中桥的优先级(Bridge Priority)是一个你可以设定的参数。例如,“4 00 80 C8 00 01 00”中的“4”是桥的优先级,“00 80 C8 00 01 00”是交换机的MAC地址。交换机的桥标志级数越低,则交换机的优先级越高,这样可以增加其成为根桥的可能性。

根路径开销(Root Path Cost):一台交换机的根路径开销(Root Path Cost)是根端口(Root Port)的路径开销(Path Cost)与数据包经过的所有交换机的根路径开销(Root Path Cost)之和。根桥(Root Bridge)的根路径开销(Root Path Cost)是零。

桥的优先级(Bridge Priority):是一个用户可以设定的参数。设定的值越小,优先级越高。交换机具有越高的优先级,才越有可能成为根桥。

在端口一级上(On the Port Ll):

根端口(Root Port):每台交换机都有一个根端口(Root Port),这个端口到根桥的路径开销。一旦多个端口具有相同的到根桥的路径开销时,那么具有的端口标志级别的才会成为根端口。

指定端口(Designated Port):指定端口就是指定桥(Designated Bridge)上的端口。

端口优先级(Port Priority):数值越小,端口的优先级就越高。具有越高端口优先级,才越有可能成为根端口。

路径开销(Path Cost):这是一个可变的参数,它将随着生成树中的设定值的变化而变化。依据S距离子图的最近顶点为 4TA的默认参数值,每个1000Mbps网段有一个指定的路径开销值为4 ,100Mbps网段的路径开销值19,10Mbps网段的路径开销值100.

生成树参数(STA Parameters)

生成树的参数用户可以根据自己的需要进行修改,但是建议使用出厂时的默认设置。除非确实需要对出厂设置值进行变动时,再去改动默认值。用户可以改动的生成树参数有如下几个:

桥优先级(Bridge Priority):数值范围从0到65535.“0”的优先级。

呼叫时间(Bridge Hello Time):数值范围从1秒到10秒。是指根桥向其它所有交换机发出BPDU数据包的时间间隔,以告知其它所有交换机它是根桥。如果你的交换机还未是根桥时为其设置了呼叫时间,那么,一旦你的交换机成为根桥,该呼叫时间就会派上用处。

注意:呼叫时间不能大于桥的老化时间(Max. Age),否则,将出现错误信息。

的桥老化时间(Bridge Max. Age):数值范围从6秒到40秒。如果在超出老化时间之后,还没有收到根桥发出的BPDU数据包,那么,在允许的条件下你的交换机将充当根桥向其它所有的交换机发出B PDU数据包。如果交换机确实具有最小的桥标志级数,那么,它将随之成为根桥。

桥转发时延(Bridge Forward Delay):数值范围从4秒到30秒。是指交换机的端口从阻塞状态转为转发状态所用的时间。

当你欲变动生成树参数时,请一定记住下述公式:

的桥老化时间≤ 2 x(桥转发时延 – 1秒)

即:Max. Age ≤ 2 x (Forward Delay - 1 second)

的桥老化时间≥ 2 x(呼叫时间 + 1秒)

即:Max. Age ≥ 2 x (Hello Time + 1 second)

端口优先级(Port Priority):数值范围从0到255.数值越小,那么该端口越可能成为根端口。

生成树协议的结构思路

temp=minedge[i].lowcost;

生成树协议拓扑结构的思路是: 不论网桥(交换机)之间采用怎样物理联接,网桥(交换机)能够自动发现一个没有环路的拓扑结构的网路,这个逻辑拓扑结构的网路必须是树型的。生成树协议还能够确定有足够的连接通向整个网络的每一个部分。所有网络要么进入转发状态,要么进入阻塞状态,这样就建立了整个局域网的生成树。当首次连接网桥或者网络结构发生变化时,网桥都将进行生成树拓扑的重新计算。为稳定的生成树拓扑结构选择一个根桥, 从一点传输数据到另一点, 出现两条以上条路径时只能选择一条距离根桥最短的活动路径。生成树协议这样的控制机制可以协调多个网桥(交换机)共同工作, 使计算机网络可以避免因为一个接点的失败导致整个网络联接功能的丢失, 而且冗余设计的网络环路不会出现广播风暴。

SW2、SW3、S网络收敛后,只有指定端口和根端口可以转发数据。其他端口为预备端口,被阻塞,不能转发数据,只能够从所连网段的指定交换机接收到BPDU报文,并以此来监视链路的状态。W4的配置和SW1相同。

数据结构中关于最小生成树的步骤

if(G.arcs[i][j]==0&&i!=j)

#includeG.arcs[i][j]=0;

#include

#define INFINITY 100000//相当于无穷大

#define MAX_VERTEX_NUM 20//最多能有多少个点

//邻接矩阵图

typedef struct{

char vexs[MAX_VERTEX_NUM];

int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

int vexnum,arcnum;

}MGraph;

//保存路径起始点,终点,以及权值

typedef struct{

int adjvex;

int enex;

}closedge[MAX_VERTEX_NUM];

//创建邻接矩阵

void CreateUDN(MGraph &G);

//找到输入字符对应的数字

int LocateVex(MGraph G,char v);

//输出邻接矩阵图

void PrintUDN(MGraph G);

//找出最小生成树

void MiniSpanTree_PRIM(MGraph G,closedge &minedge);

//输出最小生成树的每条边的起点,终点和权值

void PrintMinEdge(MGraph G,closedge minedge);

int main()

{MGraph G;

closedge minedge;

CreateUDN(G);

printf("该图的邻接矩阵存储示意图如下:n");

PrintUDN(G);

printf("n");

MiniSpanTree_PRIM(G,minedge);

printf("该图生成树的边如下:n");

PrintMinEdge(G,minedge);

printf("n");

return 0;

}//创建邻接矩阵

void CreateUDN(MGraph &G)

{int i,j;

char vex1,vex2;//起点,终点字符

int vex1Index,vex2Index;//字符对应的数字

int weight;

char ch;

printf("请输入有多少个顶点,多少条边:n");

scanf("%d%d",&G.vexnum,&G.arcnum);

scanf("%s",G.vexs);

//初始化都为0

for(i=0;i

for(j=0;j

printf("请输入所有边的起点,终点和权值:n");

for(i=0;i

{while((ch=getchar())!='n'); //吸收换行符

scanf("%c%c",&vex1,&vex2);

scanf("%d",&weight);

vex1Index=LocateVex(G,vex1);

vex2Index=LocateVex(G,vex2);

G.arcs[vex1Index][vex2Index]=G.arcs[vex2Index][vex1Index]=weight;

}//剩下没路径的(当然不包括自己到自己)赋值无穷大

for(i=0;i

{for(j=0;j

{G.arcs[i][j]=INFINITY;

}//将输入的字符转换成对应的数字(A-0,B-1,...)

int LocateVex(MGraph G,char v)

{int i;

for(i=0;i

if(v==G.vexs[i])

return i;

}//输出对应矩阵

void PrintUDN(MGraph G)

{int i,j;

for(i=0;i<=G.vexnum;i++)

{for(j=0;j<=G.vexnum;j++)

{if(i==0&&j==0)

printf("t");

else if(i==0)

{printf("%ct",G.vexs[j-1]);

}else if(j==0)

{printf("%ct",G.vexs[i-1]);

}else

{if(G.arcs[i-1][j-1]==INFINITY)

printf("∞t");

else

printf("%dt",G.arcs[i-1][j-1]);

printf("n");

//生成最小生成树(实则就是记录最小路径的起点,终点,权值)

void MiniSpanTree_PRIM(MGraph G,closedge &minedge)

{int i,j,k,z;

int temp;

int currentmin;

k=0;

for(j=1;j

{minedge[j-1].adjvex=k;

minedge[j-1].enex=j;

minedge[j-1].lowcost=G.arcs[k][j];

}//找最小路径

{//找个路径最短的可达点

for(j=如此,网络中就会产生RST BPDU的泛洪。i+1;j

{if(minedge[j].lowcost

{currentmin=minedge[j].lowcost;

k=j;

//做相应作

{temp=minedge[i].adjvex;

minedge[i].adjvex=minedge[k].adjvex;

minedge[k].adjvex=temp;

temp=minedge[i].enex;

minedge[k].enex=temp;

minedge[i].lowcost=minedge[k].lowcost;

minedge[k].lowcost=temp;

}//依次找后面的可达最小路径

for(j=i+1;j

{z=minedge[i].enex;

k=minedge[j].enex;

if(k!=z)

{if(G.arcs[z][k]

{minedge[j].adjvex=z;

minedge[j].lowcost=G.arcs[z][k];

}//输出最小生成树

void PrintMinEdge(MGraph G,closedge minedge)

{int i;

for(i=0;i

printf("%c%ct%dn",G.vexs[minedge[i].adjvex],G.vexs[minedge[i].enex],minedge[i].lowcost);

}

比较典型的是Prim算法和Kruskal算法。

jrj

怎么参加打歌舞台比赛赚钱(怎么参加唱歌节目)
上一篇
怎么成为雪板经销商赚钱 初学者如何使用
下一篇
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 836084111@qq.com ,一经查实,本站将立刻删除。

相关推荐