MSTP学习笔记

一、概述 

1、产生的背景

        通过前面几章的学习,我们发现,无论是STP或RSTP,它们都是针对一个完整的交换网络来计算单一生成树的。这对于一些小型网络是有效的,而且配置也非常简单。但是对于一些规模比较大、结构比较复杂,特别是多VLAN的交换网络来说,会使得单颗生成树的计算更复杂,甚至最终无法形成一颗无环路的生成树。同时单生成树也无法实现各链路的负载均衡。这时就要用到本章将要介绍的MSTP(Multiple SPpanning Tree Protocol,多实例生成树)了。

        MST与RSTP在许多方面是完全一样的,包括5种主要的端口角色、3种端口状态、3种收敛机制、3种定时器,以及影响拓扑收敛的参数配置等,主要区别就在于MSTP可以在交换网络中划分多个MST(多生成树)域,在一个MST域中又可以有多个MSTI(多生成树实例)。所以,总体上来说,MSTP的基本配置就像RSTP一样简单,不同的只是与多MST、多MSTI相关的特性了。


2、STP与RSTP的缺陷

        通过前面几章我们知道,RSTP已在STP基础上进行了改进,实现了拓扑的快速收敛。但RSTP和STP还存在一个缺陷:由于局域网内所有的VLAN共享一颗生成树,因此无法在VLAN间实现数据流量的负载均衡,被阻塞的冗余链路将不承载任何流量,造成带宽浪费,还有可能造成部分VLAN的报文无法转发。

        这张拓扑当中,SW1与SW2分别用两条链路相连,分别承载VLAN10与VLAN20的业务,逻辑拓扑上看是没有环路的,因为我们使用VLAN将广播域分割成了两个,但是如果启用STP或RSTP则会阻塞掉其中一个端口,这是因为生成树不管你有没有使用VLAN来分割局域网,它只会查看BPDU,如果发现有两条链路就会阻塞其中一条,如果有三条链路就会阻塞其中两条,这样就会导致我们的业务之间无法正常通信。

        这张拓扑当中,我们的PC5和PC6通过SWA作为出口网关去访问外网,PC7和PC8通过SWB作为出口网关访问外网,但是如果这里启用了STP或RSTP的话就有可能出现SWA和SWB与SWC的互联链路被阻塞的情况,那这样的话内部用户想要去访问外网就得走次优路径到达网关去访问外网。


3、MSTP的改进

        为了弥补STP和RSTP的缺陷,IEEE于2002年发布了802.1s标准定义了MSTP。MSTP兼容STP和RSTP,既可以快速收敛,又能使不同VLAN的流量沿各自的路径转发,从而为冗余链路提供了更好的负载分担机制。

        MSTP通过一个交换网络划分多个域,每个域内形成多课内部生成树,各个生成树实例之间彼此独立。然后,MSTP通过VLAN-生成树实例映射表把VLAN和生成树实例联系起来,将多个VLAN捆绑到一个实例当中,并以实例为基础实现负载均衡。

        所谓实例就是一颗生成树中所包含的交换网段(可以先简单理解为一个实例就是一个进程,一个实例就是一颗树)。通过将多个VLAN捆绑到一个实例,可以节省通信开销和资源占用率。MSTP各个实例拓扑的计算相互独立,在这些实例上可以实现负载均衡。可以把多个相同拓扑结构的VLAN映射到一个实例当中,这些VLAN在端口上的转发状态取决于端口在对应MSTP实例的状态。

        同样以上图拓扑为例进行介绍

在这张拓扑当中我们将VLAN10与VLAN20和实例1进行绑定并且配置SWA为实例1的根,VLAN30与VLAN40与实例2进行绑定并且配置SWB为实例2的根。

这样在这张拓扑当中就会形成多颗树在实例1当中计算出来的树的各端口角色为下图所示

在实例2当中计算出来的树的各端口角色为下图所示

通过配置不同的实例绑定不同的VLAN,形成多颗树无环路的树来计算交换网络,实现了所有链路都可以转发数据并不会因为形成环路而导致一条链路闲置浪费带宽的现象


4、MSTP的基本概念

        因为在MSTP网络中可以有多颗生成树实例,就涉及生成树实例的划分及各生成树实例之间的关系等问题,所以与单生成树的STP和RSTP在许多方面存在不同。

1、MSTP网络的层次结构

如下图所示

        一个MSTP网络可以包含一个或多个MST域(MST Region,也称为MST区域),而每个MST域中又可包含一个或多个MSTI。组成每个MSTI的是其中运行STP/RSTP/MSTP的交换设备,MSTI是所有运行STP/RSTP/MSTP的交换设备经MSTP计算后形成的树状网络。

2、MST域

        MST域(Multiple Spanning Tree Region,多生成树域),由交换网络中的多台交换设备以及它们之间的网段所构成。同一个MST域的设备具有下列特点。

  • 都启用了MSTP
  • 具有相同的域名
  • 具有相同的VLAN到生成树实例映射配置(MSTP中发送BPDU时实例中的vlan映射关系是以MD5计算后的形式进行转发的,对端收到这份BPDU时与自己实例中的vlan映射关系计算出来的MD5值进行对比,如果发现不一致则认为不在同一个MST域中)
  • 具有相同的MSTP修订级别配置(如果两端配置的MSTP修订级别不同,对端在收到这份BPDU报文后则认为对端与自己不在同一MST域中)

        一个MSTP网络可以存在多个MST域,各MST域之间在物理上直接或间接相连。用户可以通过MSTP配置命令把多台交换设备划分在同一个MST域内。

如下图所示的MST Region 1域中由交换设备SW7、SW8和SW9构成,有三个MSTI。

MSTI1

MSTI2

MSTI3

3、VLAN映射表

        VLAN映射表是MST域的属性,描述了VLAN和MST域中对应MSTI之间的映射关系。也就是把那些VLAN分别加入哪个MSTI中。一个VLAN只能加入一个MSTI中,即同一个VLAN的数据只能在一个MSTI中传输,而一个MSTI可能对应多个VLAN。但是一台交换机可以位于多个MSTI中,毕竟一台交换机上可以划分多个VLAN。

        如上图所示的MSTP网络,MST Region 1中所包含的VLAN映射表如下。

  • VLAN10映射到MSTI1
  • VLAN20映射到MSTI2
  • VLAN30映射到MSTI3

4、IST

        IST(Internal Spanning Tree,内部生成树)是各个MST域内部的一颗生成树,是仅针对具体的MST域来计算的。但它是一个特殊的MSTI,其MSTI ID为0,即IST通常称为MSTI0。每个MST域中只有一个IST,包括对应MST域中所有互联的交换机。

5、CST

         CST(Common Spanning Tree,公共生成树)是连接整个MSTP网络内所有MST域的一颗单生成树,是针对整个MSTP网络来计算的。如果把每个MST域看作是一台"交换机",每个MST域看成CST的一个节点,则CST就是这些节点"交换机"通过STP或者RSTP计算生成的一颗生成树(SST)。即每个MSTP网络中只有一个CST。每个MST域中的IST是整个MSTP网络CIST在对应MST域中的一个片段。

 6、CIST

        CIST(Common and Internal Spanning Tree,公共和内部生成树)是通过STP或RSTP计算生成的,连接整个MSTP网络内所有交换机的单生成树,由IST 和CST共同构成。这里要注意了,上面介绍的CST是连接交换网络中所有MST域的单生成树,而此处的CIST则是连接交换网络内的所有交换机的单生成树,即每个MSTP网络中也只有一个CIST。交换网络中的所有MST域的IST和CST一起构成一颗完整的生成树,也就是这里的CIST。

7、SST

        构成SST(Single Spanning Tree,单生成树)有两种情况。

  • 运行了STP或RSTP生成树协议的交换机只属于一个生成树。
  • MST域中只有一个交换机,这个交换机构成单生成树。

8、总根

        总根是CIST生成树的根桥,通常是交换网络中最上层的交换机,一个MSTP网络只有一个总根。

9、域根

        因为在MSTP网络中,每MST域都有一个特殊的IST实例,以及许多MSTI实例,所以域根(Regional Root)又分为IST域根和MSTI域根。

        各个MST域中的IST生成树中距离CIST总根最近的交换机是IST域根。总根所在MST域的IST域根就是总根。

        MSTI的域根是对应生成树实例的树根,域中不同的MSTI有各自的域根。而且,MST域内各颗生成树的拓扑不同,域根也可能不同。


五、MSTP的端口角色

        MSTP中的端口角色主要有根端口(root port)、指定端口(designated port)、替代端口(alternate port)、备份端口(backup port)、主端口(master port)、域边缘端口和边缘端口,具体可看下表。其中,根端口、指定端口、AP端口、BP端口和边缘端口这5种主要端口角色的作用与RSTP中对应的端口角色定义完全相同。除边缘端口外,其他端口角色都参与MSTP的计算过程。

端口角色说明
根端口

在非根桥上,离根桥最近的端口是本交换设备的根端口。根交换设备没有根端口,根端口负责向树根方向转发数据。

如下图

指定端口对一台交换设备而言,它的指定端口是向下游交换设备转发BPDU报文的端口。
Alternate端口从配置BPDU报文发送角度来看,Alternate端口就是由于学习到其他网桥发送的配置BPDU报文而阻塞的端口。从用户流量角度来看,Alternate端口提供了从指定桥到根的另一条可切换路径,作为根端口的备份端口。
Backup端口从配置BPDU报文发送角度来看,Backup端口就是由于学习到自己发送的配置BPDU报文而阻塞的端口。从用户流量角度来看,Backup端口作为指定端口的备份,提供了另外一条从根节点到叶节点的备份通路。
Master端口

Master端口是MST域和总根相连的所有路径中最短路径上的端口,它是交换设备上连接MST域到总根的端口。

Master端口是域中的报文去往总根的必经之路,是特殊域边缘端口,Master端口在CIST上的角色是Root port,在其他各实例上的角色都是Master端口。

如下图1所示,SW10交换设备的端口g0/0/4在域内的所有端口中到总根的路径开销最小,所以g0/0/4为Master端口。

域边缘端口

域边缘端口是指位于MST域的边缘并连接其他MST域或SST的端口。

如下图2所示,MST域内的SW10的g0/0/4以及g0/0/3都与其他域直接相连,它们都是本MST域的域边缘端口。

边缘端口

如果指定端口位于整个域的边缘,不再与任何交换设备连接,这种端口叫作边缘端口。边缘端口一般与用户终端设备直接连接。

端口使能MSTP功能后,会默认启用边缘端口自动探测功能,当端口在(2*Hello Timer+1)秒的时间内收不到BPDU报文,自动将端口设置为边缘端口,否则设置为非边缘端口。

图1

图2


六、MSTP的端口状态与收敛机制

        MSTP定义的端口状态也与RSTP中的定义完全相同,也是根据端口是否转发用户流量、接收/发送BPDU报文,把端口状态划分为3种。

  • Forwarding状态:转发状态,既转发用户流量又接收/发送BPDU报文。
  • Learning状态:学习状态,不转发用户流量,只接收/发送BPDU报文。
  • Discarding状态:丢弃状态,只接收BPDU报文,不转发报文。

        与RSTP种的端口状态一样,MSTP的端口状态和端口角色是没有必然联系的,下表详细的写出了各种端口角色能够具有的端口状态。

端口角色

端口状态

根端口/Master端口指定端口域边缘端口Alternate端口Backup端口
Forwarding--
Learning--
Discarding

        根端口、Master端口、指定端口和域边缘端口支持Forwarding、Learning和Discarding状态,Alternate端口和Backup端口仅支持Discarding状态。MSTP的收敛机制与RSTP是完全一样的。在P/A机制方面同样支持普通模式和增强模式两种。


七、MSTP拓扑计算原理

        MSTP将整个二层网络划分为多个MST域,把每个域视为一个节点。各个MST域之间按照STP或RSTP算法进行计算并生成CST(单生成树)。在一个MST域内则是通过MSTP算法计算生成若干个MSTI(多生成树),其中实例0被称为IST。MSTP使用MSTP BPDU(Multiple Spanning Tree Bridge Protocol Data Unit,多生成树桥协议数据单元)作为生成树计算的依据。MST BPDU报文用来计算生成树的拓扑、维护网络拓扑以及传送拓扑变化记录。

1、MSTP向量优先级

        MSTI和CIST拓扑都是根据优先级向量来计算的,这些优先级向量信息包含在MST BPDU中。各交换机互相交换MST BPDU来生成MSTI和CIST。

        参与CIST计算的优先级向量按优先级别从高到低依次是根桥ID、外部路径开销、域根ID、内部路径开销、指定桥ID、指定端口ID、接收端口ID。参与MSTI计算的优先级向量按优先级别从高到低依次是域根ID、内部路径开销、指定桥ID、指定端口ID、接收端口ID。

以上这些优先级向量说明可见下表

优先级向量名称说明
根桥ID根桥ID用于选择CIST中的根桥,计算公司为:Priority(16位)+MAC(48位),其中Priority为MSTI0的优先级。
外部路径开销(ERPC)从MST域根到达总根的路径开开销。MST域内所有交换机上保存的外部路径开销相同。若CIST根桥在域中,则域内所有交换机上保存的外部路径开销为0.
域根ID也就是通常所说的MSTI树根,域根ID用于选择MSTI中的树根,计算公司为:Priority(16位)+MAC(48位),其中Priority为MSTI0的优先级。
内部路径开销(IRPC)本交换机到达域根桥的路径开销。域边缘端口保存的内部路径开销值大于(优先级越低)非域边缘端口保存的内部路径开销。
指定桥CIST或MSTI实例的指定桥是本交换机通往域根的最邻近的上游交换机。如果本本交换机就是总根或域根,则指定桥为自己。
指定端口指定桥上与本交换机根端口相连的端口就是指定端口。其端口ID(Port ID)=Priority(4位)+端口号(12位)。端口优先级必须是16的整数倍。
接收端口接收到BPDU报文的端口。其端口ID(Port ID)=Priority(4位)+端口号(12位)。端口优先级必须是16的整数倍。

        同一类向量比较时,值最小的向量具有最高优先级。具体顺序如下:

  • 首先,比较根桥ID。
  • 如果根桥ID相同,再比较外部路径开销。
  • 如果外部路径开销还相同,再比较域根ID。
  • 如果域根ID仍然相同,再比较内部路径开销。
  • 如果内部路径仍然相同,再比较指定桥ID。
  • 如果指定桥ID仍然相同,再比较指定端口ID。
  • 如果指定端口ID还相同,再比较接收端口ID。

        如果端口接收到的BPDU内包含的配置消息优于端口上保存的配置消息,则端口上原来保存的配置消息被新收到的配置消息替代。端口同时更新交换机保存的全局配置消息。反之,新收到的BPDU被丢弃。

2、CIST的计算

        经过配置消息比较后,首先整个网络中选择一个优先级最高的交换机作为CIST的树根,然后在每个MST域内通过MSTP算法计算生成IST。同时MSTP将每个MST域作为单台交换机对待,通过STP或者RSTP算法在MST域间计算生成CST。CST和IST构成了整个交换机网络的CIST

3、MSTI的计算

        在MST域内,MSTP根据VLAN和生成树实例的映射关系,针对不同的VLAN生成不同的生成树实例。每棵生成树独立进行计算,计算过程与STP计算生成树的过程类似。MSTI具有以下的特点。

  • 每个MSTI独立计算自己的生成树,互不干扰。
  • 每个MSTI的生成树计算方法与RSTP基本相同。
  • 每个MSTI的生成树可以有不同的根、不同的拓扑。
  • 每个MSTI在自己的生成树内发送BPDU。
  • 每个MSTI的拓扑通过命令配置决定(不是自动生成的)。
  • 每个端口在不同MSTI上的生成树参数可以不同。
  • 每个端口在不同MSTI上的角色、状态可以不同。 

4、MSTI生成树算法实现

        在一开始,每台交换机的各个端口会生成以自身交换机为根桥的配置消息,其中根路径开销为0,指定桥ID为自身交换机ID,指定端口为本端口。每台交换机都向外发送自己的配置消息,并在接收到其他配置消息后进行如下处理。

  • 当端口收到比自身的配置消息优先级低(优先级的比较就是上面介绍的向量优先级的比较规则)的配置消息时,交换机把接收到的配置消息丢弃,对该端口的配置消息不进行任何处理。
  • 当端口收到比本端口配置消息优先级高的配置消息时,交换机用接收到的配置消息中的内容替换该端口的配置消息中的内容。然后交换机将该端口的配置消息和交换机上的其他端口的配置消息进行比较,选出最优的配置消息。

计算生成树的步骤如下。

  • 选举根桥。此步是通过比较所有交换机发送的配置消息的树根ID,树根ID值最小的交换机为CIST根桥,或者MST域根桥。
  • 选举非根桥上的根端口。每台非根桥把接收到最优配置消息的那个端口指定为自身交换机的根端口(也可以认为离根桥最近的端口)。
  • 选举指定端口。在这一部又分为了以下两个子步骤。
    • 首先,交换机根据根端口的配置消息和根端口的路径开销,为每个端口计算一个标准的指定端口配置消息:用树根ID替换为根端口配置消息中的树根ID:用根路径开销替换为根端口配置消息中的根路径开销加上根端口的路径开销;用指定桥ID替换为自身交换机的ID;用指定端口ID替换为自身端口ID。
    • 然后,交换机对以上规则计算出来的配置消息和对应端口上原来的配置消息进行比较。如果端口上原来的配置消息更优,则交换机将此端口阻塞,端口的配置消息不变,并且此端口将不再转发数据,只接收配置消息(相当于根端口);如果通过以上替换计算出来的配置消息比端口上原来的配置消息更优,则交换机就将该端口设置为指定端口,端口上的配置消息替换成通过以上替换计算出来的配置消息,并周期性向外发送。
  • 在MSTP生成树拓扑收敛后,非根桥无论是否接收到根桥传来的信息都按照Hello定时器周期性发送BPDU。如果一个端口连续3个Hello时间(这个是缺省的设置)接收不到指定桥(也就是它所连接的上一级交换机)送来的BPDU,那么该交换机认为与此邻居之间的链路出现故障。

5、MSTP对拓扑变化的处理

        在MSTP中检测是否发生了变化的标准是根据一个非边缘端口的状态是否迁移到Forwarding状态,如果是迁移到了Forwarding状态,则会发生拓扑变化。

        交换机一旦检测到拓扑发生变化,进行如下处理

  • 为本交换机的所有非边缘端口启动一个TC While Timer(该计时器值是Hello Time的两倍),并在这个时间内,清空这些端口上学习来的MAC地址。如果是根端口上有状态变化,则启动根端口。
  • 发生状态变化的这些端口向外发送TC BPDU,其中的TC置位,直到TC While Timer超时。根端口总是要发送这种TC BPDU。其他交换机收到TC BPDU,进行以下处理。
    • 清空除收到TC BPDU的端口以外所有的端口学习来的MAC地址。
    • 为所有自己的非边缘指定端口和自己的根端口启动TC While计时器,重复上述过程。

八、MSTP BPDU报文

        MSTP使用MST BPDU(Multiple Spanning Tree Bridge Protocol Data Unit,多生成树桥协议数据单元)作为生成树计算的依据,。MST BPDU报文用来计算生成树的拓扑、维护网络拓扑以及传达拓扑变化记录。

        STP中定义的配置BPDU、RSTP中定义的RST BPDU、MSTP中定义的MST BPDU及TCN BPDU在版本号和类型方面比较可见下表

名称版本类型
配置BPDU00x00
TCN BPDU00x80
RST BPDU20x02
MST BPDU30x02

1、MSTP BPDU报文格式

        MST BPDU报文结构如下图所示。无论是域内的MST BPDU还是域间的MST BPDU,前36字节和RST BPDU相同。从第37字节开始是MSTP专有字段。最后的MSTI配置信息字段由若干MSTI配置信息组连缀而成。各字段说明可见下表。其实这里的CIST相当于RSTP中的单生成树。

字段内容字节数说明
Protocol IDentifier2协议标识符,目前总为0
Protocol Version Identifier1协议版本标识符,STP为0,RSTP为2,MSTP为3
BPDU Type1

BPDU类型

  • 0x00:STP的configuration BPDU。
  • 0x80:STP的TCN BPDU
  • 0x02:RST BPDU或者MST BPDU
CIST Flags1CIST标志字段,与RSTP中的标志字段完全一样
CIST Root IDentifier8CIST的总根桥ID
CIST External Path Cost4CIST外部路径开销,指从本桥所属的MST域到CIST根桥所属的MST域的累计路径开销,类似于RSTP中的根路径开销,也是根据链路带宽计算的
CIST Regional Root Identifier8CIST的域根桥ID,即IST Master的ID,如果总根在这个域内,那么该域的根桥ID就是总根桥ID
CIST Port Identifier2发送BPDU报文的端口在IST中的指定端口ID
Message Age2MST BPDU报文的生存期
Max Age2MST BPDU报文的最大生存期,超时则认为到根交换设备的链路故障
Hello Time2Hello定时器,缺省为2s
Forward Delay2Forward Delay定时器,缺省为15s
Version 1 Length1Version1 BPDU的长度,值固定为0
Version 3 Length2Version3 BPDU的长度
MST Configuration Identifier51MST配置标识符,表示MST域的标签信息,包含4个字段,如下表1所示。只有这里面的4个字段完全相同的,并且互联的交换设备,才属于同一个域。
CIST Internal Root Path Cost4CIST内部路径开销,指从发送BPDU报文的端口到IST Master(主桥)的累计路径开销。CIST内部路径开销也是根据链路带宽计算的
CIST Bridge Identifier8CIST的指定桥ID
CIST Remaining Hops1BPDU报文在CIST中的剩余跳数(每经过一个桥设备跳数减1)
MSTI Configuration Messages(may be absent)16MSTI配置消息。每个MSTI的配置消息占16字节,如果有n个MSTI就占用n*16bytes。单个MSTI配置消息的结构如下表2所示。

表1

字段字节数说明
Configuration Identifier1配置标识符格式选择器,固定为0
Configuration Name32MST域名,32字节长字符串,每个MST域有唯一的配置消息
Revision Level2MST配置修订级别,2字节非负整数
Configuration Digest16配置摘要,利用HMAC-MD5算法将域中VLAN和实例的映射关系加密成16字节的摘要

表2

字段字节数说明
MSTI Flags1MSTI标志位
MSTI Regional Root Identifier8MSTI域根桥ID
MSTI Internal Root Path Cost4MSTI内部路径开销,指从本端口到MSTI域根桥的累计路径开销。MSTI内部路径开销根据链路带宽计算
MSTI Bridge Priority1本桥在MSTI中的桥优先级
MSTI Port Priority1发送MST BPDU的端口在MSTI中的端口优先级
MSTI Remaining Hops1BPDU报文在MSTI中的剩余跳数

2、MSTP BPDU报文格式可配置功能

目前MSTP的BPDU报文存在两种格式。

  • dot1s:IEEE802.1s规定的报文格式
  • legacy:华为私有协议报文格式

        如果端口收发报文格式为缺省支持dot1s或者legacy,这样就存在一个缺点:需要人工识别对端的BPDU格式,然后手工配置命令来决定支持哪种格式。人工识别报文格式比较困难,且一旦配置错误,就有可能导致MSTP计算错误,出现环路。华为采用的端口收发MSTP报文格式可配置(stp compliance)功能,支持自动识别(auto)模式,这样就能够实现对BPDU报文格式的自适应。这样报文收发不但支持dot1s和legacy格式,还能通过auto模式,根据收到的BPDU报文格式自动切换接口支持的BPDU报文格式,使报文格式与对端匹配。

        在自适应的情况下,接口初始支持dot1s格式,收到报文后,格式则和收到的报文格式保持一致。

3、每个Hello Time时间内端口最多能发送BPDU的报文数可配置功能

        Hello Time定时器用于生成树协议定时发送配置消息维护生成树的稳定。如果交换设备在一段时间内没有收到BPDU报文,则会由于消息超时而对生成树进行重新计算。当交换设备成为根交换设备时,该交换设备会以该设置值为时间间隔发送BPDU报文。非根交换设备采用根交换设备所设置的Hello Time时间值。

        华为S系列交换机提供的每个Hello Time时间内端口最多能够发送的BPDU报文个数可配置(Max Transmitted BPDU Number in Hello Time is Configurable)功能,可以设定当前端口在Hello Time时间内配置BPDU的最大发送数目。用户配置的数值越大,表示每Hello TIme时间内发送的报文数越多。适当地设置该值可以闲置端口每Hello Time时间内能发送的BPDU数目,防止在网络拓扑动荡时,BPDU占用过多的带宽资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fanmeang.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值