背景技术
生成树协议是一种二层管理协议,它通过有选择性地阻塞网络冗余链路来达到消除网络二层环路的目的,同时具备链路的备份功能。生成树协议随着网络的不断发展而不断更新换代。最初被广泛应用的是IEEE802.1D-1998STP(Spanning Tree Protocol,生成树协议),随后以它为基础产生了IEEE802.1wRSTP(Rapid Spanning Tree Protocol,快速生成树协议)、PVST(Per VLANSpanning Tree,每VLAN生成树)协议和IEEE802.1s MSTP(Multiple SpanningTree Protocol,多生成树协议)。
MSTP引入“域”的概念,将一个交换网络划分成多个域。每个域内计算出多个MSTI(Multiple Spanning Tree Instance,多生成树实例),形成多棵生成树,生成树之间彼此独立;在域间,MSTP利用CIST(Common and InternalSpanning Tree,公共和内部生成树)保证全网络拓扑结构的无环路存在。
运行生成树协议的设备之间,互相通告生成树协议消息,如BPDU(BridgeProtocol Data Unit,桥协议数据单元),其中携带有用于生成树计算的所有有用信息,设备根据这些信息进行比较计算,确定出端口角色,在整个网络内计算出具有唯一树根节点的无环路树形网络拓扑结构。
在MSTP的计算过程中,端口角色有根端口、指定端口、替换端口和阻塞端口等,其中:
根(root port)端口:通向根桥并提供转发通路的端口,负责向根桥方向转发数据;
指定端口(designated port):从树根指向树的叶子节点,提供下行转发通路的端口,负责向下游网段或设备转发数据;
替换(alternative port)端口:通向根桥,但只提供备份的阻塞端口为替换端口,当根端口被阻塞后,替换端口将成为新的根端口;
阻塞(backup port)端口:当开启了MSTP的同一台设备的两个端口互相连接时就存在一个环路,此时设备会阻塞端口ID较小的端口,而另外一个端口则处于转发状态,成为指定端口。阻塞端口是指定端口的备份端口。
所有网桥的MSTP角色都是通过生成树协议消息中携带的信息计算出来的,消息中携带的最重要的信息就是生成树的优先级向量,优先级向量的组成为:{根桥ID,根路径开销,指定桥ID,指定端口ID},其中各向量成员含义如下:
根桥ID:即根桥的标识,由根桥的优先级和MAC(Media Access Control,媒体访问控制)地址组成;
根路径开销:到根桥的总路径开销;
指定桥ID:即发送桥的标识,由指定桥的优先级和MAC地址组成;
指定端口ID:即指向下游设备的发送端口的标识,由指定端口的优先级和该端口的全局编号组成。
运行生成树协议的设备根据生成树协议计算生成树时所依据的优先级向量中除包括{根桥ID,根路径开销,指定桥ID,指定端口ID}以外,还在该向量的尾部加上接收端口ID,即,优先级向量的组成为:{根桥ID,根路径开销,指定桥ID,指定端口ID,接收端口ID}。
MSTP角色和端口角色的计算中涉及到的一些优先级向量包括:
消息优先级向量:由从生成树协议消息中接收的优先级向量,加上接收端口ID所构成的优先级向量;
端口优先级向量:端口优先级向量是随端口收到的消息优先级向量更新的:如果端口收到的消息优先级向量优于端口优先级向量,则将端口优先级向量更新为消息优先级向量;否则,端口优先级向量保持不变;
根路径优先级向量:根路径优先级向量由端口优先级向量计算得到,如果端口优先级向量来自同一域的网桥,根路径优先级向量的内部路径开销为端口优先级向量的内部根路径开销和端口路径开销之和;
桥优先级向量:桥优先级向量中的根桥ID和指定桥ID都是本桥ID,路径开销为0,指定端口ID和接收端口ID也全为0;
根优先级向量:根优先级向量是桥优先级向量和所有指定桥ID和本桥ID值不相同的根路径优先级向量的最优值;
指定优先级向量:端口的指定优先级向量由根优先级向量计算得到,将根优先级向量的指定桥ID替换为本桥ID,指定端口ID替换为自己的端口ID。
如图1所示,假定设备1的桥ID为A,设备2的桥ID为C,设备3的桥ID为D;且各设备的端口ID分别为Px(比如设备1的Port1的端口ID为P1,设备2的Port2的端口ID为P2,以此类推),各端口的路径开销都为1。生成树的最终计算结果为:设备1是整个网络中的树根,根桥ID为A,端口Port1、Port3和Port5都为指定端口,设备2的Port2和设备3的Port4为根端口,设备3的Port6为阻塞备份链路的替换端口。设备2的根优先级向量为{A,1,A,P1,P2},设备3的根优先级向量为{A,2,C,P3,P4}。
Port1发送的优先级向量为{A,0,A,P1},Port2的端口优先级向量为{A,0,A,P1,P2},接收自设备1;Port3发送的优先级向量为{A,1,C,P3},设备3的Port4的端口优先级向量为{A,1,C,P3,P4},接收自设备2;Port5发送的优先级向量为{A,1,C,P5},Port6的端口优先级向量为{A,1,C,P5,P6},接收自设备2。端口Port2、Port4和Port6的端口优先级向量要靠其上游设备周期持续发送的生成树协议消息(BPDU)来保活,以保持生成树拓扑的稳定。
如果设备1运行的是堆叠系统或在主备倒换的操作过程中,整机设备的桥MAC地址变小,新的桥ID在整个网络中是最优的,则生成树协议重新计算的端口角色不会发生变化,也就不会引起拓扑震荡。但如果根桥设备的桥MAC地址变大,则因为直连的下游桥设备2接收不到原根桥(桥ID为A)的生成树协议消息,因此在接收超时的时候会触发一次拓扑震荡。
如图2所示,当根桥设备1的桥MAC地址变大,例如桥ID从A变为B(A优于B)后,设备1的端口Port1周期性地发出以B为根桥的BPDU,其中携带有优先级向量{B,0,B,P1}。但由于设备2的Port2持有更优的端口优先级向量{A,0,A,P1,P2},因此接收到携带有{B,0,B,P1}的BPDU后会被认为是低优先级消息被丢弃。当Port2的端口优先级向量超时老化后(原根桥A已不存在,不再向下游桥发送保活消息),设备2的3个端口Port2、Port3和Port5会分别向外发出以自己为根桥的BPDU,其中携带有优先级向量{C,0,C,P2|P3|P5},这样就出现了一次拓扑重新计算的震荡过程。
根桥设备的桥MAC地址变大,但新的桥ID仍然是网络中最优的桥ID的情况下,引起下游设备的拓扑震荡,重新计算出的端口角色不会发生变化,因此这种拓扑震荡是不必要的。
具体实施方式
本发明实施例提供了一种网络拓扑计算方法,可以在以下情况时避免网络拓扑震荡的发生:根桥设备的桥MAC地址变大而导致根桥ID变更,但变更后的根桥ID仍然是网络中最优的桥ID。
下面对本发明实施例进行详细描述。
本发明实施例中,在生成树网络中的每个设备上,当本设备的桥MAC地址变大时,执行以下操作:
-组装桥ID变化消息,并从本设备的指定端口(designated port)向本设备的下游设备发送该桥ID变化消息。该桥ID变化消息中携带桥MAC地址变更前的桥ID以及桥MAC地址变更后的桥ID。为描述方便,以下将桥ID变化消息表示为{老桥ID,新桥ID},其中,老桥ID即为桥MAC地址变更前的桥ID,新桥ID即为桥MAC地址变更后的桥ID。
-根据新桥ID更新生成树协议的优先级向量,包括本设备的桥优先级向量和各端口的端口优先级向量。其中,根据新桥ID更新优先级向量的操作具体为:用本设备的新桥ID替换优先级向量中本设备的老桥ID。
-触发协议生成树拓扑计算,根据生成树协议计算结果,从指定端口发送生成树协议消息,该生成树协议消息中携带的优先级向量中的本设备的桥ID为新桥ID。
进一步的,为保证桥ID变化消息的可靠性,当设备在感知自身的桥MAC地址变大时立即发送桥ID变化消息之后,当发送生成树协议消息的时间到达时,可在发送生成树协议消息之前,重新发送桥ID变化消息。重新发送桥ID消息的次数可根据需要设定,比如,在本设备桥MAC地址变大后的连续N(N≥1,可预先设定)个生成树协议消息发送周期,每当发送生成树协议消息的时间到达时,在发送生成树协议消息之前,重新发送桥ID变化消息。优选的,N=1,这样既可以保证桥ID变化消息的可靠传输,又不会造成太多网络开销。
当设备接收到上游设备发送的桥ID变化消息后,执行以下操作:
-从本设备的指定端口转发接收到的桥ID变化消息。需要说明的是,如果接收到桥ID变化消息的设备是生成树上的叶子节点,由于该设备上没有指定端口,因此不再转发接收到的桥ID变化消息。
-从接收到的桥ID变化消息中解析出老桥ID和新桥ID,用该新桥ID更新本设备各端口的端口优先级向量。其中,用新桥ID更新优先级向量的操作具体为:用新桥ID替换各端口持有的端口优先级向量中与该老桥ID相同的桥ID。
-触发协议生成树拓扑计算,根据生成树协议计算结果,从本设备的指定端口发送生成树协议消息。
进一步的,各端口的指定优先级向量可在协议生成树拓扑计算后更新,可以不用在收到桥ID变化消息后立即更新。
上述过程中,设备在计算端口角色时,可依据现有生成树协议进行计算。具体的,可依次比较端口收到的优先级向量和该端口的端口优先级向量中的各向量成员,并以数值小为优,若端口优先级向量优于接收到的优先级向量,则忽略接收到的优先级向量,否则,用接收到的优先级向量更新接收端口的端口优先级向量,重新计算设备的根优先级向量并重新计算每个端口的角色。若端口接收到的BPDU来自同一个指定桥(对端的发送桥),则认为是收到较优的BPDU。具有最优根优先级向量的BPDU来源的接收端口被计算为通向根桥的根端口,其它也收到包含根优先级向量的BPDU的端口计算为替换端口,即通向根桥的备份链路。
若发生桥ID变更的设备为根桥设备,当根桥设备的下游网络中的设备收到生成树协议消息后,一方面,由于该下游网络中的设备之前已经根据接收到的桥ID变化消息更新了各端口的端口优先级向量,即,各端口的端口优先级向量中的老桥ID更新为新桥ID,另一方面,由于新桥ID仍为网络中最优的桥ID,因此该设备所接收到的生成树协议消息中的优先级向量与该设备的接收端口的端口优先级向量相匹配,因此该接收端口的端口角色不变,设备重置端口优先级向量的老化定时器,以保活该端口的端口优先级向量,进而不会因该端口的端口优先级向量的老化定时器超时而引起网络拓扑震荡。
考虑到发生桥ID变更的设备的下游网络中存在冗余备份链路,则有可能发生包含有老桥ID的生成树协议消息绕圈的拓扑震荡,本发明实施例还针对该问题提供了解决方案。
下面结合图2、图3A和图3B,说明采用现有方式进行网络拓扑计算时,包含有老桥ID的生成树协议消息绕圈的拓扑震荡过程。
如图2所示,设备1的桥ID从A变为B(A优于B)后,设备1从指定端口发送包含有{B,0,B,P1}的BPDU;由于设备2的Port2的端口优先级向量{A,0,A,P1,P2},因此接收到携带有{B,0,B,P1}的BPDU后会被认为是低优先级消息被丢弃。
如图3A所示,当Port2的端口优先级向量超时老化后,设备2的3个端口Port2、Port3和Port5会分别向外发出以自己为根桥的BPDU,其中携带有优先级向量{C,0,C,P2|P3|P5}。假如设备3的Port6先收到设备2发送的包含有{C,0,C,P5}的BPDU,因端口Port6上持有的以桥ID A为根桥的端口优先级向量{A,2,C,P5,P6}也来自发送桥C,结果Port6的端口优先级向量被更新为{C,0,C,P5,P6}。
如图3B所示,因端口Port4持有的以桥ID A为根桥的端口优先级向量{A,1,C,P3,P4}还未老化,根据生成树协议计算比较Port6没有Port4优,结果Port4仍然是根端口,Port6计算成了指定端口,并向外传播以桥ID A为根桥的BPDU,其中携带{A,2,D,P6}。而设备2的Port5收到此较优的以根桥ID A为根的BPDU之后,又会计算为根端口,并从其它端口传播以根桥ID A为根的BPDU。设备3的Port4在收到这个以根桥ID A为根的BPDU后,因为与本端口持有的端口优先级向量来自同一个发送桥C,其接收端口优先级向量会被更新。结果Port4计算为根端口,其端口优先级向量为{A,3,C,P3,P4}。
可以看出,因优先级向量传播多经过了一个设备,端口的路径开销增加了,这样就出现了以根桥ID A为根的BPDU残留在网络中并绕圈传播,结果引起网络拓扑的震荡(生成树的端口角色变化),直到以根桥ID A为根的优先级向量被老化。
同样,如果是设备2的桥ID发生变化(桥ID没有原来的优),例如设备2的MAC地址变大,在其下游网络中也会引起类似的拓扑震荡或包含有老桥ID的BPDU绕圈问题(优先级向量中的指定桥ID变化)。
为避免传输链路上滞留有老桥ID的BPDU带来的影响,本发明实施例在上述桥ID更新通知机制的基础上,还采用了以下处理机制:
当设备感知到本设备的桥MAC地址变大后,后续又收到了包含有老桥ID的BPDU,则丢弃此消息,并向此消息的接收端口再次发送桥ID变化消息,其中携带本设备变更前的桥ID和变更后的桥ID:{老桥ID,新桥ID}。
当设备接收到上游设备发送的桥ID变化消息后,记录下该消息中携带的老桥ID和新桥ID以及此桥ID变化消息的接收来源端口,并对该条记录启动一的老化定时器。该老化定时器的定时时长至少是1秒(因为协议的基准tick是1秒),优选的,大于一个BPDU的发送间隔,最好为两倍BPDU的发送间隔。在该老化定时器的计时期间,如果该设备收到了BPDU,并从其中携带的优先级向量中解析出的桥ID与该老化定时器所对应的记录条目中的老桥ID相同,则丢弃此消息。进一步的,如果该BPDU的接收端口不是包含该老桥ID的桥ID变化消息的来源端口,则再次从该BPDU的接收端口发送桥ID变化消息,其中携带该老桥ID以及对应的新桥ID。
为了更清楚的说明本发明实施例的具体实现过程,下面结合具体应用场景对本发明实施例进行详细说明。
仍以图1所示的网络拓扑组网为例,当设备1的桥MAC地址变大,设备1的桥ID从A变为B(A优于B),但桥ID B仍为网络中的最优桥ID的情况下,其网络拓扑计算过程可包括:
如图4A和图4B所示,设备1从其指定端口Port1发送桥ID变化消息,以指示桥ID由A变为了B,然后设备1将本设备的桥优先级向量从{A,0,A,0,0}更新为{B,0,B,0,0},根据桥ID B更新本设备端口优先级向量,设备1根据生成树协议进行生成树计算,并根据新根优先级向量{B,0,B,0,0}从指定端口Port1发送携带有优先级向量{B,0,B,P1}的BPDU。生成树的具体计算方法可采用现有技术实现。
设备2从其根端口Port2接收到设备1发送的桥ID变化消息后,从其指定端口Port3和Port5转发该桥ID变化消息。设备2从接收到的桥ID变化消息中解析出老桥ID为桥ID A、新桥ID为桥ID B后,用桥ID B替换各端口(包括根端口Port2以及指定端口Port3、Port5)持有的端口优先级向量中的桥ID A,其中,Port2的端口优先级向量从{A,0,A,P1,P2}更新为{B,0,B,P1,P2},然后,设备2根据生成树协议进行计算,由于桥ID B仍为网络中最优的桥ID,因此计算得到的根优先级向量{B,1,B,P1,P2}中的根桥ID为桥ID B,Port3、Prot5仍为指定端口;设备2根据计算出的根优先级向量从指定端口Port3和Port5分别发送BPDU,其中,从Port3发送的BPDU中携带的优先级向量为{B,1,C,P3},从Port5发送的BPDU中携带的优先级向量为{B,1,C,P5}。
其后,当设备2的根端口Port2收到设备1发送的携带有{B,0,B,P1}的BPDU时,由于Port2持有的端口优先级向量中已经将桥ID A替换为桥ID B,Port2接收到的优先级向量与Port2持有的端口优先级向量相匹配,因此会认为收到的是重复发送的BPDU,即用于保活生成树的BPDU,设备2重置Port2的优先级向量的保活时间,因而Port2的优先级向量不会被超时老化,进而设备2不会生成以自己为根桥的BPDU并向外发送,因此也就不会引起拓扑震荡。
同理,当最下游的设备3的根端口Port4接收到桥ID变化消息后,从接收到的桥ID变化消息中解析出老桥ID为桥ID A、新桥ID为桥ID B后,用桥ID B替换各端口(包括根端口Port4和阻塞端口Port6)持有的端口优先级向量中的桥ID A,其中,Port4的端口优先级向量从{A,1,C,P3,P4}更新为{B,1,C,P3,P4},并根据生成树协议进行计算,计算结果为Port4仍为根端口。其后,当设备3的根端口Port4收到设备2发来的携带有{B,1,C,P3}的BPDU后,由于Port4当前持有的端口优先级向量中已经将桥ID A替换为桥ID B,Port4接收到的优先级向量与Port4当前持有的端口优先级向量相匹配,因此设备3重置Port4的优先级向量的保活时间,因而Port4的优先级向量不会被超时老化,进而设备3不会生成以自己为根桥的BPDU并向外发送,因此也就不会引起拓扑震荡。
同理,当设备2的MAC地址变大时,则设备2从其指定端口发送桥ID变化消息,触发本设备和其下游设备更新优先级向量中的桥ID的过程,具体处理流程与上述流程类似,在此不再详述。在设备2的MAC地址变大,但变更后的桥ID仍优于设备3的桥ID,设备1的桥ID仍优于设备2变更后的桥ID的情况下,也就是说,在中间设备的桥ID变劣,但仍优于其下游设备桥ID的情况下,基于与上述实施例相同的原理,不会引起网络拓扑震荡。
本发明实施例中,桥ID变化消息的编码和携带方式,可以采用独立的消息报文格式,也可以借用现有协议标准定义的消息报文内容编码格式。
以CIST实例为例,其MSTP消息的消息格式可如图5所示,其中CIST消息部分第5个字节的Flag字段,按目前协议标准的规定不会发出取值为0的标记。
本发明实施例中,设备间可以协定,当CIST实例的Flag字段为0时,此消息表示是根桥ID变化消息。其中第6-13字节的CIST的根桥ID表示变更前的根桥ID,而18-25字节的CIST域根桥ID表示变更后的桥ID,对于其它字段值接收端可以不处理。使用CIST实例的Flag字段来表示根桥ID变化消息,可以同时适用于RSTP和MSTP生成树协议拓扑网络。
通过以上描述可以看出,运行生成树协议的设备在自己的桥MAC地址变大(新桥ID没有原桥ID优)时,从本设备的各指定端口发送桥ID变化消息以通知下游网络设备该桥ID已发生变化。下游设备接收到桥ID变化消息后,继续向下游设备传播此桥ID变化消息,然后自己用新桥ID替换各端口的优先级向量中对应的老桥ID,并重新进行生成树角色计算。这样,对于根桥的桥MAC地址发生变化的情况来说,如果新根桥ID仍是整个网络中最优的桥ID,则不会发生因端口角色变化所导致的拓扑震荡。
基于相同的技术构思,本发明实施例还提供了一种网络设备,该网络设备运行了生成树协议。
参见图6所示,为本发明实施例提供的网络设备的结构示意图。该设备可包括:桥ID变化通知模块61、优先级向量更新模块62、生成树协议模块63,其中:
桥ID变化通知模块61,用于在本设备的桥ID因本设备的桥MAC地址变大而变更时,从本设备的指定端口向下游设备发送桥ID变化消息,其中携带有本设备变更前和变更后的桥ID;以及,接收上游设备发送的桥ID变化消息,并从本设备的指定端口发送所述桥ID变化消息;
优先级向量更新模块62,用于在本设备的桥ID因本设备的桥MAC地址变大而变更时,根据变更后的桥ID更新本设备的桥优先级向量和各端口的端口优先级向量;以及,在接收到上游设备发送的桥ID变化消息后,根据所述桥ID变化消息中携带的变更后的桥ID更新本设备各端口的端口优先级向量;
生成树协议模块63,用于在优先级向量更新模块62更新优先级向量后,进行生成树计算,并根据计算结果从本设备的指定端口发送生成树协议消息;其中,若本设备的桥ID发生变更,则所述生成树协议消息中携带的优先级向量中本设备的桥ID为本设备变更后的桥ID。
进一步的,生成树协议模块63还用于:根据设定次数,当生成树协议消息发送周期到达时,先指示桥ID变化通知模块61发送所述桥ID变化消息,再从指定端口发送生成树协议消息。相应的,桥ID变化通知模块61根据生成树协议模块63的指示发送所述桥ID变化消息。
进一步的,生成树协议模块63还用于:在桥ID变更通知模块61从本设备的指定端口向下游设备发送桥ID变化消息之后,若接收到生成树协议消息,并解析出该生成树协议消息携带的优先级向量中的桥ID与本设备变更前的桥ID相同,则丢弃所述生成树协议消息,并指示桥ID变化通知模块61从该生成树协议消息的接收端口发送所述桥ID变化消息。相应的,桥ID变化通知模块61还根据生成树协议模块63的指示发送桥ID变化消息。
进一步的,桥ID变化通知模块61还用于:在接收到上游设备发送的桥ID变化消息后,记录所述桥ID变化消息中携带的变更前和变更后的桥ID以及所述桥ID变化消息的接收端口,并对应该条记录启动老化定时器。相应的,生成树协议模块63还用于:若在所述老化定时器计时时间内,接收到生成树协议消息,并解析出该生成树协议消息携带的优先级向量中的桥ID与对应记录中的变更前的桥ID相同,则丢弃该生成树协议消息,并指示桥ID通知模块61从所述生成树协议消息的接收端口发送桥ID变化消息,其中包含对应记录中的变更前的桥ID和变更后的桥ID。相应的,桥ID变化通知模块61还根据生成树协议模块63的指示发送桥ID变化消息。
优选的,所述老化定时器的计时时长为:大于或等于1个生成树协议消息的发送间隔,并且小于或等于2个生成树协议消息的发送间隔。
具体的,优先级向量更新模块62具体用于:当本设备的桥ID变更时,用本设备变更后的桥ID替换本设备的桥优先级向量中本设备变更前的桥ID,用本设备变更后的桥ID替换本设备各端口的端口优先级向量中本设备变更前的桥ID;当接收到上游设备发送的桥ID变化消息后,解析出所述桥ID变化消息中携带的变更前和变更后的桥ID,将本设备各端口的端口优先级向量中与解析出的变更前的桥ID相同的桥ID,替换为解析出的变更后的桥ID。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台终端设备(可以是手机,个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视本发明的保护范围。