【未完待续】STP协议详解

STP协议详解


生成树协议Spanning Tree ProtocolSTP),是一种基于OSI网络参考模型的数据链路层的通讯协议,用来确保一个无环路的LAN环境。

基于由Radia PerlmanDEC工作时发明的算法,STP让一个网络被设计成包含备用线路以当一条活动中的线路失效时,自动提供备用线路,並排除引起环路、及手动启动、关闭該些备用线路的需要。

因此,通过使用STP,可以达到四个效果:

1、防止环路;

2、防止MAC地址震荡;

3、防止重复的出现;

4、防止广播风暴的出现。

---来自WIKI百科

交换环路从何而来

当交换机之间存在多条活动链路时,交换机将从不正常的接口上学习到MAC地址,导致MAC地址表的不正确与不稳定,并且还会导致重复的数据包在网络中传递,引起广播风暴,使网络不稳定。

为了防止交换机之间由于多条活动链路而导致的网络故障,必须将多余的链路置于非活动状态,即不转发用户数据包,而只留下单条链路作为网络通信,当唯一的活动链路不能工作时,再启用非活动链路,从而达到网络的冗余性。要实现此功能,需要依靠生成树协议(STP)来完成,STP将交换网络中任何两个点之间的多余链路置于Blocking(关闭)状态,而只留一条活动链路,当使用中的活动链路失效时,立即启用被Block的链路,以此来提供网络的冗余效果。

版本信息


STP为IEEE标准协议,并且有多个协议版本,版本与协议号的对应关系如下:

Name IEEE No.
Common Spanning Tree(CST) IEEE 802.1D
Rapid Spanning Tree Protocol IEEE 802.1W
Per-VLAN Spanning Tree plus(PVST+) per-VLAN IEEE 802.1D
Rapid PVST+ per-VLAN IEEE 802.1D
Multiple Spanning Tree Protocol(MSTP) IEEE 802.1S

工作原理及过程


STP的相关名词介绍:

1、根交换机

网桥ID(BID):

​ 优先级+网桥MAC

​ 优先级(2Byte):前4bit表示优先级,后8bit作为System ID,为协议扩展用。越小越好,必须为4096的倍数。

​ 网桥MAC(6Byte)

网桥ID在同一个广播域内是唯一的。

  • 根桥的选举依据
    • 先查看交换机优先级,优先选择优先级数值小的优先级高的可以忽略mac数值。(优先级可以通过配置1修改缺省值:32768)
      • 取值范围:0 ~ 65535
      • 缺省值:32768
    • 然后查看交换机的Mac地址,选择数值小的
2、命令及验证


/*
 * 在SW1上查看生成树信息,因为SW1、SW2、SW3上面都没有划分其他的VLAN,
 * 所以默认只有VLAN0001的生成树信息。
 *
 * "Spanning tree enabled protocol ieee",
 * 表示交换机使用的生成树协议是"PVST+",这也是思科默认的生成树协议。
 *
 * "Root ID"后面是VLAN1中根交换机的BID参数,
 * Priority 32769,表示根交换机的优先级是32769,
 * Address是根交换机的MAC地址,
 * "This bridge is the root",表示当前这台交换机就是根交换机。
 *
 * "Hello Time  2sec  Max Age 20sec  Forward Delay 15sec"
 * BPDU发送间隔默认2秒,最大存在时间是20秒,转发延时是15秒。
 *
 * "Bridge ID"后面的参数是本交换机的BID参数,
 * 因为SW1就是根交换机,所以下面的参数和"Root ID"是一样的,
 * 其中"priority 32768 sys-id-ext 1",表示SW1的优先级是32768,
 * Extended System ID是1,所以总优先级就是32768+1=32769。
 *
 * 所以SW1的BID=SW1的优先级+SW1的MAC地址=32769+0001.9681.2683
 * 接下来查看SW2和SW3的生成树信息,就会知道为什么SW1可以被选举成根交换机了。
 */
SW1#show spanning-tree
VLAN0001
  Spanning tree enabled protocol ieee
  Root ID    Priority    32769    
  			 Address     0001.9681.2683
             This bridge is the root
             Hello Time  2 ec  Max Age 20sec  Forward Delay 15sec
 
  Bridge ID  Priority    32769  (priority 32768 sys-id-ext 1)
             Address     0001.9681.2683
             Hello Time  2sec  Max Age 20sec  Forward Delay 15sec
             Aging Time  20

Interface   Role Sts Cost      Prio.Nbr Type
----------- ---- --- --------- -------- ----------
Fa0/1       Desg FWD 19        128.1    P2p
Fa0/2       Desg FWD 19        128.2    P2p
Fa0/3       Desg FWD 19        128.3    P2p
 
/*
 * 查看SW2的生成树信息,
 *
 * 可以看到SW2的BID中,优先级是32769,和SW1相同,
 * 但SW2的MAC地址是0030.A310.3975,大于SW1的MAC地址,
 * 因为BID=优先级+MAC地址,
 * SW1的BID要小于SW2的BID,
 * 所以SW1为根交换机。
 */
SW2#show spanning-tree
VLAN0001
  Spanning tree enabled protocol ieee
 
/*这里是根交换机,也就是SW1的BID信息*/
  Root ID    Priority    32769
             Address     0001.9681.2683
             Cost        19
             Port        2(FastEthernet0/2)
             Hello Time  2sec  Max Age 20sec  Forward Delay 15sec
 
/*这里是SW2的BID*/
  Bridge ID  Priority    32769  (priority 32768 sys-id-ext 1)
             Address     0030.A310.3975
             Hello Time  2sec  Max Age 20sec  Forward Delay 15sec
             Aging Time  20
 
/*查看SW3的生成树信息,优先级相同,同样是因为MAC地址比SW1大*/
SW3#show spanning-tree
VLAN0001
  Spanning tree enabled protocol ieee
  Root ID    Priority    32769
             Address     0001.9681.2683
             Cost        19
             Port        1(FastEthernet0/1)
             Hello Time  2sec  Max Age 20sec  Forward Delay 15sec
 
  Bridge ID  Priority    32769  (priority 32768 sys-id-ext 1)
             Address     00E0.8F76.269C
             Hello Time  2sec  Max Age 20sec  Forward Delay 15sec
             Aging Time  20
             

可以通过下面的命令将某台交换机的优先级改小,或者设置成动态优先级(即永远比其它交换机的优先级小),这样这台拥有较小优先级的交换机将成为根交换机。


/*首先我随便配置一个优先级*/
SW3(config)#spanning-tree vlan 1 priority 1000
 
/*它提示我,只能是4096的倍数,可以是下面的这些值*/
% Bridge Priority must be in increments of 4096.
% Allowed values are:
  0     4096  8192  12288 16384 20480 24576 28672
  32768 36864 40960 45056 49152 53248 57344 61440
 
/*
 * 本例设置成4096,注意设置针对的是VLAN1,
 * 不同的VLAN优先级可以不同,
 * 不同VLAN的STP选举出来的根交换机也可以不同,
 * 比如SW3现在是VLAN1的根交换机,
 * 假设还存在一个VLAN2,并且在SW1上使用这条命令:
 * spanning-tree vlan 2 priority 4096
 * 那么SW1就将成为VLAN2的根交换机,前提是VLAN2下有端口。
 */
SW3(config)#spanning-tree vlan 1 priority 4096
SW3(config)#end
 
/*过个一两秒,查看SW3的生成树信息,发现他已经成为了根交换机。*/
SW3#show spanning-tree
VLAN0001
  Spanning tree enabled protocol ieee
  Root ID    Priority    4097
             Address     00E0.8F76.269C
             This bridge is the root
             Hello Time  2sec  Max Age 20sec  Forward Delay 15sec
 
  Bridge ID  Priority    4097  (priority 4096 sys-id-ext 1)
             Address     00E0.8F76.269C
             Hello Time  2sec  Max Age 20sec  Forward Delay 15sec
             Aging Time  20
             

使用下面的命令可以让交换机自动动态的调整自己的优先级为整个广播域最小,使用这条命令让SW2成为vlan1的根交换机:


/*首先清除SW3上面手动配置的优先级*/
SW3(config)#no spanning-tree vlan 1 priority
 
/*在SW2上配置自动调整优先级,让SW2动态调整*/
SW2(config)#spanning-tree vlan 1 root primary
 
/*等待几秒钟,查看SW2的生成树信息,发现根交换机变成了自己*/
SW2#show spanning-tree
VLAN0001
  Spanning tree enabled protocol ieee
  Root ID    Priority    16385
             Address     0030.A310.3975
             This bridge is the root
             
3、端口花费和路径花费

根交换机被选举出来后,计算其他交换机到根交换机的花费,STA考虑两种花费,端口花费路径花费路径花费是从根交换机出发到最终交换机前进方向进入的端口花费总和。假设SW1是根交换机,SW1的fa0/3连接SW3的fa0/1,想要改变SW3到根交换机SW1的花费,应该在SW3的fa0/1来改变,而不是在SW1的fa0/3端口上改变。

如果一台交换机有多条路径到达根交换机,这台交换机会选择路径花费最小的那条

根路径开销:

本交换机到达根交换机的总开销,越小越好,开销与带宽有关。

Link Speed Cost(New IEEE Specification) *Cost(Old IEEE Specification)
10Gb/s 2 1
1Gb/s 4 1
100Mb/s 19 10
10Mb/s 100 100


SW3#show spanning-tree
 
VLAN0001
  Spanning tree enabled protocol ieee
  Root ID    Priority    32769
             Address     aabb.cc00.0100
/*
 * 可以看到IOU3到根交换机的花费是100,
 * 这说明SW3的e0/2接口速率是10Mb/s。
 */
             Cost        100
             Port        3 (Ethernet0/2)

尝试修改SW3的e0/2接口到根交换机的花费:


SW3#conf t
/*将IOU3的e0/2接口花费改成300*/
SW(config)#int e0/2
SW3(config-if)#spanning-tree cost 300
SW3(config-if)#end
 
/*
 * 再次查看SW3的生成树信息,发现花费居然变成了200,
 * 这是为什么呢?不是应该为300吗?
 * 另外还发现下面的Port端口也发生了变化,
 * 没有修改前是e0/2,现在是e0/3,
 * 这说明去往根交换机的数据是通过SW3的e0/3发给IOU2再转发给IOU1的,
 * 这是因为我们将SW3的e0/2的花费修改成了300,
 * 然而,通过SW3的e0/3发给SW2再转发给SW1的花费只有200,
 * 即SW3的e0/3的默认花费100,加上SW2的e0/0的默认花费100,
 * 前面也提到了,交换机选取花费最小的那条路径去往根交换机。
 */
SW3#show spanning-tree
 
VLAN0001
  Spanning tree enabled protocol ieee
  Root ID    Priority    32769
             Address     aabb.cc00.0100
             Cost        200
             Port        4 (Ethernet0/3)
             
4、BPDU结构

BPDU包含12个字段:

  • Protocol ID (2字节)

  • Version (1字节)

  • Message type(1字节)

  • Flags:标记域,包含TC(Topology Change,拓扑改变)比特位,TCA(Topology Change Acknowledgment,拓扑改变确认)比特位。(1字节)

  • Root ID:包含了根交换机的BID。(8字节)

  • Cost of path:到根交换机的路径花费。(4字节)

  • Bridge ID:转发BPDU的交换机的BID。(8字节)

  • Port ID:转发BPDU的交换机的PID,PID等于端口优先级(默认128)加端口号,后面会介绍到。(2字节)

  • Message age:BPDU已经存在的时间。(2字节)

  • Max age:BPDU最大存在时间。(2字节)

  • Hello time:根交换机发送配置信息的间隔时间,默认2秒。(2字节)

  • Forward Delay:转发延时,默认15秒。(2字节)

5、端口角色
  • 根端口(Root Port,RP):每个非根交换机上有且仅有一个根端口,稍后的生成树选举中会详细介绍根端口的选举过程。
  • 指派端口(Designated Port,DP):网络上除根端口外,所有允许转发流量的端口,每个网段都有一个指派端口,根交换机上的端口都是指派端口
  • 非指派端口:既不是根端口也不是指派端口,这种端口虽然是激活的但是会被堵塞(Blocking)用来阻止环路,根端口和指派端口都处于转发(Forwarding)状态。
  • 禁用端口:被管理员使用"shutdown"命令关闭的端口称作禁用端口,禁用端口不参与生成树算法。
6、端口状态和BPDU时间

互连交换机通过在一个广播域交换BPDU帧构建一个逻辑上无环的路径,当一台交换机启动后,如果一个交换机端口直接转换到转发状态可能会造成暂时性的环路。为了使用这个逻辑生成树,交换机需要在五种状态间转换,转换会历经三种BPDU时间。

五种端口状态:

  • Down(禁用)状态,可以使用"no shutdown"命令和插入网线来激活。
  • Blocking(阻塞)状态,链路激活后转入阻塞状态,这个状态大约停留20秒,主要用来确定该端口的角色;如果判断出该端口是非指派端口,则将保持在这一状态,即阻塞,如果处在阻塞状态的端口接收不到BPDU了,也会转入下一状态;如果判断出是其他端口角色,则转入下一状态。
  • Listening(侦听)状态,这个状态大约停留15秒,除了接收BPDU外,还向邻居发送BPDU,通知邻居它将参与激活拓扑。
  • Learning(学习)状态,大约停留15秒,开始学习MAC地址。
  • Forwarding(转发)状态,端口可以转发数据帧。

BPDU的时间有三种:Hello Time、Max Age、Forward Delay:

  • Hello时间控制了发送配置BPDU的时间间隔,默认2秒。这是根交换机生成BPDU并向非根交换机发送的间隔。
  • 非根交换机接收到根交换机发送来的BPDU,再从除接收端口以外的其他端口转发出去,如果在2-20秒里面由于网络故障没有新的BPDU从根交换机发送过来,非根交换机将停止向外发送从根交换机接收到的BPDU。如果这种情况持续20秒,也就是最大存活期,非根交换机就使原储存的BPDU无效,并开始寻找新的根端口。所谓最大存活期就是非根交换机丢弃BPDU前用来备份储存它的时间。
  • 转发延时是交换机在侦听状态到学习状态所花的时间,默认是15秒。

一台启动STP的交换机,每个端口从UP到Forwarding所需的时间大约是50秒左右,而普通的二层交换机端口UP到Forwarding瞬间就能完成。这会带来一个问题,那就是如果这台启动STP的交换机的接口连接的是一个终端设备,比如计算机,那么端口加电启动后计算机就要等上50秒才能发送数据,这很不合理,可以使用下面的命令将支持STP的交换机与终端相连的端口设置成快速端口,这样端口从UP到Forwarding也能一瞬间完成了。但要注意,仅在连接计算机的端口上使用快速端口的功能,不要在和其他交换机,集线器网桥相连的端口上使用这个功能,否则很容易造成环路。


/*假设这台交换机的fa0/1到10口都连接的是计算机*/
Switch(config)#int range fa 0/1 - 10
Switch(config-if-range)#spanning-tree portfast

STP收敛

STP的收敛就是整个网络达到稳定的状态,选举出了根交换机,并决定出所有端口的角色,排除所有的潜在环路。

1、STP选举

STP最终收敛成为一个没有环路的网络需要满足下面四点:

  • 每个广播域只能有一个根交换机。
  • 每个非根交换机有且只有一个根端口。
  • 每个网段有且只能有一个指派端口。
  • 既不是根端口也不是指派端口的端口会被阻塞。

选举的四个步骤:

  • 选举根交换机

交换机之间通过发送BPDU来选举根交换机,拥有最小BID的交换机将成为根交换机,每个广播域只能有一个根交换机。

在同一个广播域中的所有交换机都参与选举根交换机,当一台交换机启动时,它假设自己是根交换机,并默认每隔2秒发送一次"次优BPDU"帧,BPDU帧中的Root ID(根交换机的BID)和本机的BID相同。

在一个广播域中的交换机互相转发BPDU帧,并且从接收到的BPDU中读取Root ID,如果读取到的Root ID比本交换机的BID小,交换机更新Root ID为这个较小的Root ID,然后继续转发修改后的BPDU;如果接收的BPDU中的Root ID比本交换机的BID大,那么继续将自己的BID作为Root ID向外发送BPDU,直到最后在同一个生成树实例中拥有一致的Root ID,这个Root ID对应了这个广播域中某台交换机的BID(并且这个BID一定是这个广播域最小的),这台交换机就被选作根交换机。

  • 选举根端口

每个非根交换机有且只有一个根端口

端口ID(2Byte):

​ 端口优先级+端口ID

​ 端口优先级(1字节):缺省优先级为128,范围为1-255,越小越好。

​ 端口ID默认为128

选举依据

1、比较交换机端口的根路径成本。根路径成本低的为根端口:根路径成本,网桥到根网桥的路径上所有链路的成本之和。

2、当根路径成本相同的时候,比较直连的交换机的网桥ID。选择网桥ID小的作为根端口。

3、当网桥ID相同的时候,比较直连端口ID,选择较小的作为根端口。

4、如果发送者的PID也相同,那么比较接收者的PID。

在SW1上查看生成树信息:


SW1#show spanning-tree
/*
 * 这一部分信息就是SW1上面的端口信息,其中Prio下面的就是端口ID,
 * 可以看到SW1的fa0/1默认端口ID是128.1,小于fa0/2的端口ID。
 */
Interface Role Sts Cost  Prio.Nbr Type
-------   ---- --- ----  ----     ----
Fa0/1     Desg FWD 19    128.1    P2p
Fa0/2     Desg FWD 19    128.2    P2p

从输出可以看到,SW1上面的fa0/1拥有较小的端口ID,它对应了SW2的fa0/2端口,所以SW2的fa0/2端口被选举成为根端口。

如果发送者的PID也相同,那么比较接收者的PID,如果SW1的fa0/1连接在一台集线器上,SW2的fa0/1和fa0/2也连接在这台集线器上,线路均为100Mb/s,假设SW1拥有较小的BID被选举成根交换机,SW2现在要选举根端口,首先根据前面说的,比较花费,SW2从两个端口到根交换机SW1的花费都相同;然后SW2比较发送者BID,发送者(SW1)的BID也相同;SW2再比较发送者PID,发现发送者PID也相同(都为SW1的fa0/1端口);这个时候,SW2比较接收者,也就是自己的PID,将自己PID最小的那个端口选举成根端口。

可以根据SW2的生成树信息输出判断,fa0/1拥有更小的PID,所以它被选举成为根端口:


SW2#show spanning-tree
/*
 * 下面这一部分可以看到fa0/1拥有更小的PID 128.1,
 * Root FWD 表示这个端口被选举成为了根端口,并且状态是转发,
 * Altn BLK 表示这个端口既不是根端口也不是指派端口,被阻塞。
 */
Interface Role Sts Cost  Prio.Nbr Type
-------   ---- --- ----- -------- ----
Fa0/1     Root FWD 19    128.1    Shr
Fa0/2     Altn BLK 19    128.2    Shr
 
/*
 * 这里补充一个知识点,端口的优先级默认为128,
 * 而这个端口优先级是可以手动修改的,
 * 可以将fa0/2的优先级通过下面的命令改成100,
 * STP重新收敛后,Fa0/1将被阻塞,Fa0/2将被选举成为根端口,
 * 端口优先级的取值范围一般为0-192或0-255,
 * Cisco Packet Tracer中不支持这一条命令,可以在GNS3中测试。
 */
SW2(config)#int fa 0/2
SW2(config-if)#spanning-tree port-priority 100
/*在GNS3+IOU环境中,重新调整端口优先级后需要手动触发一次根交换机的选举才能让端口改变状态,比如手动在根交换机上配置一个较小的优先级*/
  • 选举指派端口

每个网段有且只有一个指派端口。其实,每个网段都有一个指派交换机,指派交换机上如果有多个端口,再从多个端口中选举出一个成为指派端口,指派端口的选举依照下面的顺序:

1、比较花费;

些路径得到各冗余链路的代价,选择最小的成为通信路径(相应的端口状态变为forwarding),其它的就成为备份路径(相应的端口状态变为blocking)。

STP生成过程中的通信任务由BPDU完成,这种数据包又分为包含配置信息的配置BPDU(其大小不超过35B)和包含拓扑变化信息的通知BPDU(其长度不超过4B)。

posted @ 2017-03-22 16:56  flanker_X  阅读(1286)  评论(0编辑  收藏  举报