STP

STP

Scroll Down

一、生成树发展史

1、二层网络

网络的诞生使得人们能够在互联网中分享资源,而网络是由很多个局域网组建而来。二层网络则是通过MAC地址就能够实现通信,二层网络是典型的局域网,用于局域网内进行资源分享、数据通信等功能。二层交换机在默认情况下所有端口都属于同一个VLAN(我们之前说到VLAN就是一个二层网络的实例),也就是二层交换机默认情况下就是一个二层网络。某个公司一开始很小,就购买了一台交换机,连接了1台打印机、1台服务器、多台办公PC(后面统称为业务设备);后来公司逐渐发展壮大,新增加了很多员工,需要更多业务设备,需要扩展二层网络,于是购买了更多的交换机,交换机之间互联组成了一个很大的二层网络,后来考虑安全性和广播域过大将一个VLAN划分成多个VLAN,交换机之间采用trunk连接。但是交换机连着连着就构成了一个环,比如VLAN 1的广播包在三台成环的交换机中传递,会造成广播风暴,导致交换机处理的广播包过多,严重影响交换机性能和业务。为了避免出现这种情况,诞生了STP,STP用于从逻辑上打破二层网络环路的问题。

1)回顾二层网络交换

二层交换数据帧转发处理流程
1st. 查找CAM表:根据以太网帧中的dst MAC,比对CAM表中的MAC

  • 如果dst MAC是广播帧,学习src MAC,然后泛洪;
  • 如果存在,则查询对应的接口,学习src MAC并转发;
  • 如果是未知单播帧,则执行2nd

2nd. 学习src MAC并泛洪转发:学习提取以太网帧中的src MAC,然后将接收该帧的交换机物理接口和该帧的src MAC的对应关系,存到CAM中;然后将该帧泛洪;

广播帧是指帧内的dst MAC为ffff:ffff:ffff
单播帧是指帧内的dst MAC不为ffff:ffff:ffff
泛洪是指将dst MAC为广播地址的帧发送到除接收接口外的其他接口(同属于一个广播域内)或者将数据帧发送给与接收帧的入站端口所属相同VLAN的所有端口。触发泛洪规则:

  • 接收到广播帧
  • 接收到未知单播帧

2)回顾dot1q数据帧解封装

802.1q封装

access端口发送ethernet帧到交换机,根据ethernet帧的src MAC所属的VID和设置的PVID判断是否为native VLAN:

  • 是,是否允许通过trunk链路
    • 允许,则802.1q协议不会插入任何tag字段入帧,转发802.1q帧到trunk链路上
    • 不允许,丢弃
  • 否,是否允许通过trunk链路
    • 允许,则802.1q协议插入tag字段入帧(根据ethernet帧中的src MAC所属VID查询),重新计算FCS,转发802.1q帧到trunk链路上
    • 不允许,丢弃

trunk端口运行的802.1q协议负责802.1q帧封装
access端口收到802.1q帧,会将tag忽略并当作普通ethernet帧处理

802.1q解封装

对端交换机从trunk链路上收到802.1q帧后,判断该帧是否有tag:

  • 有,则根据tag信息判断是哪个VID,然后untag形成ethernet帧,然后根据dst MAC查找CAM表转发
  • 无,则根据配置的PVID和dst MAC查找CAM表转发

3)二层网络环路产生&危害

现网中对冗余链路和设备都有要求,比如下图,SA、SB作为汇聚层交换机,SC作为接入层交换机,两两之间的链路采用冗余设计(etherchannel)。冗余设计的优点就是避免单点故障,增强网络稳定性。但是二层网络在使用冗余技术的同时,需要考虑到二层环路。

stp1.png

二层环路是如何产生的?主机A需要进行二层通信,但是不知道B的MAC,触发ARP请求B的MAC,封装帧为src MAC=A,dst MAC=ffff:ffff:ffff。该帧到交换机,根据二层交换流程,学习src MAC,查看dst MAC为广播帧,执行泛洪。帧从SC到SA和SB,而SA执行相同操作,SA发送给SB,SB同理发送给SC,形成二层环路,每到一次交换机,就会复制广播帧,然后发送,不超过几秒后,整个二层网络充斥着广播帧,严重影响网络通信。二层环路会出现三个严重问题:

  • 重复帧问题:SB收到了2个ARP广播请求帧,从SA和SC发来的
  • 广播风暴问题:SB把这个ARP广播请求帧再次泛洪给了SA,因为广播帧每经过一次泛洪,数量就翻倍。目前交换机转发数据的速率都是微秒级的,所以不到1s两台交换机之间的小型网络就会充斥着上万个数据包,严重影响交换机性能。
  • CAM紊乱:SB从两个接口都收到了源为主机A的MAC地址,它不知道如何记录,该记f0/15对应主机A的MAC还是f0/16对应主机A的MAC地址。尽管现代网络设备的传输效率已经到达微秒级,但是还是会存在时间差

stp2.png

所以总结二层冗余网络的问题就是能够解决单点故障,提高网络容错性,但是容易出现二层环路。冗余技术并不是问题,问题是出在如何解决二层环路。各厂商和标准化机构研发了生成树协议(spanning-tree protocol,STP)来解决冗余网络的二层环路问题。简单的说STP就是在逻辑上“剪断”了二层环路。

2、生成树协议发展史

stp3.png

STP是最初的版本,用来在冗余环路中提供无环的网络拓扑,但是只支持单VLAN,且收敛速度慢。CST(802.1d)是STP的改版,假设整个二层网络中只有一个生成树实例,CST支持所有VLAN使用同一个生成树实例,收敛速度慢,资源消耗低。RSTP(802.1w)是传统STP的升级版,所有VLAN使用同一个生成树实例,无法按VLAN阻塞冗余链路,相比之下RSTP拥有更快的收敛速度,资源消耗中。MST(802.1s)针对所有VLAN使用同一个生成树实例进行改进,将多个VLAN对应到一个生成树实例中,拥有良好的负载分担机制,收敛速度也非常快,资源消耗中高。

关于其他生成树技术包括PVST+、RPVST+等技术很少使用或者基本不用

从问题探索角度去认识生成树:二层网络需要冗余,于是采用冗余链路;但是缺点就是有了冗余,出现了二层环路,于是诞生了STP;但是STP无法实现负载分担,于是诞生了PVST+,PVST+可以实现每个VLAN绑定进一个生成树实例,实现负载分担;又因为STP的收敛速度太慢了,于是诞生了RSTP,RSTP的机制提高了收敛速度;但是RSTP也是只针对所有VLAN使用同一个生成树实例,无法实现负载分担,于是诞生了RPVST+,RPVST+实现了每个VLAN绑定进一个生成树实例;但是RPVST+消耗资源大,于是诞生了MST,MST将多个VLAN绑定进一个生成树实例,资源消耗相对较小,且能实现负载分担。

任何技术的发展都不会因为某项“理想”技术的出现而停滞,生成树协议的发展历程本身就说明了这一点。随着应用的深入,各种新的二层隧道技术不断涌现,例如Cisco的802.1Q Tunneling,华为Quidway S8016的QinQ,以及基于MPLS的二层VPN技术等。在这种新形势下,用户和服务提供商对生成树协议又会有新的需求。生成树协议该往何处走?这个问题虽然现在还没有一个统一的答案,但是各厂商已经开始了这方面的积极探索。也许不久的将来,支持二层隧道技术的生成树协议将成为交换机的标准协议。

二、STP

1、STP原理

1)BPDU

BPDU用于交换STP信息,包括选举制度环路识别拓扑变更等。交换机接收到BPDU后,根据其中的字段进行上述操作。默认情况下启用STP的交换机,每2s向所有端口发送一次config BPDU当拓扑变更时才会发送TCN BPDU。所以BPDU分为两类:

  • config BPDU:config BPDU用于计算STP
  • TCN BPDU:TCN BPDU用于通告拓扑变更。

stp4.png

交换机会向每个端口发送BPDU,BPDU帧首部为src MAC=端口MAC,dst MAC=STP组播地址。BPDU帧结构:

  • protocol id:标识STP
  • BPDU type:标识BPDU类型(config BPDU / TCN BPDU)
  • BPDU flags:TC位,用于响应TCN BPDU
  • Root identifier:根桥BID
  • Root path cost:发送者到根桥的路径开销
  • Bridge identifier:表示发送者BID
  • Port identifier:表示发送者端口ID
  • Hello time:BPDU发送间隔
  • 转发延迟:标识交换机端口必须等待listening、learning状态的时间

stp5.png
BID(桥优先级)是启用STP的交换机的唯一标识。BID范围为0-65535,默认32768(4096的倍数),越小越优。

BID(8 bytes)= 桥优先级(2 bytes)+ MAC地址

PID(端口优先级)是启用STP的交换机的端口唯一标识。PID范围:0-255,默认128,越小越优。

PID(2 bytes)= 端口优先级(1bytes)+ 端口编号

stp6.png

根路径开销指的是本交换机到达根桥交换机的路径总开销,越小越优,与接口带宽相关。etherchannel链路带宽为所捆绑链路的总带宽

STP选举制度中会涉及到以下几个端口角色:

  • 根端口(RP):位于非根桥上,去往根桥的最优路径端口,每台交换机中只有一个根端口
  • 指定端口(DP):位于根桥与非根桥上,根桥所有端口都是指定端口,每条链路上只有一个指定端口
  • 阻塞端口(BP):不转发数据帧

2)STP选举制度

STP的目的就是打破二层网络环路,而打破的关键就是阻塞端口,那么该如何选举出阻塞的端口呢?STP通过选举制度机制来选出阻塞的端口,选举制度通过三步得到一个无环的二层网络:根桥选举根端口选举指定端口选举

根桥选举

启用STP的交换机会被选举出一个交换机作为根桥,选举规则:

  • BID小的当选
  • 如果所有交换机的BID相同,那么比较MAC地址小的当选

网络初始时,所有交换机都认为自己是根桥,从所有端口上每2s发一个config BPDU,帧的主要内容就是认为自己是根桥(Root identifier填自己的BID),随着发送和接收config BPDU。交换机开始对比收到的config BPDU中的Root identifier和自己的BID进行比较,如果这个Root identifier比自身BID大,则忽略该来源帧,如果发现Root identifier比自身的小,则承认选举失败,停止发送config BPDU,改而转发来自该来源config BPDU。随着收敛的进行,根桥被选举出来了。

根桥以默认2s为周期发送config BPDU,其他非根桥交换机转发来自根桥的config BPDU。

stp7.png

根端口选举

非根桥交换机上的端口选举,以交换机为单位选举出一个RP,RP到根桥路径是最优的。到根桥路径的优劣是通过开销来决定。路径开销是去往根桥所有链路的累计开销值,而RP是通向根桥具有最低开销值得端口。选举规则:

  • 带有最低路径开销得端口当选
  • 路径开销相同,比较邻居端口发送来的PID

stp8.png

指定端口选举

以链路为单位选举出一个DP,选举规则:

  • 根桥的端口都是DP
  • 到达根桥最低的路径开销
  • 最低的发送者BID
  • 最低的发送者端口ID

stp9.png

阻塞剩余端口

3)STP端口状态

启用STP的交换机端口必须经历一系列的STP状态。从最初的disabled状态,管理员手动启动端口并通过STP收敛后,最终到达forwarding状态(RP/DP)、blocking状态(阻塞端口)。STP端口状态:

  • Blocking:收BPDU(以从邻居交换机获取根桥的位置与BID),不收发数据帧,不学习MAC地址(BPDU最大存储时间max age为20s)
  • Listening:收发BPDU,不收发数据帧,不学习MAC地址,转发延迟15s
  • Learning:收发BPDU,不收发数据帧,学习MAC地址,转发延迟15s
  • Forwarding:收发BPDU、数据帧,学习MAC地址

转发延迟表示停留在该状态

stp10.png

调整Hello时间:spanning-tree [vlan vlan-id ] hello-time sec
调整转发延迟时间:spanning-tree [vlan vlan-id ]forward-time sec
存储BPDU最大时间:spanning-tree [vlan vlan-id ] max-age sec

默认的hello为2s、转发延迟15s、max-age为20s

4)STP基本工作原理

STP基本工作原理:二层网络范围中的所有交换机运行STP,所有交换机开始监听和每2s发送一次config BPDU,STP开始收敛。根据config BPDU的比较,选举出根桥、非根桥交换机的根端口、所有交换机的指定端口,并阻塞剩余端口,STP收敛完成。如果某个交换机下的二层网络拓扑发生变更,该交换机向上发送TCN BPDU通告整个根桥发生拓扑变更,根桥将TC置位,以此通告整个而成网络拓扑发生变更,STP重新收敛。

在收敛的过程中,交换机的端口发生状态变更,交换机的角色也会发生相应的变更

将STP基本工作原理分为从初始化到收敛完成、从拓扑变更到重新收敛两个过程。那么这两个阶段是否有需要优化的地方?在拓扑变更的结尾会对两个过程进行分析。

2、STP拓扑变更机制

当STP收敛稳定后,如果某台交换机触发了发送TCN BPDU的条件,那么就需要执行拓扑变更机制。当链路发生如下变化会触发TCN BPDU:端口状态从forwarding->blocking、非根桥在DP收到TCN BPDU。一旦发生链路变化,触发了TCN BPDU,那么发生变化的交换机会上报TCN BPDU到RP,RP下发TCN BPDU到整个STP网络,从而通告拓扑变更通知,实现STP重新收敛。

该TCN BPDU不包含实际变更内容,仅用于通知根桥

stp11.png

感知链路变更:SB感知到链路故障,从RP发送TCN,从DP接收到TCN的SC回复SB一个TCN ACK并且从RP发送TCN,根桥从DP收到TCN,根桥得知拓扑变更。

stp12.png

生成树网络通告:根桥将config BPDU中的TC置位,根桥在规定时间内(转发延迟+Max age)持续发送config BPDU,其他交换机收到并转发TC置位的config BPDU,使用转发延时计时器来加速更新CAM中的表项(表项寿命从300s变为15s)。

stp13.png

STP重新收敛:STP整体重新收敛,包括CAM表更新、端口状态转换等

无意义的拓扑变更对网络是有影响的,比如PC关机,access接口会检测到端口down而发送TCN BPDU。如果大量的PC开关机就会导致网络中存在大量的TCN BPDU,这会导致二层网络不稳定。可以通过在接入层交换机的access接口上设置portfast来优化网络。

前文提到了两个阶段其实是可以做出优化的,我们先对两个阶段进行分析:

  • 收敛阶段分析:其实优化点在端口角色的转变上,从端口blocking->listening->learning->forwarding这个过程中,处于listening和learning状态需要共30s
  • 重新收敛阶段分析:如果PC接入到接入层交换机上,也就是access端口,频繁开关机会导致端口角色频繁变化会触发TCN BPDU,从而执行拓扑变更通知,增加STP的收敛时间。

根据以上两个阶段的分析,衍生出了新的协议、STP特性来解决。

3、STP配置

配置交换机成为根桥:spanning-tree vlan 1 root primary
配置交换机成为备份根桥:spanning-tree vlan 1 root secondary
配置桥优先级:spanning-tree vlan 1 priority 优先级值
修改PID(接口):sp vlan 编号 port-priority 优先级值
修改根路径开销(接口):sp vlan 编号 cost 开销值

根路径开销是累加的,而且是基于链路的速率的

sh sp active可以查看到交换机端口状态、hello time、max age、forward delay和根桥信息

stp14.png

stp15.png

4、STP生成树特性

思科为了帮助STP实现快速收敛,提供了许多特性来过滤一些条件下BPDU的收发。特性主要来自两个方面:性能稳定性

  • 提高STP性能特性,提高非RSTP的收敛速度:
    • portfast:接入交换机access端口启用,加速收敛
    • backbonefast:汇聚或核心层交换机上启用,加速收敛
    • uplinkfast:接入交换机上行链路启用,加速收敛
  • 提高STP稳定性特性,防止STP故障:
    • bpduguard:端口收到BPDU,则处于err-disable状态,配合portfast
    • bpdufilter:过滤收发的bpdu数据包,相当于在接口上关闭了stp
    • rootguard:为防止二层环路
    • loopguard:为防止非指定端口,收不到BPDU后,进入转发状态

1)portfast

一台PC连接到某台接入层交换机的access,然后开机。会对STP的两个阶段产生影响:

  1. access端口将经历STP的端口状态的四个阶段的角色变化,转发延迟会产生近30s的时间,在端口角色变为forwarding前,PC无法获取IP地址。
  2. 同时端口状态的变化会导致TCN BPDU的泛洪,影响二层网络性能。

portfast特性会使得端口状态会从blocking->forwarding(即端口down/up),不会导致TCN消息的生成。一般连接PC、服务器的接口都配置成access,access模式接口配置portfast特性将大大加速STP收敛(因为没有无用的TCN);连接其他交换机、路由器的接口不要启用portfast特性,因为会导致接口状态从blocking->forwarding,从而导致物理环路,数据包将无休止的转发下去,直到网络瘫痪。所以portfast特性应用在终端用户接口,配合bpduguard特性来增强端口安全性

全局配置portfast:spanning-tree portfast default

所有access接口启用portfast特性

指定接口配置portfast:spanning-tree portfast [trunk]

  • 指定access/trunk接口启用portfast特性,trunk接口启用是适用特殊场景,比如交换机连接支持trunk的服务器
  • 配置portfast后,IOS会提示会造成短暂的桥接环路
    查看接口portfast状态:sh sp int g0/0 portfast

2)BPDUguard

access端口虽然配置了portfast特性,但是仍然可以接收BPDU,如果portfast特性收到了BPDU,端口状态就又会变更为blocking。bpduguard特性用来保护portfast端口的完整性,如果端口启用了portfast和bpduguard,那么收到BPDU后,端口进入err-disable。

err-disable表示端口被关闭,需要手动开启或等待err-disable超时机制自动恢复

如果某个连接到其他交换机的端口启用了portfast和bpduguard,那么bpduguard将关闭端口,防止物理环路形成。

接口启用bpduguard:spanning-tree bpduguard enable
portfast接口全部启用bpduguard:spanning-tree portfast bpduguard default
查看bpduguard:sh sp summary totals

如果接口未启用portfast,bpduguard将无法生效

3)uplinkfast

如果处于forwarding的端口上行链路故障,其他上行链路接管需要30-50s的收敛时间,uplinkfast可以大幅减少收敛时间。uplinkfast是基于定义的上行链路组,上行链路组由RP和所有提供去往根桥的AP组成。如果RP故障,则意味着主用上行链路故障,那么AP将被立刻顶替为RP。

为了加速收敛时间,所有接入层交换机会使用伪组播方式通过新的forwarding端口向上游网络通告自身所有的MAC地址,故障端口切换不超过1s。

stp16.png

启用uplinkfast:sp uplinkfast

  • 该特性基于整台交换机开启和关闭,无法为单VLAN启用uplinkfast
  • 该特性只能在具有冗余上行链路的接入交换机上启用,如果在中间交换机启用,可能会导致环路,所谓中间交换机是指一边连接根桥一边连接其他交换机。
  • RSTP内置了uplinkfast,无需手动开启
    查看uplinkfast:sh sp uplinkfast

4)bpdufilter

在特殊情况下,有时需要阻止发送BPDU,bpdufilter特性用来阻止端口发送BPDU。配置bpdufilter后,端口收到config BPDU都会被丢弃。这个特性适合ISP,为用户提供2层以太网接入的ISP不希望与用户分享生成树信息,通过在每个用户的接入端口上部署portfast+bpduguard,确保ISP不会向用户发送config BPDU,且忽略来自用户的任何config BPDU。

如果配置了bpduguard和bpdufilter,那只有bpdufilter生效,不要在端口上配置这两种特性

基于端口启用bpdufilter:int g0/0 && sp bpdufilter enable
该端口会忽略收到的BPDU,同时不发送任何BPDU
查看bpdufilter:sh sp summary totals
查看接口bpdufilter:sh sp int g0/0 detail