弄它!!! 深入了解STP生成树协议

2020-09-03 10:10:41 浏览数 (1)

一、STP出现的背景

STP是一个用于局域网中消除环路的协议。运行该协议的设备通过彼此交互信息而发现网络中的环路,并适当对某些端口进行阻塞以消除环路。由于局域网规模的不断增长,生成树协议已经成为了当前最重要的局域网协议之一。

典型局域网络示意图

如图所示网络中,会产生如下两种情况:

广播风暴导致网络不可用。环路产生广播风暴,这是众所周知的。图,假设交换设备上没有启用STP协议。如果HostA发出广播请求,那么广播报文将被其他两台交换设备的端口port1接收,并分别从端口port2广播出去,然后端口port2又收到另一台交换设备发过来的广播报文,再分别从两台交换设备的端口port1转发,如此反复,最终导致整个网络资源被耗尽,网络瘫痪不可用。

MAC地址表震荡导致MAC地址表项被破坏。

如图所示,即使是单播报文,也有可能导致交换设备的MAC地址表项混乱,以致破坏交换设备的MAC地址表。

假设图所示的网络中没有广播风暴,HostA发送一个单播报文给HostB,如果此时HostB临时从网络中移去,那么交换设备上有关HostB的MAC地址表项也将被删除。此时HostA发给HostB的单播报文,将被交换设备S1的端口port1接收,由于S1上没有相应的MAC地址转发表项,该单播报文将被转发到端口port2上,然后交换设备S2的端口port2又收到从对端port2端口发来的单播报文,然后又从port1发出去。如此反复,在两台交换设备上,由于不间断地从端口port1、port2收到主机A发来的单播报文,交换设备会不停地修改自己的MAC地址表项,从而引起了MAC地址表的抖动。如此下去,最终导致MAC地址表项被破坏。

二、 STP基本概念

1、一个根桥

树形的网络结构必须有树根,于是STP引入了根桥(Root Bridge)概念。

对于一个STP网络,根桥在全网中只有一个,它是整个网络的逻辑中心,但不一定是物理中心。根桥会根据网络拓扑的变化而动态变化。

网络收敛后,根桥会按照一定的时间间隔产生并向外发送配置BPDU,其他设备仅对该报文进行处理,传达拓扑变化记录,从而保证拓扑的稳定。

2、两种度量

生成树的生成计算有两大基本度量依据:ID和路径开销。

(1) ID

ID又分为:BID(Bridge ID)和PID(Port ID)。

  • BID:桥ID

IEEE 802.1D标准中规定BID是由16位的桥优先级(Bridge Priority)与桥MAC地址构成。BID桥优先级占据高16位,其余的低48位是MAC地址。

在STP网络中,桥ID最小的设备会被选举为根桥。

  • PID:端口ID PID由两部分构成的,高4位是端口优先级,低12位是端口号。

PID只在某些情况下对选择指定端口有作用。

(2)路径开销

路径开销(Path Cost)是一个端口变量,是STP协议用于选择链路的参考值。STP协议通过计算路径开销,选择较为“强壮”的链路,阻塞多余的链路,将网络修剪成无环路的树形网络结构

在一个STP网络中,某端口到根桥累计的路径开销就是所经过的各个桥上的各端口的路径开销累加而成,这个值叫做根路径开销(Root Path Cost)。

3、三要素选举

从环形网络拓扑结构到树形结构,总体来说有三个要素:根桥、根端口和指定端口。以下结合 1介绍三要素。

STP网络结构

  • 根桥RB(Root Bridge)
  • 根桥就是网桥ID最小的桥,通过交互配置BPDU协议报文选出最小的BID。
  • 根端口RP(Root Port)

所谓根端口就是去往根桥路径开销最小的端口,根端口负责向根桥方向转发数据,这个端口的选择标准是依据根路径开销判定。在一台设备上所有使能STP的端口中,根路径开销最小者,就是根端口。很显然,在一个运行STP协议的设备上根端口有且只有一个根桥上没有根端口

指定端口DP(Designated Port)

指定桥和指定端口的含义

分类 对于一台设备而言 (指定桥)与本机直接相连并且负责向本机妆发配置消息的设备 (指定端口)指定桥向本机转发配置消息的端口 对于一个局域网而言 负责向本网段妆发配置消息的设备 指定桥向本网段转发配置消息的端口

  • BP1、BP2、CP1、CP2分别表示设备S1、S2、S3的端口。S1通过端口AP1向S2转发配置消息,则S2的指定 桥就是S1,指定端口就是S1的端口AP1。
  • 与局域网LAN相连的有两台设备:S2和S3,如果S2负责向LAN转发配置消息,则LAN的指定桥就是S2,指定端口就是S2的BP2。

指定定桥与指定端口示意图

一旦根桥、根端口、指定端口选举成功,则整个树形拓扑建立完毕。在拓扑稳定后,只有根端口和指定端口转发流量,其他的非根非指定端口都处于阻塞(Blocking)状态,它们只接收STP协议报文而不转发用户流量。

4、四个比较原则

STP选举有四个比较原则,构成消息优先级向量:{ 根桥ID,累计根路径开销,发送设备BID,发送端口PID }。

配置BPDU中携带本端口的主要信息下。

STP网络中的其他设备收到配置BPDU消息后,将比较表2中所述的字段,四个基本比较原则如下:

  • 最小BID:用来选举根桥。运行STP协议的设备之间根据表2所示根桥ID字段选择最小的BID。
  • 最小累计根路径开销:用来在非根桥上选择根端口。在根桥上,每个端口到根桥的根路径开销都是0。
  • 最小发送者BID:当一台运行STP协议的设备要在两个以上根路径开销相等的端口之中选择根端口时,通过STP协议计算,将选择接收到的配置消息中发送者BID较小的那个端口。如图1所示,假设S2的BID小于S3的BID,如果S4的A、B两个端口接收到的BPDU里面的根路径开销相等,那么端口B将成为根端口。
  • 最小PID:用于在根路径开销相同的情况下,不阻塞最小PID的端口,而是阻塞PID值较大的端口。如图3所示的情况下PID才起作用,S1的端口A的PID小于端口B的PID,由于两个端口上收到的BPDU中,根路径开销、发送交换设备BID都相同,所以消除环路的依据就只有PID。 图3 应用到PID进行比较的拓扑

5、五种端口状态

运行STP协议的设备上端口状态如表3所示。

图4 端口状态迁移图

对于STP,影响端口状态和端口收敛有以下3个参数

  • Hello Time 运行STP协议的设备发送配置消息BPDU的时间间隔,用于设备检测链路是否存在故障。 设备每隔Hello Time时间会向周围的设备发送hello报文,以确认链路是否存在故障。当网络拓扑稳定之后,该计时器的修改只有在根桥修改后才有效。新的根桥会在发出的BPDU报文中填充适当的字段以向其他非根桥传递该计时器修改的信息。但当拓扑变化之后,TCN BPDU的发送不受这个计时器的管理。
  • Forward Delay 设备状态迁移的延迟时间。链路故障会引发网络重新进行生成树的计算,生成树的结构将发生相应的变化。不过重新计算得到的新配置消息无法立刻传遍整个网络,如果新选出的根端口和指定端口立刻就开始数据转发的话,可能会造成临时环路。为此,STP采用了一种状态迁移机制,新选出的根端口和指定端口要经过2倍的Forward Delay延时后才能进入转发状态,这个延时保证了新的配置消息传遍整个网络,从而防止了临时环路的产生。 Max Age

端口的BPDU报文老化时间,可在根桥上通过命令人为改动老化时间。

  • Max Age通过配置BPDU报文的传输,可保证Max Age在整网中一致。运行STP协议的网络中非根桥设备收到配置BPDU报文后,报文中的Message Age和Max Age会进行比较:

如果Message Age小于等于Max Age,则该非根桥设备继续转发配置BPDU报文。 如果Message Age大于Max Age,则该配置BPDU报文将被老化。该非根桥设备直接丢弃该配置BPDU,可认为网络直径过大,导致根桥连接失败。

三、STP报文格式

桥ID、路径开销和端口ID等信息,所有这些信息都是通过BPDU协议报文传输。

配置BPDU是一种心跳报文,只要端口使能STP,则配置BPDU就会按照Hello Time定时器规定的时间间隔从指定端口发出。 TCN BPDU是在设备检测到网络拓扑发生变化时才发出。 BPDU报文被封装在以太网数据帧中,目的MAC是组播MAC:01-80-C2-00-00-00,Length/Type字段为MAC数据长度,后面是LLC头,LLC之后是BPDU报文头。以太网数据帧格式如图所示。

配置BPDU

通常所说的BPDU报文多数指配置BPDU。

在初始化过程中,每个桥都主动发送配置BPDU。但在网络拓扑稳定以后,只有根桥主动发送配置BPDU,其他桥在收到上游传来的配置BPDU后,才触发发送自己的配置BPDU。配置BPDU的长度至少要35个字节,包含了桥ID、路径开销和端口ID等参数。只有当发送者的BID或端口的PID两个字段中至少有一个和本桥接收端口不同,BPDU报文才会被处理,否则丢弃。这样避免了处理和本端口信息一致的BPDU报文。

配置BPDU在以下3种情况下会产生:

只要端口使能STP,则配置BPDU就会按照Hello Time定时器规定的时间间隔从指定端口发出。 当根端口收到配置BPDU时,根端口所在的设备会向自己的每一个指定端口复制一份配置BPDU。 当指定端口收到比自己差的配置BPDU时,会立刻向下游设备发送自己的BPDU。

TCN BPDU内容比较简单,只有表1中列出的前3个字段:协议号、版本和类型。类型字段是固定值0x80,长度只有4个字节。

TCN BPDU是指在下游拓扑发生变化时向上游发送拓扑变化通知,直到根节点。TCN BPDU在如下两种情况下会产生:

端口状态变为Forwarding状态,且该设备上至少有一个指定端口。 指定端口收到TCN BPDU,复制TCN BPDU并发往根桥

四、配置STP 功能实例

组网需求

在一个复杂的网络中,网络规划者由于冗余备份的需要,一般都倾向于在设备之间部署多条物理链路,其中一条作主用链路,其他链路作备份。这样就难免会形成环形网络,若网络中存在环路,可能会引起广播风暴和MAC表项被破坏。

网络规划者规划好网络后,可以在网络中部署STP协议预防环路。当网络中存在环路,STP通过阻塞某个端口以达到破除环路的目的。如图1所示,当前网络中存在环路,SwitchA、SwitchB、SwitchC和SwitchD都运行STP,通过彼此交互信息发现网络中的环路,并有选择的对某个端口进行阻塞,最终将环形网络结构修剪成无环路的树形网络结构,从而防止报文在环形网络中不断循环,避免设备由于重复接收相同的报文造成处理能力下降。

配置思路

采用以下思路配置STP功能:

在处于环形网络中的交换设备上配置STP基本功能,包括:

a. 配置环网中的设备生成树协议工作在STP模式。

b. 配置根桥和备份根桥设备。

c. 配置端口的路径开销值,实现将该端口阻塞。

d. 使能STP,实现破除环路。

操作步骤

配置STP基本功能

a.配置环网中的设备生成树协议工作在STP模式

配置交换设备SwitchA的STP工作模式。

代码语言:javascript复制
 <HUAWEI> system-view
 [HUAWEI] sysname SwitchA
 [SwitchA] stp mode stp

配置交换设备SwitchB的STP工作模式。

代码语言:javascript复制
<HUAWEI> system-view
[HUAWEI] sysname SwitchB
[SwitchB] stp mode stp

配置交换设备SwitchC的STP工作模式。

代码语言:javascript复制
 <HUAWEI> system-view
 [HUAWEI] sysname SwitchC
 [SwitchC] stp mode stp

.配置交换设备SwitchD的STP工作模式。

代码语言:javascript复制
<HUAWEI> system-view
 [HUAWEI] sysname SwitchD
 [SwitchD] stp mode stp

b. 配置根桥和备份根桥设备

配置SwitchA为根桥。

代码语言:javascript复制
 [SwitchA] stp root primary

配置SwitchD为备份根桥。

代码语言:javascript复制
[SwitchD] stp root secondary

c. 配置端口的路径开销值,实现将该端口阻塞 配置SwitchA的端口路径开销计算方法为华为计算方法。

代码语言:javascript复制
 [SwitchA] stp pathcost-standard legacy

配置SwitchB的端口路径开销计算方法为华为计算方法。

代码语言:javascript复制
[SwitchB] stp pathcost-standard legacy

配置SwitchC端口GigabitEthernet0/0/1端口路径开销值为20000。

代码语言:javascript复制
[SwitchC] stp pathcost-standard legacy
[SwitchC] interface gigabitethernet0/0/1
[SwitchC-GigabitEthernet0/0/1] stp cost 20000
[SwitchC-GigabitEthernet0/0/1] quit

配置SwitchD的端口路径开销计算方法为华为计算方法。

代码语言:javascript复制
[SwitchD] stp pathcost-standard legacy

d. 使能STP,实现破除环路

将与PC机相连的端口去使能STP

配置SwitchB端口GigabitEthernet0/0/2的STP去使能。

代码语言:javascript复制
   [SwitchB] interface gigabitethernet0/0/2
   [SwitchB-GigabitEthernet0/0/2] stp disable
   [SwitchB-GigabitEthernet0/0/2] quit

配置SwitchC端口GigabitEthernet0/0/2的STP去使能。

代码语言:javascript复制
[SwitchC] interface gigabitethernet0/0/2
   [SwitchC-GigabitEthernet0/0/2] stp disable
   [SwitchC-GigabitEthernet0/0/2] quit

设备全局使能STP

设备SwitchA全局使能STP。

代码语言:javascript复制
   [SwitchA] stp enable

设备SwitchB全局使能STP。

代码语言:javascript复制
   [SwitchB] stp enable

设备SwitchC全局使能STP。

代码语言:javascript复制
   [SwitchC] stp enable

设备SwitchD全局使能STP。

代码语言:javascript复制
   [SwitchD] stp enable

验证配置结果

经过以上配置,在网络计算稳定后,执行以下操作,验证配置结果。 在各个交换机上执行display stp brief命令,查看端口状态和端口的保护类型,

0 人点赞