首页 > 编程语言 >生成树、生成树工作原理、生成树算法、BPDU及生成树应用实例

生成树、生成树工作原理、生成树算法、BPDU及生成树应用实例

时间:2022-08-16 15:57:44浏览次数:61  
标签:BPDU 实例 端口 生成 交换机 网桥 ID

一、网络环路问题

当网络中存在物理环路时,会导致广播风暴,会产生巨大的网络流量,极其容易造成交换机死机

如下图所示,有两台交换机A、B,交换机A的0/3端口连接MAC地址为11的客户端,交换机B的0/3端口连接MAC地址为22的客户端,交换机A的0/1端口和交换机B的0/2端口相连,从而使11和22可以通信。但是如果此时交换机A和B相连的这根线断了怎么办呢?所以为了防止网络失效,我们在交换机A和B之间再连一根线,用交换机A的0/2端口连接交换机B的0/1端口,从而达到冗余备份的效果。

但是直接这么连的话,会有一个问题。比如11要给22发送数据,我们知道交换机会学习维护一个MAC地址表,此时交换机A学到 11 和 0/3 的一个对应关系,因为此时交换机A中的MAC地址表中没有目的地址,所以这个数据会广播给交换机A的所有端口。 当从交换机A的0/1端口出去时,此时交换机B会学到 11 和 0/2 的一个对应关系,因为没有目的地址,然后交换机B也会执行广播,把数据发给他的所有端口,最终这个数据又从A的0/2端口回到了交换机A,此时交换机A又学到了11 和 0/2的一个对应关系。

当从交换机A的0/2端口出去时,此时交换机B会学到 11 和 0/1 的一个对应关系,因为没有目的地址,然后交换机B也会执行广播,把数据发给他的所有端口,最终这个数据又从A的0/1端口回到了交换机A,此时交换机A又学到了11 和 0/1的一个对应关系。

最后在这两个交换机之间形成了2个圈,这个圈就被叫做网络环路。这个网络环路会永远不停的在交换机内部之间进行运转,直到交换机死机为止。

 

 

 我们可以看到网络环路是必须要解决的问题,当网络中存在物理环路时,会导致广播风暴,会产生巨大的网络流量,极其容易造成交换机死机。如下图所示:

 

 

二、生成树协议及工作原理

生成树协议可以解决上述网络环路问题。生成树协议: Spanning-Tree Protocal ,简称STP。

STP工作原理

如下图所示,三个交换机之间两两相连,很明显这个网络存在网络环路问题。生成树是如何防止环路发生的呢?

1、把某一条链路的某一个端口逻辑上down掉,从逻辑上断开环路,从而避免环路发生,注意这里只是在逻辑上down掉端口,并没有真正的把线拔掉

 

2、 当任意一条主链路发生故障时(主链路即交换机A和B,B和C之间的线),断开的端口将被自动激活,恢复通信,从而起到冗余备份的作用。

 

 

 这就是生成树的工作原理,总结如下:

1、某一条链路的某一个端口逻辑上down掉,从逻辑上断开环路,从而避免环路发生

2、当任意一条主链路发生故障时(,断开的端口将被自动激活,恢复通信,从而起到冗余备份的作用。

 

 

 

三、STP算法

 

在生成树中,我们要down掉哪条链路的哪个端口呢?总不能随便去down,生成树通过生成树算法来决定down掉哪个端口。

 

STP将一个环形网络生成无环拓扑结构需要三步:

1、选择根网桥(root bridge),网桥其实就是交换机,即选择根交换机

2、选择根端口(root ports)

3、选择指定端口(designated ports)

 

1、选择根网桥

每台交换机都有一个ID,交换机ID被称为BID,每个交换机的BID都是唯一的,所以不可能发生冲突,交换机之间选择BID值最小的交换机作为网络中的根网桥。BID是由2字节的交换机优先级和6字节的交换机MAC地址组成的,华为的交换机优先级取值范围为0-61440,默认值为32768,我们在给交换机配置优先级时,不能随便配,所配的优先级数字必须能被2整除,且必须是16的整倍数,且最小值为4096,例如配成4096,8192 等。选择根网桥时,先比较网桥优先级大小,在比较网桥MAC地址大小。

 

如下图所示,我们可以看出,应该选择交换机SWA为根网桥。

 

 

2、选择根端口

首先我们要明白,根端口并不在根交换机上,根端口是指用来从根交换机那里接收信息的端口。在网络中,除了根网桥以外,所有的其他交换机都是非跟网桥,所以根端口就在非根网桥上。选择根端口也分为4步:

 @1:最低的到达根网桥的路径开销

根路径成本:是非根网桥到根网桥的路径上所有链路的成本之和。如下图所示,交换机B到根网桥交换机A的根路径成本是19,交换机C到B的根路径成本是100,那么交换机C到A的根路径成本就是119。而根路径成本是根据网络的带宽来决定的,带宽越高,根路径成本越低,带宽越低,根路径成本越高,如下图所示:

 

 

 在下图例子中,我们看到交换机之间的带宽都是100M,所以他们的根路径成本都是19,在选择根端口时,交换机C右边端口的根路径成本为19+19=38,而交换机C左边端口的根路径成本为19。所以我们可以直接选择出非根网桥B、C上的根端口。

 

 

 

@2:最低的发送方网桥ID

当根路径成本一样时,我们没办法直接选择出根端口。如下图所示:交换机A为根网桥,B为非根网桥,带宽都是100M,此时B上的两个端口到A的根路径成本都是19,此时就需要根据最低的发送方网桥ID来判断。但是现在对于交换机B来讲,A就是发送方,两条链路的发送方都是A,所以我们也无法根据发送方网桥ID来选,此时就要看第三步了。

 

 

@3:最低的端口优先级

什么是端口优先级呢?类似于交换机有自己的BID,端口也有自己的PID,端口PID由8位的端口优先级和8位的端口编号组成。每一个端口都有一个自己的PID值。端口优先级的取值范围是0-240,默认值是128。可以选择最低的端口优先级作为根端口。但是如上题所示,如果交换机B的配置都是默认的,那么交换机B的两个端口优先级都是128,此时还没办法选出根端口,这时就要看第4步。

 

 

@4:发送方最低的端口ID

如果端口优先级是默认的128,端口编号是E/0/0/1,那么在计算端口ID时,是以小数点的形式计算的,这个的端口ID就是128.1,E/0/0/22的端口ID就是128.22。所以在上边那个题中,如果前三步都一样,我们此时要选择发送方最低的端口ID,对于交换机B来说,A是发送方,A的两个端口中,我们看谁的端口ID比较低,然后选择较低端口对端的B上的端口作为根端口。

 

 

3、选择指定端口

根网桥上的所有端口均为指定端口。这里说的选择指定端口是指在非根网桥上选择指定端口。为什么需要在非根网桥上选择指定端口呢?

如下图所示,交换机B是根网桥,交换机A下边的端口和交换机C左边的端口是根端口。为了防止网络环路,我们要在交换机AC之间的链路上选择一个端口down掉,而另一个端口就是指定端口。

 

 

 选择指定端口也需要4步:

1、BPDU中的根网桥ID

如上边问题中的图所示,我们可以看到只有交换机B是根网桥,所以BPDU中的根网桥是一样的,所以根网桥ID也是一样的,无法选择出来。在看第二步。

2、最低的到达根网桥的路径开销

交换机A右边的端口到根网桥B的开销是38,交换机A上边的端口到交换机B的路径开销也是38,所以还是一样的。依然无法选择出来。在看第三步。

3、发送方的网桥ID

对于A和C来说,发送方都是B,所以发送方网桥ID也是一样的,在看第4步。

4、若优先级相同,则具有最低MAC地址

其实就是比较交换机C和A谁的PID值最小。若经过比较,C的PID较小,则C上的端口就为指定端口。

所以最后A右边的端口就成为了要down掉的端口。

 

 

四、BPDU

1、什么是BPDU

BPDU:bridge protocol data unit 。桥接协议数据单元。

我们说在选择根网桥时,是根据PID来选择的,选择网络中PID值最小的交换机作为根网桥。但是交换机如何获取其他交换机的PID值从而进行比较呢?

交换机把各自之间相互比较要用到的信息放到BPDU中,BPDU相当于一个载体,正常情况下,BPDU中是空的,当交换机想比较PID值时,他们需要把PID值放到BPDU中,然后把BPDU发送给别的交换机,这样交换机就知道别的交换机的PID值了。如果想比较别的,就把要比较的信息放到BPDU中传过去。所以BPDU就相当于一个载体,用来发送交换机要比较的数据。

所以STP使用BPDU来选择根网桥,同时也使用BPDU来计算根路径成本。在生成树当中,我们的交换机之间所传递的所有信息都是使用BPDU来传递的。

总之:交换机之间使用BPDU来交换STP信息。

另外,BPDU使用组播发送,组播地址为:01-80-C2-00-00-00,这个地址是固定的,不会改变。组播的概念为每个交换机都把自己的BPDU传送到这个组播地址,那么同组的其他交换机就都可以收到这个信息了。

BPDU有两种类型:

配置BPDU:用于生成树计算

拓扑变更通告 TCN BPDU:用于通告网络拓扑的变化。

 

2、BPDU的时间间隔和控制范围

每经过2S,交换机就会发送一次BPDU,用来保持活跃性。不然如果有一个交换机挂了,别的交换机也不知道。所以每隔2S,网络中的交换机就互相发送一次BPDU。

BPDU每经过一个交换机,message age加1,若message age大于max age,则非根网桥丢弃该BPDU。max age的值为20。可以通过max age来控制生成树网络的范围。

 

 

五、STP应用实例

 

实例一:

 

分析结果如下:

 

实例二:

 

 分析结果如下:

注意:分析的时候我们要一个环路一个环路的分析,不能混在一块儿看。另外根端口对端的端口一般都是指定端口。

 

 

 

六、STP的五种端口状态

 

1、禁用状态(disable): 端口是关闭的,没有启用。不发送BPDU,也不接收BPDU,不学习MAC地址,不转发数据。

2、阻塞状态(discarding):即我们前边提到的down掉的端口就是阻塞状态。不发送BPDU,但是可以接收BPDU,不学习MAC地址,不转发数据。

3、侦听状态(listening): 发送BPDU,也接收BPDU,不学习MAC地址,不转发数据。

4、学习状态(learning):发送BPDU,也接收BPDU,学习MAC地址,不转发数据。

5、转发状态(forwarding): 发送BPDU,也接收BPDU,学习MAC地址,转发数据。

其中侦听状态和学习状态被称为中间态,所谓中间态是指交换机的端口不会一直停留在侦听和学习状态,这两个状态只是生成树在网络中的一个中间状态,最终端口的状态要么在转发态,要么在阻塞态,要么在禁用态。   

 

七、STP计时器

我们前边说到,生成树是为了解决网络环路的问题。当有一条链路换掉时,被down掉的端口会UP起来,不会影响通信。但是这个端口会立即UP起来嘛?当然不是,这个端口需要整整50S才会UP起来。如下图所示,从阻塞态到侦听态需要20S的时间,从侦听态到学习态需要15S的时间,从学习态到转发态需要15S的时间,所以总共需要50S的时间这个端口才开始转发数据。

 

 

 八、STP的配置

在交换机上,STP技术默认随着设备的启动而自动运行,即会自动选择根网桥根端口等。但是我们也可以手动进行配置,将一个交换机手动配置成根网桥。

另外生成树有三种模式:

普通生成树

快速生成树

多生成树

今天描述的知识都是普通生成树,另外两种之后在解释!!!

 

 

 

 九、交换机编号、

思科交换机:

比如E 0 / 1 : 表示的是第一个模块的第一个端口。 E 0/12 : 第一个模块的第12个端口。E1/6 : 第二个模块的第6个端口。 前边的数字代表的是模块,后边的数字代表的是端口。 G0/1: G表示的是千兆口的意思。

华为交换机:

华为交换机由3位组成。比如 E0/0/1: 表示第一个板卡第一个模块的第一个端口。 所以三位的时候表示的分别是板卡、模块、端口。

 

标签:BPDU,实例,端口,生成,交换机,网桥,ID
From: https://www.cnblogs.com/yunjisuanchengzhanglu/p/16587278.html

相关文章

  • class的代码实例
    <body><divid="app"><!--1.基本绑定class--><h2:class="classes">HelloWorld</h2><!--2.动态class可以写对象语法--><button:class="i......
  • style的代码实例
    <body><divid="app"><!--1.普通的html写法--><h2style="color:red;font-size:30px;">哈哈哈哈</h2><!--2.style中的某些值,来自data中-->......
  • 20220816 springboot_idea_lombok_转Entity 生成的ToDominObject没有用有参构造方
    1问题:使用lombok,DDD设计思想整合mapStruct时,转Entity生成的ToDominObject没有用有参构造方法构造对象 2解决方案:2.1未解决_原因猜想因为生......
  • leetcode1374-生成每种字符都是奇数个的字符串
    生成每种字符都是奇数个的字符串模拟如果n为奇数,则返回n个a;如果n为偶数,则返回n-1个a和1个bclassSolution{publicStringgenerateTheString(intn){......
  • php生成四位随机数
    1<?php23$arr1=array_merge(range('A','Z'),range(0,9),range('a','z'));//生成数组且合并为arr14shuffle($arr1);......
  • 寻找带权图的最小连通:最小生成树
    出现背景树就是没有回路的图for无向图对于不带权的图,想找到一个最小连通边集合,很简答,可以使用生成树,n-1条边可以做到,不唯一对于带权的图,想找到权最小的生成树,称之为最......
  • vue源码阅读---vm实例上的属性
     vnode.$attrs:vnode.$slot:组件实例里插槽的内容;组价开始标签和组件结束标签里包裹的内容;vnode.children:普通元素组件的子节点;  vnode.componentInstacne:指向组件......
  • SQL 序列生成器
    本篇介绍SQL:2016(ISO/IEC9075:2016)标准中定义的序列生成器(Sequencegenerator)和相关操作,以及六种主流数据库中的实现及差异:Oracle、MySQL、MicrosoftSQLServer、Postgre......
  • 练习2-17 生成3的乘方表
    #include<stdio.h>#include<math.h>intmain(){inti,n;doublepower;scanf("%d",&n);for(i=0;i<=n;i++){power=pow(3,i);......
  • Apple开发_判断一个对象是实例对象还是类对象
    代码//判断一个对象是实例对象还是类对象+(BOOL)is_Instance:(id)gc_object{return[gc_objectclass]!=gc_object;}效果......