802.1d STP(生成树协议)的作用:在交换机间防止环路发生。STP通过阻塞某些接口来实现。

 

●STP的实现过程,三步:

1)选举根交换机:最小bridge ID的交换机胜出(标准bridge ID指MAC地址+2字节优先权值)

2)确定每个交换机的根端口:每台交换机上到根交换机路径开销最小的端口

3)为每个段确定指定端口(Designated Port):当多台交换机连入同一段时,那个转发Hello消息开销最小的交换机端口

 

●详解STP第一步

只有一台根交换机。其选举过程如下:每个交换机最初发送STP Hello BPDU(bridge protocol data unit)消息来参与竞选。如果一个交换机收到优先级更高的Hello(更小的bridge ID),它就停止自发送Hello以退出竞选,相反,它会转发更高优先级的Hello。最终,只剩下一台交换机还在发送Hello——它就是最后的胜出者。

初始的IEEE 802.1d bridge ID包含两个字段:

1)2字节的Priority字段,可进行配置以影响STP选举过程

2)6字节MAC地址,因为该字段是唯一的,就保证了最终有一台交换机在选举中能胜出。

 

●详解STP第二步

1)每隔Hello定时器时间(默认为2秒),根交换机创建并发送Hello消息。

2)每台交换机接收到Hello消息后,先更新Hello中的如下字段:开销,转发交换机的bridge ID,转发端口的优先级和转发端口号,然后再转发出去。

3)交换机不在稳定为阻塞状态的端口上转发Hello。

4)在交换机接收到Hello的所有端口中,到根交换机开销(Hello消息中的开销值+交换机STP端口开销值)最小的端口就是根端口。

IEEE 802.1d所规定的默认端口开销:

1)10Mbps接口:100

2)100Mbps接口:19

3)1Gbps接口:4

4)10Gbps接口:2

如果计算出的开销值有相等的情形,采用如下仲裁机制:

1)选择转发交换机bridge ID最小的

2)选择邻接交换机中端口优先值最小的

3)选择Hello中列出的内部端口号最小的

 

●详解STP第三步

会聚的STP拓扑只有一台交换机转发到每个LAN段,该交换机称为该段的指定交换机(designated switch),而用于转发到该段的端口称为指定端口。

指定端口是向该段发送含最小广告开销的Hello消息的端口。如果开销相等,仲裁机制与上同。

 

●收敛到新的STP拓扑

当STP有稳定拓扑时:

1)根交换机基于Hello定时器周期性地生成Hello。

2)每台非根交换机(基于Hello定时器)周期性在其根端口上接收根交换机的Hello消息。

3)每台交换机更新Hello消息并在其指定端口上转发出去。

4)对于每个阻塞端口,交换机周期性地由指定端口接收Hello消息(在阻塞端口上不再转发)。

如果网络拓扑发生变化,STP会重新收敛。如果根交换机失效,在最大时间定时器(默认为20秒)超时后,交换机会选举新的根交换机。

当STP重收敛发生时,有些CAM(Content Addressable Memory)记录会变成无效。为了更新CAM,可以考虑:

1)通知所有交换机CAM记录超时失效

2)每台交换机使用更短的定时器(与Forward Delay timer相等,默认为15秒)来使CAM记录超时失效。

因为有些交换机察觉不到STP拓扑的改变,所以其他察觉出变化的交换机有责任通知它们。为此,交换机可以用TCN(Topology Change Notification)BPDU通知根交换机,然后根交换机通知其余交换机。

 

●由阻塞状态转换到转发状态

当STP重收敛时,原来处于阻塞状态的端口可能转换为根端口或指定端口,此时端口处于转发状态。不过这个过程不是立即发生的,为了避免引起环路,这个转换过程一般如下:先将变化之前的阻塞状态的端口置于监听状态,然后再到学习状态(每个状态延续时间由转发延迟定时器决定(默认为15秒)),最后再转换。

802.1d STP接口状态表:

 

状态

 

 

是否转发帧?

 

 

是否学习接收到的帧的源MAC地址?

 

 

暂时还是稳定状态?

 

 

阻塞

 

 

 

 

 

 

稳定

 

 

监听

 

 

 

 

 

 

暂时

 

 

学习

 

 

 

 

 

 

暂时

 

 

转发

 

 

 

 

 

 

稳定

 

 

屏蔽

 

 

 

 

 

 

稳定

 

 

 

●为什么引入Per-VLAN生成树?

在STP应用中,我们会碰到这样一种情形:如果一个STP实例用于带冗余链接且含有多个VLAN的交换网络,那么有些端口就会处于阻塞状态,在稳定状态下也无法使用,而实际这些冗余链接是备份流量所必需的。Cisco的Per VLAN增值生成树(PVST+)功能可以对每个VLAN创建一个STP实例。这样,每个STP实例可以使用不同的根交换机,阻塞不同的接口,那么流量负载就能够在现有链接上得到均衡。

 

●需要注意的是,802.1Q本身不支持PVST+,但是Cisco交换机可以支持PVST over 802.1 trunk。现在所有Cisco交换机默认都设置PVST+。

STP的保护

STP也可能遭受到各种类型的***,所以STP的保护工作也非常重要

 

●对接入端口的保护:Root Guard和BPDU Guard

对于接入端口而言,可能临时新连接一台交换机在其下,而这可能会引起STP拓扑不必要的变化。要防止此问题,可以在接入端口激活BPDU Guard和Root Guard来监控是否有BPDU进入。它们的基本操作如下:

1)BPDU Guard:在每个端口上激活;如果接收到任何BPDU,该端口即被屏蔽。配置后可自动恢复。

2)Root Guard:在每个端口上激活;忽略任何优先级更高的BPDU,这样可以阻止连接在此端口的交换机成为根交换机。无需配置即可自动恢复。

 

●对中继端口的保护:UDLD和Loop Guard

对于中继端口而言,最主要的问题是要避免因为单向(Unidirectional)链路(链路一端失败,可能是因为一端接插问题而引起)的存在而导致交换机端口错误地从阻塞状态转换到转发状态。解决这个问题的办法是:UDLD(两种模式)和Loop Guard,具体操作如下:

1)UDLD:使用第二层消息来决定什么时候交换机不再由邻接交换机接收帧,交换机未失败的传输接口置为错误屏蔽状态。配置后可自动恢复。

2)UDLD aggressive mode:当接收不到另一交换机消息时,先试图重连(8次),如果仍然没有反应,那么两端都置为错误屏蔽状态。配置后可自动恢复。

3)Loop Guard:当接收不到正常的BPDU时,端口不再进行正常的STP收敛,而是进入STP环路冲突(loop-inconsistent)状态。无需配置即可自动恢复。

STP/生成树(Spanning Tree Protocol)

冗余带来网络环路

产生的3大问题:

 1:Multiple Frame Copies/多帧复制

 2:MAC Database Instability /MAC地址数据库的不稳定

       /端口漂移

 3:Broadcast Storms/广播风暴

 

 

解决方案:STP

STP是链路管理协议

 将特定的端口置于阻塞状态,来实现既没有环路,也可以冗余的网络.

 

STP核心:

 Provides a loop-free redundant network topoloty,by placing certain ports in the blocking state.

STP信息是通过BPDU来传输的

    桥接协议数据单元BPDU(Bridge Protocol Data Unit)

作用:

 在交换网络中由根桥RB(Root Bridge)发送,用于STP的计算和收敛;发送周期为2秒;

两种类型:

 配置DPDU 是所有端口上的根网桥以周期性间隔而发出的

 TCN(Topology Change Notification) BPDU 当交换机检测到拓扑变更时所产生的

(TC发送时间持续35秒,即delay time+BPDU老化时间).

BPDU完成的任务:

 选举根桥

 确定冗余路径的位置

 阻塞特定端口防止环路

 通告网络的拓扑变更

 监控生成树的状态

 

 

协议ID(0)  表示协议 802.1d

版本号(0)  STP的版本,802.1D的版本是0

BPDU类型 BPDU类型(配置BPDU=0,TCN BPDU=80)

信息寿命 从根桥发出BPDU之后的秒数,每经过一个网桥都递减1,本质上是到达网桥的跳计数

标记域  包括 拓扑变化(TC)位,置位了就指明该BPDU是一个拓扑变化通告  或  拓扑变化确认(TCA)位

 

交换机对BPDU的处理:

    如果交换机从一个接口接收到优先级高的BPDU,会把该BPDU保存下来并且该接口不再往外发送BPDU;

    在收敛时只有根桥产生BPDU,其余交换机只能从RP接收BPDU后才从DP发送出去;这样非根桥可能从DP或者NDP接受到BPDU;

    如果交换机从DP接收到优先级低的BDPU会丢弃,并给源MAC发送自己较新的BPDU;如果从NDP收到优先级低的BPDU会只丢弃了事。

 

端口的不同状态:

    堵塞(Block,默认20s):只监听流入的BPDU

    监听(Listen,默认15s):监听和发送BPDU(根桥、根端口、指定端口等的选举在该阶段完成,如果接口没有成为DP则重新回到Block):

    学习(Learning,默认15s):监听和发送BPDU,并且会在该接口上学习流入帧的MAC地址

    转发: 监听和发送BPDU,会在该接口上学习流入帧的MAC地址,接收和转发数据帧

    禁用: 不参与STP,并且不能转发任何数据.

STP定时器: 

 Hello time(2s)  用于确定根交换机多长时间向其他的交换机广播一次配置BPDU.

 Forward delay(15s) 监控每个端口在学习和监听状态上停留的时间

 Max Age(20s)  控制端口保存配置BPDU信息的最大时间

作用:让网络有足够的时间来获得有关拓扑的正确信息,并确定是否存在冗余链路.

STP的默认最大寿命计时器为7,表示最大的网络直径可达7台设备.

所以BPDU的Forward delay为20秒

bpdu广播2s一次,允许有3个包丢失即6s,当假设最大为7跳的时候,则一共要用20s,所以BPDU的有效时间为20s

命令:

(config)#spanning-tree vlan 2 hello-time 2 //范围1-10s

    spanning-tree vlan 2 forwad-time 4 //范围4-30s

    spanning-tree vlan 2 max-age 6

 

STP执行的4步判决顺序

 

确定根交换机    lowest root BID 

计算到根交换机的最小路径开销 lowest path cost to root bridge

确定最小的发送者BID   lowest sender BID

确定最小的端口ID   lowest port ID 

 

LAB1:根桥的选举

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

引用原则1:

Lowest BID那个交换机,就是root Bridge.

BID:(Bridge ID)

由本交换机的网管MAC地址,和交换机的优先级组成,一共8个字节的16进制.

Step1:察看交换机的网管IP 所对应那个MAC地址

SW1#show version

Base ethernet MAC address: 00:07:EC:A8:4B:80

Step2:

察看STP的相关信息:(察看本机BID)

SW3#show spanning-tree 

交换机的STP的优先级,默认都是0x8000(32768)

Boot ID /Bridge ID

如果Root ID=本交换机的Bridge ID,说明本交换机就是根桥.

Step3:人为控制,根桥的选举(控制根桥/后备根桥的选举)

SW3(config)#spanning-tree vlan 1 priority 0 (0x0000)

SW1(config)#spanning-tree vlan 1 priority 4096 (0x1000)

SW-A(config)#spanning-tree vlan 1 root priority

      (24576=0x6000)

SW-B(config)#spanning-tree vlan 1 root secondary

      (28672=0x7000)

 

LAB2:非根桥交换机的根端口选择:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

引用原则2:

Lowest path cost to root bridge

Spanning-Tree Path Cost

根端口:

在非根桥交换机上,到达根桥所需的路径开销,最小的那个端口. 

链路带宽与cost

cost是如何叠加的?

每个非根桥,都只有一个根端口.

SW1#show interface status

SW1(config)#int fa 0/12

   speed 10

SW1#show spanning-tree interface fastethernet 0/12 detail

 port path cost 100

根桥上,没有根端口,"所有与交换机相连的端口"都是"指定端口"

(config-if)#spanning-tree vlan 1 cost ?  //修改端口开销

 

designated port

LAB3:每条segment上的,的选择:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

引用原则3:

Lowest sender BID

Step1:判断SW1的SW3之间的segment上,哪个是D-PORT? (8)  

Step2:

SW1(config)#spanning-tree vlan 1 priority 36864

       (0x9000)

LANB4:sender BID相同的情况下,designated port的选择:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

如果sender BID相同,则引用原则4:

Lowest (对方的) port ID

Step1:

SW2(根桥)# 察看端口的Port-ID

show spanning-tree interface fastEthernet 0/12 detail

     port identifier 128.12

SW2(config-if)#spanning-tree port-priority 32 (16进)

 

LAB5:观察 blocked端口

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

查看所有segment:

观察除了指定端口,和根端口以外的端口,都是被堵塞的.

show spanning-tree vlan 1 detail //显示各个端口上所接收的BPDU数目

 

STP的的特性:(CISCO私有)

1:PortFast 加快终端主机连接入stp网络的收敛.

只适用于,在交换机与主机(电脑)相连的端口, 不应该在交换机与交换机,路由器,hub互连的网络设备的端口使用.

interface FastEthernet0/1 (交换机上,在连接主机的端口)

 switchport mode access (接入链路)

 spanning-tree portfast

spanning-tree portfast default //全局模式下使用,全局启用portfast.

2.uplink-fast:

在所有接入层/分布层(非核心层)交换机上,配置uplink-fast,用于加速因为直链故障/直链检测错误,所引起的STP网络变化的收敛速度.

block - forward

1~5s

sw1(config)#spanning-tree uplink-fast //启用uplink-fast

show spanning-tree uplinkfast //查看uplinkfast信息

 

将网桥优先级增加49152,并且将交换机上所有接口的生成树端口开销增加3000

3.BackBone-Fast:

当遇到非直链检测错误时,加速其收敛速度:

大约为30s

indirect Link Failure

所有的交换机上,配置BackBone-Fast

sw1/2/3(config)#spanning-tree backbonefast //启用backbonefast

show spanning-tree backbonefast //查看backbonefast信息

4.portfast bpduguard (在已经是portfast端口上配置)

交换机端口的"portfast bpduguard"是指:

 在交换机的端口一旦收到BPDU包时,立刻关闭端口(进入err-disable状态),避免了更大范围的广播风暴.

如果要打开必须先shutdown,再NO SH

设置自动重新启用老化时间:

(config)#errdisable recovery cause bpduguard //默认300秒

     errdisable recovery interval ?  //修改等待间隔

 

在连接主机的端口上:

Sw1(config-if)#spanning-tree bpduguard enable

bpduguard Don't accept BPDUs on this interface

5:portfast bpdufilter (在portfast端口配置)

防止交换机在启用"portfast"的接口上发送BPDU,并且将接收到的所有BPDU都丢弃.

在特定的portfast端口上配置:

sw1(config-if)#spanning-tree bpdufilter enable 

 (bpdufilter: Don't send or receive BPDUs on this interface)

sw3(config)#spanning-tree portfast bpdufilter default  //全局的portfast端口上,都生效

注意:BPDU过滤可能导致环路,不推荐配置.配置过滤之后防护将不起作用.

6:root guard (推荐在所有的接入端口上配置)

将接口强制成为指定端口,从而防止周围的交换机成为根交换机.

(config-if)#spanning-tree guard root 

show spanning-tree inconsistentports //显示"不一致根"

 

debug spanning-tree events