- 本文讲述的是802.1d的协议。
基本概念
网桥id的组成
- 4096的倍数 + mac地址
根网桥
- 优先级最小的桥为根网桥,SW1位根网桥,SW2为备份根网桥。
根路径开销
BPDU
BPDU的类型
-
配置bpdu,在拓扑稳定后只有根网桥才发送的。生成树的计算主要通过这个bpdu来完成的。
-
tcn是链路故障时发送的报文。
bpdu的帧结构
BPDU 数据帧结构
- Bridge Identifier为发送网桥id,这个字段描述的是这个bpdu是哪个桥发送给我的,发送给我bpdu的这个网桥的id。
- 在抓包的时候看到 Bridge Identifier 不是发出bpdu的网桥的优先级也不要奇怪,要去看看flags里是否包含agreement,因为携带agreement标志,的报文,是交换机原封不动的把上游的发来的带proposal的报文返回给上游,只是proposal标志改为agreement的标志了。
STP端口角色及选择
根网桥的选择
- 初始情况每台交换机都以自己为根向外发送bpdu,收到bpdu和自己的优先级进行比较,把优的id写到跟网桥id的字段中。
- 再往外发送的时候,发送的是比较之后选择出比较优的根优先级往外发送。
根端口的选择
- 按顺序比较 路径开销,如果路径开销相等,在比较发送这个bpdu的网桥id,如果也相等,再比较发送这个bpdu的端口id。
- 比较得出0/1为根端口,SW2和SW3的一样,都是选0/1为根端口。
- 上图:通过判断路径开销,距离根最近的端口选为根端口。
- 比较后得出 0/2端口为根端口。
指定端口和替换端口的选举
- 用一句比较容易理解的白话讲,发送的bpdu,比接收的bpdu更优,这个发送的端口就是指定端口。
- 该图已经选好的根端口,接下来选择指定端口。
- 同一个端口上发出的bpdu和接收到的bpdu进行比较,收到的bpdu大的端口是指定端口。
-
sw2和sw3之间选指定端口,交换机2的id是更优的,所以0/2为指定端口。
-
sw3和sw4之间的链路以同样的方式进行比较,得出来的结果0/1为指定端口。
-
sw4的0/2和sw3的0/2, 不是根端口也不是指定端口,就是阻塞端口。
STP端口状态
端口状态迁移
- 阻塞端口在20s内没收到bpdu,会变成监听状态,15s再收不到bpdu会变成学习状态,再15s收不到会变成转发状态。一共50s。
- 在侦听状态完成了端口角色的选择。
- 选择完端口角色之后,经过一个15s listening,和一个15秒的learning的过程,完成端口由阻塞变为转发的状态。
- 直连链路发生故障时的情况 恢复时间为30s。
RSTP的改进
改进一:拓扑变化立即通知
-
This concept is what makes up the core of the BackboneFast engine. The IEEE 802.1w committee decided to incorporate a similar mechanism into RSTP.
When a bridge receives inferior information from its designated or root bridge, it immediately accepts it and replaces the one previously stored. 这里讲的有点不对。
-
Because Bridge C still knows the root is alive and well, it immediately sends a BPDU to Bridge B that contains information about the root bridge. As a result, Bridge B does not send its own BPDUs and accepts the port that leads to Bridge C as the new root port.
上边的一段描述有错误,但可以作为参考。
下边的讲解是对的
- 一旦A和C之间断开,C就会向B发送一个inferior BPDU ,说C是根。
- B收到这个消息后,会发送一个RLQ去验证老的根还存不存在了,RLQ发到A,A给回一个:我还存在。B收到验证后,会unblock阻塞端口,C和B之间交互bpdu,重新计算他们之间的端口角色。
更为详细的描述,参考文档 《
Understanding STP and RSTP Convergence
》 是由 www.INE.com 公司写的文档。
改进二:边缘端口立即变转发
边缘端口可以立即变转发。
链路类型 link type
point-to-point link: 全双工 rstp的快速特性才能生效
shared link: 半双工 rstp的快速特性无法生效
改进三:PA机制
STP是怎么做的
- 上图:A和Root之间新加一条线。A和root之间的端口就会up,并进入listening状态。A和root之间能够bpdu通信。Root会立刻通过A传播它的bpdu,直到传播到页子为止。
- 当D收到从root经过A传播下来的bpdu的时候,会立刻阻塞P1端口。
- A和root之间的端口是要变转发的,对于stp来说,要等双倍的forwarddelay,也就是2*15=30s之后,才能变为转发状态。在这30s只能A B C 设备是不可达的。
rstp的PA机制改进了该过程
- 也是同样A Root之间加入了一条新的链路,两边端口变为指定端口并阻塞。A一旦接收到Root发来的bpdu(会带有proposal标志),A会阻塞它的边缘端口之外的指定端口,这个过程叫sync。一旦阻塞完成,A会给Root发一个和Root发给A的一样的报文,并设置flag位为agreement,Root收到改agreement,Root的和A相连的端口立刻变为转发。A和Root之间的链路两边端口都变为转发状态。
- A向下的两个端口是阻塞的,同样A向下发送proposal,B C阻塞了他们的非边缘指定端口后会向上发agreement,A收到agreement,会把A 和B,A-C之间的链路变为转发。同理直到D为止。
Proposal/Agreement Sequence
- 上游Root发送proposal
- A收到proposal去阻塞他的非边缘的指定端口,这个过程叫sync。
- A回agreement给Root
- Root和A之间的链路变为转发状态。
- 如果收不到agreement,会像802.1d的stp一样,双倍的forward delay之后,root和A之间的链路才变为转发。
改进四:替换端口立刻变转发 UplinkFast
改进五: 拓扑通知过程
stp(802.1d)是怎么通知的?
- 如上图,tcn先通知到root,root在发tc通知到每台设备。
rstp(802.1w)的改进
只有非边缘端口从非forwarding状态变为forwarding状态的时候引起拓扑改变。
- It starts the TC While timer with a value equal to twice the hello-time for all its non-edge designated ports and its root port, if necessary.
- It flushes the MAC addresses associated with all these ports.
-
It clears the MAC addresses learned on all its ports, except the one that receives the topology change.
-
It flushes the MAC addresses associated with all these ports.
[外链图片转存中…(img-vEg1G3w7-1612858008992)]
-
It clears the MAC addresses learned on all its ports, except the one that receives the topology change.
-
It starts the TC While timer and sends BPDUs with TC set on all its designated ports and root port (RSTP no longer uses the specifc TCN BPDU, unless a legacy bridge needs to be notifed).