标题：生成树协议
功能
生成树协议的主要功能有两个：一是在利用生成树算法、在以太网络中，创建一个以某台交换机的某个端口为根的生成树，避免环路。二是在以太网络拓扑发生变化时，通过生成树协议达到收敛保护的目的。
发明者
[1]
生成树协议是由Sun微系统公司著名工程师拉迪亚·珀尔曼博士(Radia Perlman)发明的。
1988 年, 珀尔曼在MIT完成了她的计算机博士科学学位。
珀尔曼在1993年离开了DEC去了Novell工作, 1997她又加入Sun Microsystems 公司。
珀尔曼博士拥有80多个技术发明专利, 其中40多个是在Sun Microsystems 公司发明的。
珀尔曼博士被哈佛大学和华盛顿大学聘请为客座教授。
珀尔曼博士在数据通信领域的经典著作有:
《Interconnections: Bridges, Routers, Switches,and Internetworking Protocols》
《Network Security: Private Communication in a Public World》
珀尔曼博士被授予了许多杰出工程师奖,
她被评为20个数据通信领域最有影响力的人之一。
特点
网桥使用珀尔曼博士发明的这种方法能够达到2层路由的理想境界:冗余和无环路运行。你可以把生成树协议设想为一个各网桥设备记在心里的用于进行优化和容错发送数据的过程的树型结构. 生成树协议（Spanning Tree）定义在 IEEE 802.1D 中，是一种链路管理协议，它为网络提供路径冗余同时防止产生环路。为使以太网更好地工作，两个工作站之间只能有一条活动路径。网络环路的发生有多种原因，最常见的一种是有意生成的冗余－ 万一一个链路或交换机失败，会有另一个链路或交换机替代。
结构思路
生成树协议拓扑结构的思路是: 不论网桥(交换机)之间采用怎样物理联接,网桥(交换机)能够自动发现一个没有环路的拓扑结构的网路，这个逻辑拓扑结构的网路必须是树型的。生成树协议还能够确定有足够的连接通向整个网络的每一个部分。所有网络节点要么进入转发状态，要么进入阻塞状态,这样就建立了整个局域网的生成树。当首次连接网桥或者网络结构发生变化时，网桥都将进行生成树拓扑的重新计算。为稳定的生成树拓扑结构选择一个根桥, 从一点传输数据到另一点, 出现两条以上条路径时只能选择一条距离根桥最短的活动路径。生成树协议这样的控制机制可以协调多个网桥(交换机)共同工作, 使计算机网络可以避免因为一个接点的失败导致整个网络联接功能的丢失, 而且冗余设计的网络环路不会出现广播风暴。
实现
一、802.1D生成树协议概述：1，几个关键的概念：（1）网桥标识（bridge ID)：
①非扩展的：网桥优先级（2bytes）+ MAC地址    ②扩展的：网桥优先级(4bits) + 系统标识（VLAN ID;12bits) + MAC地址
（2）网桥协议数据单元（BPDU）：
①配置（CFG）BPDU: 初始时每个网桥都会发送，假设自己就是根网桥
收敛后，只从根网桥发出，其他网桥在根端口接收后向下中继。
②拓扑改变提示（TCN）BGDU：当拓扑发生变化时，其他网桥可以从根端口发出该BPDU，到达根网桥。
根网桥在配置BPDU中设定TCN位，提示其他网桥快速清理MAC地址表。
（3）时间值：
①HELLO间隔：2秒，CFG BPDU发送间隔
②MAX AGE: 20秒，CFG BPDU的保留时间
③FWD_DELAY: 15秒，监听（listening)和学习（learning)的时间
（4）路径代价：与链路速率相关，用于计算网桥间的距离
（5）端口状态：
①关闭（disable）：端口处于管理关闭状态
②阻塞（blocking）: 不能转发用户数据
③监听（listening）: 接口开始启动
④学习（learning) : 学习MAC地址, 构建MAC表进程项
⑤转发（forwarding）: 可以转发用户数据
（6）选择标准：
①最低的网桥标识号
②最低的路径代价到根网桥
③最低的发送者的网桥标识号
④最低的端口标识号
2，选择操作顺序：
（1）选择一个根网桥：每一个网络选择一个
（2）选择一个根端口：每一个非根网桥选择一个
（3）选择一个指派端口：每一个网段选择一个
（4）非指派端口被放置在阻塞状态二、在园区网中实现生成树协议：1，实现优化的生成树拓扑
（1）每VLAN生成树协议（PVST)：每一个VLAN有一个生成树的计算进程
（2）根网桥的选择：楼内分布层交换机应该成为根网桥，即避免访问层交换机成为根网桥
（3）生成树的负载平衡：配置不同的分布层交换机成为不同VLAN的根网桥
2，配置根网桥：两种方式
（1）定义优先级：
（config)#spanning-tree vlan <vlan-id> priority <priority>
（2）定义交换机为根网桥：
（config)#spanning-tree vlan <vlan-id> root [primary|secondary]三、加速生成树协议的收敛过程：1，端口快速（postfast):
（1）端口立即从阻塞状态进入转发状态，不经过监听和学习状态
（2）应该只将这一特性配置在连接终端主机的端口上，即不应配置在交换机间的端口上。
（3）配置命令：两种方式
①接口配置模式：
（config-if)#spanning-treeportfast
②全局模式：对所有非骨干链路端口生效
（config)#spanning-treeportfastdefault
2，快速生成树协议（RSTP）：802.1w
（1）端口状态：
①丢弃（discarding)：不能转发用户数据
②学习（learning)：学习MAC地址, 构建MAC表进程项
③转发（forwarding）: 可以转发用户数据
（2）端口类型：
①根（root)端口：与802.1D相同
②指派（designated)端口: 与802.1D相同
③预备（alternative)端口: 端口被阻塞，作为根端口的备份
④备份（backup)端口：（learning) : 端口被阻塞，作为指派端口的备份
（3）网桥协议数据单元：
①数据字段：增加了4个字段描述位，说明端口的状态和类型
②CFG BPDU：直接在两两交换机间交换，如果丢失3个BPDU，意味着链路拓扑发生改变。
③TCNBPDU：直接在交换机间泛洪。
（4）快速收敛机制：
①边缘（edge)端口: 连接终端主机的端口，自动实现端口快速特性
②点到点链路：即全双工链路，自动实现快速端口状态改变，不再有max-age和fwd-delay的延迟
（5）配置命令：
（config)#spanning-tree mode rapid-pvst
（6）校验命令：
#show spanning-tree vlan <vlan-id>
#debug spanning-tree四、增强生成树协议的操作性能：1，多进程生成树协议（MSTP):
（1）定义：映射多个vlan生成树计算进程到一个MST的进程；减少PVST的计算负担；实现与CST域的互操作
（2）配置命令：
①进入MST配置模式：
（config)#spanning-tree mst configuration
②定义MST域名：
（config-mst)#name <name>
③定义MST的配置版本号：
（config-mst)#revision <num>
④映射多个VLAN到一个MST进程：
（config-mst)#instance <inst-num> vlan <vlan-range>
⑤定义根网桥：
（config-mst)#spanning-tree mst <inst-num> root [primary|secondary]
（3）校验命令：
#show spanning-tree mst configuration
#show spanning-tree mst <inst-num>
2，以太通道（etherchannel):
（1）定义：
①绑定多条相同的以太网链路作为一个逻辑的通道。
②生成树协议将其看作为一个端口的链路
③实现多链路上的负载平衡和冗余
（2）配置二层的以太通道：
①指定要绑定的端口范围：
（config)#interface range <type slot/port - port>
②定义通道管理协议：
（config-if-range)#channel-protocol [pagp|lacp]
③定义端口到通道：
（config-if-range)#channel-group <group-num> mode on
④定义负载平衡模式：
（config)#port-channel load-banlance <mode>
（3）校验命令：
#show interfaces <num> etherchannel
#show etherchannel <group-num> port-channel
#show etherchannel <group-num> summary五、保护优化的生成树拓扑结构：1，防止“端口快速”的错误：
错误：把交换机连接到了配置了“端口快速”的端口上，可能引起环路问题
（1）BPDU守卫（GUARD)：
①定义：当配置了“端口快速”的端口接收到BPDU时，关闭该端口。
②配置命令：
（config)#spanning-treeportfastbpduguard
③校验命令：
#show spanning-tree summary totals
（2）BPDU过滤（filtering):
①定义：当配置了“端口快速”的端口接收到BPDU时，该端口失去“端口快速”特性。
②配置命令：
（config)#spanning-treeportfastbpdufilter default
③校验命令：
#show spanning-tree summary totals
2，保护现有优化的根网桥：“根守卫”（root guard)
（1）定义：当端口收到一个具有更好的参数的网桥协议数据单元（superiorbpdu)时，
将该端口放置在一个“根不一致（root-inconsistent)”状态，不转发这一BPDU。
（2）配置命令：
（config-if)#spanning-tree guard root
（3）校验命令：
#show spanning-tree inconsistentports
3，阻止可能的生成树的环路：
（1）单向链路检测（UDLD):
①定义: 通过发送检测消息发现物理链路出现单向中断时，关闭该链路端口。
②配置命令：
（config)#udld enable →在所有的光纤端口上启用
或（config-fi)#udld enable →在某一个光纤或非光线端口上启用
③校验命令：
#show udld interface <num>
（2）环路守卫（loop guard):
①定义: 当某一方向端口在MAX-AGE时间后没有收到BPDU时，
将该端口放置在一个“环路非一致（loop-inconsistent）”状态，
阻止该端口发送用户数据。
②配置命令：
（config-if)#spanning-tree guard loop
③校验命令：
#show spantree guard <int-num>
分析
网络专业人士对生成树协议的几点分析见解：
（1）生成树协议提供一种控制环路的方法。采用这种方法，在连接发生问题的时候，你控制的以太网能够绕过出现故障的连接。
（2）生成树中的根桥是一个逻辑的中心，并且监视整个网络的通信。最好不要依靠设备的自动选择去挑选哪一个网桥会成为根桥。
（3）生成树协议重新计算是繁冗的。恰当地设置主机连接端口(这样就不会引起重新计算)，推荐使用快速生成树协议。