网工笔记(二):STP生成树

在网络二层协议中,STP生成树应算是最难懂最能给网络制造麻烦的一位,可以说不经历过STP故障造成的网络崩溃也不算见过世面的网工。网络技术经历了那么多年的创新迭代,尽管有些新的技术架构号称可以无需使用STP,但我所接触到的顶级科技公司的数据中心网络依然会使用STP。值得一提的是在虚拟网络里,譬如说用NSX,的确是没有STP,但这是另外一个课题了。

今天我们来复习一下STP生成树,以下是本文的提纲。

  • 基本原理
  • STP中的报文BPDU
  • 根桥和根端口的选举
  • 拓扑的变更
  • STP的几种模式
  • 排错清单

 基本原理

 一般网络系统中都会搭建有多台的交换机,交换机之间会有冗余链路,STP的提出就是用来解决局域网(二层网络)中的环路问题的。二层上的报文是没有TTL的(就是说没有毁灭计时器),如果网络有环路,报文就会被反复传播最后造成二层网的风暴。 STP通过阻断一些端口,达到打破环路的目的,从而让整个网络拓扑逻辑上成为一个树状结构。

STP生成树的生成过程大概如下:

  1. 选举根桥(Root Bridge)-- 根桥交换机位于整个逻辑树的根部,并由此确定那些交换机处于下游。
  2. 选举根端口(Root Port)-- 一旦根桥确定,其他交换机会计算出自身的端口中那一个(并只有一个)端口去往根桥的路径,并以该端口为根端口。
  3. 选举指定端口(Designated Port) -- 交换机用于转发BPDU(STP报文)的端口, 每个网段有且只能有一个指定端口。
  4. 阻断端口(Blocking Port),阻断一些端口达到断开环路的目的。

特别指出的是在根桥上的所有端口都是指定端口。

上图是从书ENCOR350-401[1]引用而来,它很好的展示了STP各种端口的状况,DP指的就是Designated Port, RP为Root Port。从上图可见,designated port一般都连着root port, 其对应连着的交换机为处于下游的交换机。

STP中的报文BPDU

在STP协议中发送的报文叫Bridge Protocol Data Unit, 简称为BPDU。根桥根端口的选举都依赖于交换机之间发送的BPDU报文,可以说局域网生成树的建立和维持都要使用BPDU报文。BPDU报文的类型有两种:

  1. Configuration BPDU -- 这类报文用于确定根桥,根端口,指定端口和阻断端口。
  2. Topology change notification (TCN) BPDU -- 这类报文用于交换机之间通知拓扑发生了变更。拓扑变更是常见现象,例如某一个交换机中原先连接的端口突然中断,TCN BPDU就会被发出。

在抓包时你能在BPDU报文中看到以下几个参数,后文会对这些参数进行解析:

  • Bridge ID -- 根桥ID。
  • Local bridge identifier -- 交换机自身的桥ID(交换机也被称作桥bridge)。
  • System  Priority -- 系统权重,在交换机上可配置的一个权重值,可用于影响根桥的计算。
  • root cost path -- 到根桥的距离。
  • System Extention ID -- 这个其实就是VLAN ID。 
  • Hello time -- BPDU报文发送的间距,默认值为2秒。

根桥和根端口的选举

选举根桥是建立局域网树状拓扑(生成树)的开始。当一个交换机初始化时,它会先把自己定为根桥,然后发送BPDU报文来跟相邻的交换机一起确定谁是根桥。其选择方法是基于根桥的ID,具体说就是比谁的ID更小。

  • Bridge ID = System Priority + VLAN ID  + MAC地址
  • System Priority = 4096 x N
  • Bridge Priority =  System Priority + VLAN ID
  • Default Priority = 32768

这里需要特别说明的是priority的计算问题,priority即是权重,在STP中这个权重值总是4096的倍数(4096 x N),默认值是32768。在BPDU报文里往往看到的权重值(Bridge Priority)是32769,那是因为在BPDU 中权重值需加上VLAN ID,在VLAN 1中,报文里的权重就为32769,在VLAN 10,那么权重就是32778。

由于根桥选举是看谁的Bridge ID更小,所以mac地址值小的交换机就更有可能成为根桥,这样设计的原因是mac地址小的机器会是更老的机器在网络中存在的时间也可能更早,更愿意选择这些已经在网络拓扑里的机子作为根桥。以下是查询根桥的命令。

# show spanning-tree root

                                        Root    Hello Max Fwd
Vlan                   Root ID          Cost    Time  Age Dly  Root Port
---------------- -------------------- --------- ----- --- ---  ------------
VLAN0001         32769 5000.0003.0000         0    2   20  15
VLAN0020         32769 5000.0004.0000         4    2   20  15  Gi0/0

在一个局域网里确认根桥后,其他的非根桥交换机各自计算自己的根端口。根端口通过按以下顺序比较相应的参数来确定的。

  1. 首先比较端口的root path cost值,path cost是该端口到根桥的代价,值小优先。Root path cost的计算是通过根桥往下发BPDU报文而获得的,根桥发出的BPDU的cost值为0,通过1G的接口,cost值加4。
  2. 其次比较端口对应的权重(priority)值,值小优先。
  3. 比较端口的mac地址值,值小优先。
  4. 如果多个接口具有同样的参数,那么比较那个接口与相连的路由器有较优的权重,值小优先。
  5. 最后比较端口的端口 ID,值小优先, 例如接口Gi1/0/1比接口Gi2/0/1小即选Gi1/0/1为根端口。

在上面命令show spanning-tree root的输出中,VLAN 1的root path cost为0,root port为空值,可知该交换机自身是VLAN 1的根桥。

在网络部署时,通常会刻意地设计出根桥和根端口,管理员通过配置权重来影响根桥的选举,通过配置patch cost来影响根端口和指定端口(Designated Port)的选举。

拓扑的变更

造成拓扑变更的原因有多种,例如交换机端口中断,又例如在网络中新增了交换机,在这些情况下生成树需要被重新计算。正常状态下Configuration BPDU从根桥发出到达其它交换机;当拓扑变更发生时,则由发现变更的交换机发出TCN BPDU。 拓扑的变更的过程如下:

  • 网络中某交换机发现拓扑变更,随即从根端口向根桥发出TCN BPDU。上游的交换机接收到TCN BPDU后向源交换机发acknowledgement,向根桥转发TCN BPDU(通过根端口)。
  • 根端口接收到TCN BPDU后,生成新的Configuration BPDU,设置拓扑变更的flag,以泛洪(flooding)的方式把该报文发送给所有的交换器。
  • 当交换机接收到有拓扑变更flag的Configuration BPDU时,会把mac地址表的计时器设为15秒,所有15秒以内未被使用过的地址都会被清空。

当mac地址表被清空会造成一段时间内的unknown unicast的泛洪,会影响交换机一段时间内的性能。当恢复到稳定状态,mac地址表的计时器会恢复到正常,默认下是300秒。

 接口的翻滚(flapping)会造成生成树频繁的拓扑变更,随之带来的是mac地址表不断地被清空,这当然不是一种理想的状态。在STP下可以把一些端口类型为edge port,一般用于连接服务器,需要手动用portfast配置。目的是为了让服务器端的down机状态不会造成STP的拓扑变更,并且能让连接服务器的端口能够更快地处于启动状态。

STP的几种模式

STP的第一个协议为802.1D,在该协议下一个端口从admin down到能够转发报文大概需要30秒的时间,当中需要经历如下几个状态:

  1. 阻塞状态(blocking): 这时端口不转发报文,不参与mac learning,只接收BPDU报文,但不发送BPDU。
  2. 侦听状态(listening): 这时能BPDU报文,这个状态要持续15秒。
  3. 学习状态(learning): 这时可以参与mac learning, 但是依然不能转发报文。
  4. 转发状态(forwarding): 可以转发报文。

802.1D这个协议的一个主要问题就是它的scalability, 对于一个大型网络,它需要很长的时间才能让所有的端口处于工作的状态。于是RSTP(Rapid STP)协议被提出,即为802.1W。思科提出的PVST和PVST+都是建立在802.1W的基础上的。在RSTP中,报文只有三种状态,没有了阻塞状态和侦听状态,取而代之的是discarding状态  -- 不转发报文不学习mac地址,只接收和发送BPDU。另外,RSTP也重新定义了端口的一些角色,在RSTP下的端口角色有:Root Port, Designated Port, Alternative Port 和 Backup Port。

 PVST和PVST+是基于RSTP,主要想法是每一个VLAN生成一个独立的STP生成树,一个VLAN中的拓扑变更不会影响到所有的VLAN。但是在VLAN树比较多的情况下,给每一个VLAN计算生成树开销很大,于是就有了MST模式,把多个VLAN放在同一个实例(instance)下计算生成树。 在交换机上可用以下命令可以查看STP的模式。

# show run | inc span
spanning-tree mode pvst

排错清单

以下几个命令是在STP中排错时比较常用的命令。

如果一个接口状态和设置都正常的状况下,但就是没有流量,一个最可能的问题就是STP把该端口阻断了。查看STP的阻断端口show spanning-tree blockedports

#sh spanning-tree blockedports

Name                 Blocked Interfaces List
-------------------- ------------------------------------
VLAN0001             Gi0/1

Number of blocked ports (segments) in the system : 1

show spanning-tree root 查看根桥根端口和root path cost。如果需要可以使用root guard,loop guard, BPDU guard和BPDU filter等属性来影响根桥根端口的选举。Root guard的作用是在designate root上做保护,防止designate root变成根端口;当designate port接收到更高级的BPDU时会把自己设为error disable。对应地loop guard用于根端口和altrernative port防止其成为上游端口(designate port)。该命令的输出例子在前文提供了。

show spanning-tree summary快速查看STP的概览设置。

#sh spanning-tree summary
Switch is in pvst mode
Root bridge for: none
Extended system ID                      is enabled
Portfast Default                        is disabled
Portfast Edge BPDU Guard Default        is disabled
Portfast Edge BPDU Filter Default       is disabled
Loopguard Default                       is disabled
PVST Simulation Default                 is enabled but inactive in pvst mode
Bridge Assurance                        is enabled but inactive in pvst mode
EtherChannel misconfig guard            is enabled
Configured Pathcost method used is short
UplinkFast                              is disabled
BackboneFast                            is disabled

Name                   Blocking Listening Learning Forwarding STP Active
---------------------- -------- --------- -------- ---------- ----------
VLAN0001                     0         0        0          4          4
VLAN0020                     0         0        0          2          2
---------------------- -------- --------- -------- ---------- ----------
2 vlans                      0         0        0          6          6

在排查拓扑变更造成的问题可以用show spanning-tree detail,该命令输出上次变更的时间和发出变更的端口。要找到拓扑变更的源头需要登录到每一台交换机上用以该命名一台台往下查。减低拓扑变更造成影响的方法有1)翦除多余的VLAN (vlan puring);2) 对终端服务器使用portfast;3)使用MST。

#sh spanning-tree detail 

VLAN0001 is executing the ieee compatible Spanning Tree protocol
  Bridge Identifier has priority 32768, sysid 1, address 5000.0003.0000
  Configured hello time 2, max age 20, forward delay 15
  Current root has priority 32768, address 5000.00d7.ee0b
  Root port is 3 (GigabitEthernet0/2), cost of root path is 4
  Topology change flag not set, detected flag not set
  Number of topology changes 1 last change occurred 00:30:19 ago
          from GigabitEthernet1/1
  Times:  hold 1, topology change 35, notification 2
          hello 2, max age 20, forward delay 15
  Timers: hello 0, topology change 0, notification 0, aging 300

 Port 3 (GigabitEthernet0/2) of VLAN0001 is root forwarding
   Port path cost 4, Port priority 128, Port Identifier 128.3.
   Designated root has priority 32768, address 5000.00d7.ee0b
   Designated bridge has priority 32768, address 5000.00d7.ee0b
   Designated port id is 128.2, designated path cost 0
   Timers: message age 2, forward delay 0, hold 0
   Number of transitions to forwarding state: 1
   Link type is point-to-point by default
   BPDU: sent 34, received 885

参考文献

[1] CCNP & CCIE Enterprize Core, ENCOR 350-401, ciscopress

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章