二层协议-STP和RSTP的区别

1. 端口角色和协议标准

  • STP:
    • RP、AP(状态Blocking,是RP的备份,状态切换需要2个转发延时)、DP
    • 协议标准为IEEE 802.1D
  • RSTP:
    • RP、AP、DP、BP、EP
    • AP是RP的备份,RP失效后,AP立即变为RP;
      BP是DP的备份,DP端口失效后,即3个hello时间内没有收到BPDU报文,然后BP口需要等待一个转发延时才能切换到DP口,切换到DP口之后,还需要一个转发延时才能切换到forwarding状态
    • EP端口变为转发状态不需要经过两个forwarding daly
    • 协议标准为IEEE 802.1w,

2. 端口状态

STP的Forwarding转发流量和BPDU、Learning学习Mac地址但不转发流量、Listening转发BPDU但不转发流量、Blocking不转发BPDU和流量但是能接收BPDU、Disabled啥也不干。
RSTP的状态把STP的5种状态缩减为3种。根据端口是否转发用户流量和学习 MAC地址来划分 :
如果不转发用户流量也不学习MAC地址,那么端口状态就是 Discarding状态;
如果不转发用户流量但是学习MAC地址,那么端口状态就是 Learning状态;
如果既转发用户流量又学习MAC地址,那么端口状态就是 Forwarding状。
Learning状态:非必须阶段,如果没有此阶段,可能出现大量未知单播帧的泛洪

STP端口状态 RSTP端口状态 端口在拓扑中的角色
Forwarding Forwarding RP和DP
Learning Learning RP和DP
Listening Discarding RP和DP
Blocking Discarding AP和BP
Disabled Discarding Disable端口

3. 报文结构(主要是Flag位的区别)

STP

BPDU Verison=00
BPDU Type=00(配置BPDU,比如TCA BPDU、TC BPDU)和80(TCN BPDU)
BPDU Flags如下:
STP
最高位为TCA(确认接收到TCN);最低位为TC(通告拓扑改变),只有STP配置BPDU包才允许将TCA和TC置位

RSTP

BPDU Verison=02(01没有使用,03是MSTP)
BPDU Type=02(RSTP/MSTP BPDU)
RSTP

  • 第4和5位组合:
    • 00表示发送bpdu的端口的端口状态为discarding
    • 01表示发送bpdu的端口的端口状态为learning
    • 11表示发送bpdu的端口的端口状态为forwarding
  • 第2和3位组合:
    • 00表示端口角色为unknown
    • 01表示端口角色为AP/BP
      • 交换机怎么区分是AP还是BP:根据端口收到更优的转发BID的来判断
        如果收到的更优的BPDU的BID不是自己,那么这个端口是AP(说明自己不是RB,自己用来转发的端口是RP,那么备份的AP);否则就是BP(说明自己是RB,那么自己用来转发的端口是DP,那么备份的是BP)
    • 10表示端口角色为RP
    • 11表示端口角色为DP
  • TAC是无作用的,原因是RSTP中无TCN

4. 快速收敛机制

1. 直连故障

直连故障
假设:SW1和SW3之间的链路断开

  1. STP处理:sw3的AP变为RP,状态从blocking需要经过两个转发延时变为forwarding状态,即需要30秒的收敛时间
  2. RSTP处理:sw3的AP变为RP之后,状态会立即变成forwarding即收敛时间很短

2. 非直连故障

非直连故障
假设:SW1和SW3之间插入一台HUB,HUB与SW1之间故障(没有生成树功能,只是透传报文)

  1. STP处理:需要进过MaxAge之后才感受到故障,然后AP变为RP、状态从blocking需要经过两个转发延时变为forwarding状态发现问题20秒,状态转换30秒,即收敛时间需要50秒
  2. RSTP处理:连续丢失3个BPDU包后说明链路故障,然后AP变为RP之后、状态会立即变成forwarding发现问题6秒,状态转换时间忽略不计,即收敛时间6秒(华为就这个场景需要时间因子,即18秒)。为什么需要时间因子?为了防止因为链路阻塞导致没有收到BPDU报文

3. 次优BPDU关联PA协商

当一个端口收到上游的指定桥发来的BPDU报文时,该端口会将自身存储的BPDU与收到的BPDU进行比较。
如果该端口存储的BPDU的优先级高于收到的BPDU,那么该端口会直接丢弃收到的BPDU,立即回应自身存储的 BPDU【STP需要20秒之后回复】。当上游设备收到下游设备回应的BPDU后,上游设备会根据收到的BPDU报文中相应的字段立即更新自己存储的BPDU。由此,RSTP 处理次优BPDU报文不再依赖于任何定时器通过超时解决拓扑收敛,从而加快了拓扑收敛。
非直连故障
假设:SW1和SW2之间的链路断开

  1. STP处理:由于sw2上没有AP,只有RP和DP,RP down之后,认为根桥故障,因此认为自己是根桥,发送次优BPDU,sw3的AP收到次优BPDU,sw3发现跟本地的不一致且没有本地缓存的更优,直接丢弃掉,经过MaxAge之后才感受到sw1和sw2之间的链路故障,则sw3的AP变为DP后发送BDPU,sw2会从DP变为RP发现问题20秒,状态转换30秒,即收敛时间需要50秒
  2. RSTP处理:sw3的AP收到次优BDPU后直接变为DP口,马上发送更优的BPDU(不需要经过延时)触发PA协商,即收敛时间很快

4. P/A协商

灵魂拷问
1. 发送proposal置位的BDPU包的场景:DP口处在Discarding或者Learning状态
2. 响应proposal置位的BDPU包的场景:只有在P2P的链路类型,同时是RP端口角色情况下,才会响应proposal置位的BDPU包
3. 什么是P2P的链路类型:通过端口的双工模式来判断,全双工的端口链路类型为P2P,半双工为Share(共享型)
【如果一端为P2P,一端为Share,则需要经过30秒转发延时,端口状态才能由Discarding变为Forwarding,此时P/A机制不生效】
P/A 机制
P/A 机制协商过程如下:

  1. 因为SW3的DP口不是forwarding状态,那么会触发PA机制,SW3会发送proposal=1的BPDU给SW2,其中的BID是使用SW1的,即更优的BPDU
  2. SW2收到之后,发现自己的BPDU不是最优的,然后将非EP全部阻塞掉,然后将收到更优BPDU报文的DP口转换成RP口,并转换成Forwarding状态,最后发送Agreement=1的BPDU给SW3
  3. SW3收到回应之后,将该DP的状态转换成Forwarding状态
  4. 然后SW3的DP口因为还处在Discarding状态,会继续往下进行PA协商,知道发送的proposal=1的BPDU没有回应则结束,例如这个DP口接的是一个PC,无法收到Agreement=1的BPDU,该PA协商结束,该DP口会进过两个转发延时从Discarding状态变为Forwarding状态

以上P/A 过程可以向下游继续传递。
事实上对于STP,DP的选择可以很快完成即端口角色可以在短时间内确定,主要的速度瓶颈在于:为了避免环路,必须等待足够长的时间,使全网的端口状态全部确定,也就是说必须要等待至少一个Forward Delay所有端口才能进行转发。而RSTP的主要目的就是消除这个瓶颈,通过阻塞自己的非根端口来保证不会出现环路。而使用 P/A 机制加快了上游端口转到Forwarding状态的速度。

增强型的P/A协商(华为私有方案):发送的每个BPDU都会将Agreement=1,即发送方也会将Agreement置位,收到此BPDU的端口立刻进入转发状态

5. 边缘端口

1. 特点

  1. 接入设备进入Forwarding状态,避免等待30秒延迟,直接转发
  2. EP进入Forwarding状态时不产生TC BPDU,即不会触发拓扑改变
  3. EP不转发TC BPDU包,但是EP可以往外发BPDU为什么还会发送bpdu?因为需要让下游设备感知到交换机的存在
  4. 收到TC BPDU不删除MAC地址表
  5. 进行P/A协商时不会被阻塞EP
  6. 收到BPDU后,会变为普通端口,执行STP计算边缘端口也会发送配置BPDU

2. 不足

  1. 临时环路
    (2个端口直接连起来,或者下游接入的交换机不支持生成树)
    临时环路持续0-2秒,收到对方端口发出的BPDU后同时进入阻塞状态,进行生成树的选举,决出一个DP和一个BP,DP在30秒之后进入转发状态,BP维持阻塞状态。
  2. 当边缘端口收到BPDU后,会丧失边缘端口的特性,变成普通端口并进行生成树计算,引起网络震荡。

3. 使用场景

  1. 大型公司内网有很多电脑,上下班时产生大量的TC,造成所有交换机的MAC地址表频繁删除,以至于持续泛洪所有的数据帧,启用边缘端口可以改善网络品质
  2. 接DHCP客户端的端口,使其能快速得到地址
  3. 接重要服务器和IP电话接口,否则在生成树拓扑发生变化时,将被阻塞掉,30秒后才能再次提供服务

4. 边缘端口保护机制

rstp在加快收敛速度的同时,也带来了不少风险,所以设计了很多保护机制来规避这些风险。

  1. 为了加快收敛,设计了EP,但是边缘端口收到BPDU之后会变为普通端口,触发TC,因此设计了BPDU保护,来防止EP属性的改变,从而防止TC引发的网络不稳定
  2. 为了加快收敛,RP失效后,AP变为RP,且不需要等待两个转发延时端口就进入转发状态,这样设计在链路拥塞时,可能导致环路的出现,所以设计了环路保护
  3. 为了加快收敛,所有的设备都可以发送TC BPDU报文,这带来的风险就是所有的设备都可以通过发送TC BPDU来让其他设备删除mac表项,为了规避这个风向,所以设计TC BPDU防护
  4. 因为收敛更快,抢根也更加快速,所以设计了根保护
  1. BPDU保护(全局配置,作用于边缘端口):EP收到BPDU后会被Error-Down
    在交换设备上,通常将直接与用户终端或文件服务器等非交换设备相连的端口配置为EP。正常情况下,EP不会收到BPDU。如果有人伪造BPDU恶意攻击交换设备,当EP接收到BPDU时,交换设备会自动将EP设置为非边缘端口,并重新进行生成树计算,从而引起网络震荡。
    交换设备上启动了BPDU保护功能后,如果EP收到BPDU,EP将被Error-Down,但是EP属性不变,同时通知网管系统。
    恢复方式有两种:1. 手动恢复(shutdown/undo shutdown);2. 自动恢复(error-down auto-recovery cause bpdu-protection interval 时长)这个命令为什么这么设计,为什么不把bpdu-protection放在前面?因为导致端口error-down的方式不止有bpdu保护,还有monitor-link、auto-defend、l2-loop-occurred等
  2. 根保护(只能在DP口下开启):在DP开启根保护,保证根桥不被抢占
    由于维护人员的错误配置或网络中的恶意攻击,网络中合法根桥有可能会收到优先级更高的BPDU,使得合法根桥失去根地位,从而引起网络拓扑结构的错误变动。这种不合法的拓扑变化,会导致原来应该通过高速链路的流量被牵引到低速链路上,造成网络拥塞。
    对于启用根保护功能的DP,其端口角色只能保持为DP。一旦启用根保护功能的DP收到优先级更高的BPDU 时,端口状态将进入Discarding状态,不再转发报文。经过一段时间(通常为两倍的 Forward Delay),如果端口一直没有再收到优先级较高的BPDU,端口会自动恢复到正常的 Forwarding 状态。
    【说明】: Root 保护功能只能在DP上配置生效
  3. 环路保护(在RP或AP下配置,环路保护功能和根保护功能不能同时配置在同一端口)关联直连故障和非直连故障为了防止单向链路故障,在BPDU包的接收端配置(如AP/RP),如果在规定时间范围内在开启了环路防护的端口没有收到BPDU包,会通知网管,并将端口discarding,但是环路防护容易出现误判
    在运行RSTP协议的网络中,根端口和其他阻塞端口状态是依靠不断接收来自上游交换设备的BPDU维持。当由于链路拥塞或者单向链路故障(多出现在光纤网络中)导致这些端口收不到来自上游交换设备的BPDU时,此时交换设备会重新选择根端口。原先的根端口会转变为指定端口,而原先的阻塞端口会迁移到转发状态,从而造成交换网络中可能产生环路。
    环路保护
    如图所示,当 BP2-CP1 之间的链路发生拥塞时(或者是单向链路故障) ,DeviceC由于CP1(RP)在超时时间内收不到来自上游设备的 BPDU 报文,CP2(AP) 转变成了RP,CP1(RP) 转变成DP,从而形成了环路。
  4. 防TC-BPDU攻击(全局配置):指定处理TC包的阈值,在规定时间内只处理阈值范围内的TC包,超出的次数按一次处理
    交换设备在接收到TC-BPDU 报文后,会执行MAC地址表项和ARP表项的删除操作。如果有人伪造TC-BPDU 报文恶意攻击交换设备时,交换设备短时间内会收到很多TC-BPDU报文,频繁的删除操作会给设备造成很大的负担,给网络的稳定带来很大隐患。启用防TC-BPDU 报文攻击功能后,在单位时间内,交换设备处理TC -BPDU报文的次数可配置。如果在单位时间内,交换设备在收到TC-BPDU报文数量大于配置的阈值,那么设备只会处理阈值指定的次数。对于其他超出阈值的TC-BPDU 报文,定时器到期后设备只对其统一处理一次。这样可以避免频繁的删除MAC地址表项和ARP表项,从而达到保护设备的目的。
  5. BPDU过滤:接口不发送也不接收BPDU包,如果应用在EP上,很可能会造成永久环路

5. 拓扑变更

灵魂拷问

  1. TC BPDU包的主要作用:告知下游设备拓扑发生变化,快速刷新MAC地址表,实现快速转发数据
  2. TCN BPDU报文主要作用:用来向上游设备乃至根桥通知拓扑变化
  3. TCA BPDU报文主要作用:上游设备用来告知下游设备已经知道拓扑变化,通知下游设备停止发送TCN BPDU报文

STP拓扑变化处理

在STP中检测拓扑是否发生变化的标准(即发送TCN的条件)

  1. 非根桥的DP口收到TCN BPDU包
  2. Forwarding端口进入disable或者blocking状态(例如PC关机)
  3. 一个端口进入Forwarding状态,并且本地已经存在一个DP(例如PC开机)
TC 处理机制
  1. 在网络拓扑发生变化后,下游设备会不间断地向上游设备发送TCN BPDU报文
  2. 上游设备收到下游设备发来的TCN BPDU报文后,只有指定端口处理TCN BPDU报文,其它端口也有可能收到TCN BPDU报文,但不会处理
  3. 上游设备会把配置BPDU报文中的Flags的TCA位设置1,然后发送给下游设备,告知下游设备停止发送 TCN BPDU报文
  4. 上游设备复制一份TCN BPDU报文,向根桥方向发送
  5. 重复步骤 1、2、3、4,直到根桥收到TCN BPDU报文
  6. 根桥把配置BPDU报文中的Flags的TC位置1后发送,通知下游设备直接删除桥MAC地址表项连续发送35秒=转发延时15秒+MaxAge的20秒,当然RB在发TC时也会设置MaxAge为15秒
  7. 其他设备收到TC置位的BPDU后,知道网络拓扑发生变化,会检测MAC地址的老化时间。如果MAC地址的老化时间(Maxage)大于15秒,均将老化时间设置为15秒,如果MAC地址的老化时间小于15秒,保持不变。

只有根桥才能发从TC BPDU,其余设备只能发送TCN和TCA BPDU

RSTP拓扑变化处理

在RSTP中检测拓扑是否发生变化只有一个标准一个非边缘端口(只有DP)迁移到Forwarding状态
一旦检测到拓扑发生变化,将进行如下处理:

  1. 为本交换设备的所有非边缘指定端口启动一个TC While Timer,该计时器值是Hello Time的两倍
  2. 在这个时间内,清空状态发生变化的端口上学习到的 MAC 地址
    同时,由这些端口向外发送RST BPDU,其中TC置位。一旦TC While Timer超时,则停止发送 RST BPDU即TC置位的BPDU称为RST BPDU
  3. 其他交换设备接收到RST BPDU后,清空所有端口学习到MAC地址,除了收到RST BPDU的端口。然后也为自己所有的非边缘指定端口和根端口启动TC While Timer,重复上述过程,网络中就会产生 RST BPDU 的泛洪

MAC地址清除机制

  1. 发生拓扑改变的设备:只会将除了EP以外的其他端口的MAC地址马上清除
  2. 接收到TC BPDU的设备:会将除了EP和收到TC BPDU的端口之外的其他端口的MAC地址马上清除

每台设备都能发从TC BPDU

补充

BPDU包的发送:

在RSTP中RP、BP、AP只能接受不能发送BPDU包;DP是发送BPDU,收敛以后不接收

  1. 配置BPDU包:
    • STP中只有根桥会周期的发送配置BPDU包,非根桥接收以后从指定端口转发
    • RSTP中每台设备都会周期发送配置BPDU包
  2. TC BPDU包:
    • STP中只有根桥才会发送TC置位的配置BPDU包,而其他的非根桥只能发从TCN BPDU和收到TCN BPDU后回复TCA置位的配置BPDU包
    • RSTP中每台设备都可以发送TC置位的配置BPDU包因此RSTP没有TCN和TCA,完全不需要

选举(依次选举)

1. 根桥RB

BID,一共8字节=4bit优先级+12bit扩展系统ID+6字节的背板最小MAC。本质上,优先级范围为0-15,默认是8
比较BID(越小越优),有三部分级成:优先级+扩展系统ID+MAC,华为的扩展系统ID是0

  1. 优先级越小越优优先级为0,仅是最大可能会成为根桥,不一定是根桥,且该值必须是4096的倍数,默认优先级为32768(=8*4096,最大是15*4096)
  2. MAC地址越小越优

2. 根端口RP

PID由端口优先级+端口编号组成

  1. 根路径开销RPC越小越优
  2. 发送设备BID越小越优
  3. 发送端口PID越小越优(先看优先级,再看编号)
  4. 接收端口PID越小越优(先看优先级,再看编号)

3. 指定端口DP(与RP相同)

  1. 根路径开销RPC越小越优
  2. 发送设备BID越小越优
  3. 发送端口PID越小越优
  4. 接收端口PID越小越优

4. AP的选举(阻塞端口)

非DP,非RP就是AP,端口会被阻塞掉

CST

STP和RSTP只有一棵树,就是CST(公共生成树),不管有多少个Vlan,因此产生MSTP。

计时器(Timer)

RSTP更短的BPDU超时计时,如果一个端口连续3个Hello Time(2秒)时间内没有收到上游设备发送过来的配置BPDU,那么该设备认为与此邻居之间的协商失败【只需要等待6秒】。而不像STP那样需要先等待一个Max Age(20秒)【再加上30秒的转发延时,一共需要50秒】。
【默认情况下华为有一个时间因子,数值为3,所以超时时间为18秒=2*3*3

RSTP和STP的兼容(互操作)

RSTP可以和STP互操作,但此时RSTP会丧失快速收敛等优势。
当一个网段里既有运行STP的交换设备,又有运行RSTP的交换设备时,STP交换设备会忽略RSTP的BPDU;而运行RSTP的交换设备在某端口上收到STP的配置BPDU时,会在两个Hello Time时间之后把自己的端口转换到STP工作模式,发送配置BPDU。


追问

把连接用户PC的端口配置为边缘端口,那为什么边缘端口还要继续发送BPDU,举出一个用到边缘端口发送的BPDU的场景

交换机的边缘端口发出的BPDU是用来让下游设备感受到交换机的存在。比如一个设备的两个边缘端口连接在一起,需要靠检测BPDU来重新确定端口角色,否则就出现永久环路。

临时环路的存在时间

bpdu发送时间+网络传输延时+CPU处理时间

如果交换机上关闭STP,在某一端口分别开启stp、关闭stp、开启EP,哪种forwarding的快?

关闭stp > 开启EP > 开启stp
关闭stp的端口up后即可传输数据;边缘端口上运行stp,所以进入转发状态需要时间,但是很短;开启stp,需要经历两个转发延时之后才能进入转发状态。

如果把边缘端口去掉,端口不听的up/down,用什么解决TC对网络的影响

开启TC-BPDU功能,设置规定时间内处理TC-BPDU的阈值,超出阈值之外的次数在定时器到期后统一进行一次处理。

stp tc-protection
stp tc-protection interval interval-value +指定时间
stp tc-protection threshold threshold +指定时间内可以处理的此时

STP的作用是什么?与IP网络比较为什么二层需要STP

STP是二层的链路管理协议,提供链路冗余的同时防止网络产生环路
IP网络中,使用各种路由协议来传递路由信息,各种路由协议都有自己的防环方法。二层网络如果不启用STP,在出现冗余路径时会导致环路。
IP使用TTL能防环,但是以太帧没有类似TTL的字段用来防环,而且交换机处理数据帧的方法决定了泛洪比较多,交换机处理未知单播帧、组播、广播均采用泛洪的方式,更容易造成数据包环路和广播风暴。

边缘端口为什么会有临时环路,出现环路的场景,已有端口的演变过程

将两个边缘端口直接或间接连接在一起
两个边缘端口均进入转发状态会形成环路,但如果EP收到BPDU后,会阻塞一个端口,环路消失

在收敛时间上,RSTP相对于STP有哪些优势?

  1. stp是基于定时器的,stp中端口角色判定为DP和RP后,需要经过两个转发延时才能进入转发状态,全网收敛至少需要30秒
  2. rstp是基于P/A协商的,rstp中端口角色判定为DP后,只要DP收到agreement置位的bpdu后,接口状态理解变为转发状态;判定为RP后,发送agreement置位的bpdu时,端口就变为了转发状态,全网收敛只需要几秒

RSTP收敛比STP块的基本机制有哪些?

  1. rstp重新定义了RP和AP之间的转换,RP失效之后,AP马上变为RP,并进入转发状态
  2. rstp使用P/A机制可以快速收敛
  3. rstp检测到拓扑变化后,以拓扑变化的设备为中心向外泛洪TC BPDU,更快的通知全网拓扑变化
  4. rstp的端口在3个hello时间内没有收到配置BPDU,认为链路失效,链路检测更快

交换机怎么区分是AP还是BP

根据端口收到更优的转发BID的来判断。
如果收到的更优的BPDU的BID不是自己,那么这个端口是AP(说明自己不是RB,自己用来转发的端口是RP,那么备份的AP);否则就是BP(说明自己是RB,那么自己用来转发的端口是DP,那么备份的是BP)

为什么rstp必须要p2p?

如果不是p2p,P/A协商很复杂,时间会很长,例如一端是share一端p2p,则需要进过两个转发延时才收敛。

学习状态为什么也需要15秒,为什么要有学习状态?

监听状态期间(生成树拓扑改变期间),根桥发送TC=1的配置BPDU,MAC地址表会受TC BPDU的影响进行提前老化,清除错误的MAC地址信息,导致错误的MAC地址老化,也导致空闲的MAC地址老化,如果此时要转发数据帧就会导致大量未知单播帧的泛洪现象,影响网络性能。
通过继续牺牲15秒的收敛时间,设计出学习状态能让交换机在此期间重新构建MAC地址表项,减少单播帧在STP收敛期间产生的大量泛洪行为即通过牺牲收敛时间,来提高网路的转发性能
基于以上两种原因,STP的收敛是完全依赖计时器完成的,收敛速度慢,为了解决临时环路和收敛期间单播帧泛洪,被逼无奈需要等待30秒。