生成树协议(STP)基本知识及实验(使用eNSP)
1、基本知识--摘至《网络之路--交换专题》
(1)生成树的作用:在链路层消除环路上可能出现的广播风暴。
(2)生成树的工作由三部分组成:选举过程、拓扑计算、端口行为确定。
选举过程:在二层网络中选举一个网桥作为根桥,用于指挥整网设备协同工作。根桥只是负责统一计算的规则。
根桥统一网络中所有网桥的行为准则的原理:通过在某个恰当位置阻塞端口来阻止环路的发生。从一台网桥的角度来说,它通过这样的法则进行判断,如果到达网络中的某一网桥只有一条路径,那么必定不存在环路;如果到达某一网桥的路径有两条或者多条,那么这两台网桥之间存在环路,只能保持一条通路。
(3)根桥的选举方式
根桥是通过网络中所有网桥间相互比较产生的。根桥只能由网络中桥ID最小者担当。一开始时把自己当作根桥,根桥ID就是自己的桥ID,然后通过BPDU和自己的邻居交换拓扑信息,如果邻居的根桥ID小于自己的桥ID,则把邻居当作自己的根桥,然后向其他邻居通告这个新的根桥信息,直到网络中所有网桥的根桥ID都一样时,根桥就被选举了出来。
桥ID有8个字节,由两部分组成,分别是2字节的桥优先级字段和6字节的桥MAC字段。桥优先级字段可手工设置,默认为0x8000;桥MAC即网桥的物理MAC。
(4)使网络中的网桥和根桥保持统一的方式
通过一个独特的消息机制实现,当根桥被选举出来后,根桥会周期性的向所有邻居发送BPDU报文,这个周期被称为Hello Time,默认设置为2s。邻居收到根桥发送来的BPDU时,会更新自己的状态和定时器,然后转发出去。在生成树协议中(STP)只有根桥有主动发送BPDU的权力。快速生成树协议(RSTP)中所有网桥都会按照Hello Time的时间间隔主动从指定端口发送BPDU。
生成树协议中的BPDU报文有两种,一个被称为配置BPDU(Configuration BPDU),一种被称为拓扑变化通知BPDU(Topology Change Notification BPDU 或叫 TCN BPDU)
配置BPDU报文格式如下:
端口ID占2个字节,和桥ID类似分为两个部分,前8bits为优先级,默认值为0x80,可手工修改,后8bits为端口号,由设备指定,保证每个端口都不一样。
TCN BPDU报文只有前三个字段,其中前两个字段和配置BPDU一样,BPDU Type字段的值为0x80。
Root Path Cost(根桥路径开销)代表了这个网桥到根桥的距离,对根桥而言,这个值被设置为0。当网桥收到一个BPDU,其中的根桥ID比自己当前的根桥ID小时,这个网桥会将BPDU中的Root Paath Cost加上接收到这个BPDU的端口的Cost值作为自己的Root Path Cost。
Message Age是用来衡量当前网桥所收到的BPDU在网络内传播时间的一个参数,根桥在构造发送BPDU的时候,会将这个字段设置为0,但下游网桥在传递从根桥发来的BPDU时,会在BPDU报文的Message Age字段中把这一跳转发过程中可能引入的时延上限加到里面。
Max Age是一个预先设定的值,这个值可以看作是一个门限,用来配合Message Age定时器。
Message Age和Max Age是生成树协议用于判断拓扑是否变化的重要指标。网桥在根端口上设置了一个定时器,如果通往根桥的路径完好,根端口会定时收到BPDU,并更新这个定时器。如果一直不能收到BPDU,每过1s定时器就自动加1,但这个定时器超过某一门限(Max Age)之后,网桥会认为原根端口通往根桥的路径已经出现了故障,拓扑发生了变化。
(5)连接到一个LAN的端口的优先级比较
每个网桥都各自存储着一套信息,包括当前的根桥ID、Root Path Cost和自己的桥ID,每个端口还存储着自己的端口ID。
当端口收到BPDU后,先判断根桥ID,如果相同继续比较根桥路径开销,再相同则比较桥ID,如果再相同,则比较端口ID。比较之后,比较失败的端口停止向LAN中转发BPDU。这样比较之后,最终获胜的端口成为这个LAN的指定端口。
在同一台网桥中,网桥会从在优先级比较中失败的端口中选择一个开销最小的端口作为自己的根端口,作为网桥通往根桥的唯一出口,其他端口成为Alternate端口进入Blocking状态,既不接收或转发数据报文,也不转发BPDU。根端口的选择方式是依次比较Root Path Cost(要先加上端口自身的cost)、桥ID和端口ID、本身的端口ID。
(6)生成树协议中端口的五种状态
分别为:Disable、Blocking、Listening、Learning、Forwarding。当端口没有连接上或被shutdown时,处于Disable状态,一旦up起来后就进入Blocking状态,如果没有收到优先级更高的BPDU或本身被网桥选举为根端口,会进入Listening状态,然后等待一个Forward Delay的时间,进入Learning状态,再等待一个Forward Delay的时间,如果端口没有因为新的选择过程而成为Alternate的话,进入Forwarding状态。
Blocking状态下的端口不会转发任何报文,或者学习MAC地址;端口在Listening状态时即不转发数据报文,也不会根据监听到的数据报文学习MAC地址; 在Learning状态时不转发数据报文,但会学习MAC地址;在Forwarding状态时即学习MAC,也转发数据报文。
端口状态 | 目的 | 说明 |
Forwarding | 端口既转发用户流量也处理BPDU报文 | 只有根端口或指定端口才能进入Forwarding状态 |
Learning | 设备会根据收到的用户流量构建MAC地址表,但不转发用户流量 | 过渡状态 |
Listening | 确认端口角色,将选举根桥、根端口和指定端口 | 指定端口 |
Blocking | 端口仅仅接收并处理BPDU,不转发用户流量 | 阻塞端口的最终状态 |
2、实验
参考链接:https://blog.csdn.net/flyfish5/article/details/50224537
实验拓扑结构如下:
下面进行简单的配置说明:
1.将LSW1、LSW2、LSW3、LSW4都设置为stp模式(默认为MSTP)
[Huawei]stp mode stp
2.使用display stp brief 命令查看每个网桥的端口模式
LSW1:
LSW2:
LSW3:
LSW4:
对以上几种接口角色进行一下简单的说明:有4种接口角色:
-
Root Port(ROOT):根端口,就是去往根桥路径开销最小的端口,该端口可以正常转发流量。
-
Designated Port(DESI):指定端口,就是负责转发BPDU报文的端口,根桥上的端口都是指定端口,该端口可以正常转发流量。
-
Alternate Port(ALTE):阻塞端口,就是禁止转发流量的端口。
-
Backup Port:暂时不清楚。
可以看出上面的拓扑中把LSW3当作了根桥。LWS1的根端口为Eth 0/0/3、LSW2的根端口为Eth 0/0/2、LSW4的根端口为Eth 0/0/2。
在LSW3的Eth 0/0/3端口抓取STP报文的格式如下: