前导:上次我们说到 不太给力的交换机的控制层面+冗余链路+STP 能做到交换网络无环的可靠转发,那么STP究竟是如何防环的呢?
STP其实是通过保存最优的路径,逻辑的堵塞次优链路,来构成一颗转发树,而树是无环的。当最优路径失效的时候,被堵塞的次优路径中的最优路径能及时还原,以实现数据的正常转发
STP是IEEE定义的一种公有协议,分为三个版本:
标准 | 名称 | |
802.1D | STP | |
802.1W | RSTP | |
802.1S | MSTP 或者MiST或者MST |
以下介绍的为802.1D
生成树报文的封装(基于组播MAC地址发送):
0180.C200.0000 | S.MAC | length | LLC | BPDU | FCS |
那么究竟如何形成无环的转发树呢?
转发树树必然有根(跟桥的选举),每个节点只有唯一的一条最好枝干到树根,(根端口的选举),当主枝干断了,备份枝干得顶替主枝干转发数据(DP和NDP的选择)
而网络设备之间交互的也只有报文了,因此生成树定义了一种报文,叫BPDU (网桥协议数据单元)
交换机之间就是通过交互这类报文通过选举的形式来形成转发树
BPDU的类型:① TCN BPDU 下游交换机感知到拓扑发生变化时向上游发送的拓扑变化通知
②配置BPDU,如下图
华为:
Field | PID | PVI | BPDU Type | Flags | Root ID | RPC | Bridge ID | Port ID | Message Age | Max Age | Hello Time | FwdDelay |
Bytes | 2 | 1 | 1 | 1 | 8 | 4 | 8 | 2 | 2 | 2 | 2 | 2 |
思科:
那么STP是如何通过BPDU报文的交互选举来形成转发树的呢?
第一步:选根桥
第二步:在非根桥上选取跟端口
第三步:在每个网段上选举指定端口和非指定端口
第一步:选根桥:
比较BPDU报文中Root ID
一开始设备都认为自己是根桥,所以发送的BPDU报文Root ID都是自身的BridgeID,MAC地址全球唯一,所以滴定能比出来
Bridge ID;
Field | priority | 最小MAC地址(又称基mac) |
Byte | 2 | 6 |
选举方法:比较root ID
通过先比较优先级,再比较mac地址,最小的成为根,某台交换机一旦成为根,那么只有根能发送BPDU报文
第二步:在非根桥上选取根端口(就是在每个非根桥选取一个到根桥最近的端口)
根端口,即在非根桥上能收到BPDU,且离根桥最好的端口。这个好通过ROOT PAST COST来衡量,交换机每接收到一个BPDU报文就会在根据接收接口的带宽来给BPDU的 ROOT PAST COST 字段加上对应的值,根桥首发的COST为0
带宽 | 10M | 100M | 1G | 10G |
Cisco | 100 | 19 | 4 | 1 |
HuaWei |
(华为的没找到,知道的请告诉我一声,不胜感激)
选举方法:①Root ID
②入方向的Root Path Cost
③转发者的Bridge ID
④发送者的Port ID
⑤接受者的Port ID
Port ID
Field | 端口优先级 | 接口编号对应值 |
Bytes | 1 | 1 |
端口优先级0-255 ,但是必须是16 的倍数,所以可用0-240
一台交换机接口的编号肯定不可能重复,所以一定能比出来
第三步:选取指定端口和非指定端口
在每个交换机的链路两端选出指定接口和非指定接口(就是在交换机的链路两端选出一个发送BPDU更好的接口)
选举方法: ①Root ID
②出方向的Root Path Cost
③转发者的Bridge ID
④发送者的Port ID
注:其实在第二步,生成树就已经形成,第三部选取DP和NDP其实是为了2个目的:
1.角色为NDP的端口会进入blocking状态,不会转发BPDU,相当于遏制了BPDU的无限循环
2.blocking状态也会阻止数据的转发,防环
当选举完成后,必须经过两倍的forward delay 时间(是为了等待整个生成树域的同步,以及MAC地址表的刷新,避免错误老的错误路径转发,避免形成环路),才能进行正常的数据的转发
②配置BPDU TCA 置1
Flag 0x80
③配置BPDU TC位置1
Flag 0x01 当交换机收到这个BPDU之后会把MAC地址表的老化时间改成forward delay 时间
④配置BPDU (收敛后)
Flag 0x00
拓扑变更:①直接拓扑变更:交换机down,或者交换机的接口一down。这种设备自身能察觉的严重行为。行为→重新选举,收敛
②间接拓扑变更: 细微的变更, 光钎单向链路损坏,物理层面无法察觉,但是交换机接口缓存了根桥的BPDU,行为→在老化计时器max age 20S内如果再次收到根桥的BPDU就会刷新计时器,否则就会 发送TCN报文给根桥告诉拓扑变更
③末梢拓扑变更:连结PC的接口的状态改变,也会影响生成树的拓扑变更 (华为认为 只有当接口的状态从down→up 才算拓扑变更)
运行STP协议的设备上端口状态有5种:
Forwarding:转发状态。端口既可转发用户流量也可转发BPDU报文,只有根端口或指定端口才能进入Forwarding状态。
Learning:学习状态。端口可根据收到的用户流量构建MAC地址表,但不转发用户流量。增加Learning状态是为了防止临时环路。
Listening:侦听状态。端口可以转发BPDU报文,但不能转发用户流量。
Blocking:阻塞状态。端口仅仅能接收并处理BPDU,不能转发BPDU,也不能转发用户流量。此状态是预备端口的最终状态。
Disabled:禁用状态。端口既不处理和转发BPDU报文,也不转发用户流量。
STP的缺陷: 当拓扑发生变化,新的配置消息要经过一定的时延才能传播到整个网络,这个时延称为ForwardDelay(转发延时),协议默认值是15秒。在所有网桥收到这个变化的消息之前,若旧拓扑结构中处于转发的端口还没有发现自己应该在新的拓扑中停止转发,则可能存在临时环路。为了解决临时环路的问题,生成树使用了一种定时器策略,即在端口从阻塞状态到转发状态中间加上一个只学习MAC地址,但不参与转发的中间状态,两次状态切换的时间长度都是ForwardDelay,这样就可以保证在拓扑变化的时候不会产生临时环路。但是,这个看似良好的解决方案实际上带来的却是至少两倍Forward Delay的收敛时间!
补充:BPDU中的
message age(类似TTL)根桥始发为0, 这个每当交换机泛洪一次他就+1
max age 默认20S 必须要message age<=max age, 否则直接丢弃BPDU, 也就是说802.1D交换网络最多支持20 台交换机
hello time BPDU每两秒发送一次,根桥可以持续性的检测拓扑是否发生了变化,20S未从根桥收到BPDU,那就说明拓扑出现问题了
根桥发送的BPDU的Bridge ID每经过一个交换机,就变成该交换机的bridge ID