大家好,又见面了,我是你们的朋友全栈君。
冗余链路出现的背景
由于公司对网络的可靠性的要求,大部分公司都会增加额外的交换机,防止在某台交换机出现故障时造成网络的无法使用的情况,例如形成如下图的拓扑的结构。
假设 W 和 X 交换中的一台出现故障后,流量依然可以通过 Y 和 Z 到达 B。
虽然说这样的结构可以很好的解决,网络可靠性的问题。但由于这三台交换机构成了一个环路,同时也带了一些额外的问题:
广播风暴:
这里假设 W 不知道 B 的 MAC 地址,会采用泛洪的操作。而此时由于环状的结构,广播数据包会在四台交换机之间来回的传输,占用大量的带宽。
多帧拷贝:
假设 W 不知道 B 的 MAC 地址,此时会泛洪发给 Y 和 X,假设 Y 和 X 知道 B 的 MAC 地址,此时会将数据包以单播的形式发给 Z,而 Z 会将两个单播数据包传给 B. 造成传输冗余的数据帧。
MAC 表不稳定:
同样假设 W 不知道 B 的 MAC,采用泛洪。同时 X,Y,Z 也不知道 B 的 MAC。此时 W 广播后,X 和 Y 会在 MAC 表中记录 A 对应 MAC 在 1 号口,然后继续泛洪给 Z. Z 按照时间顺序假设在 MAC 表中记录的是来自 Y 的数据帧,此时记录的是 2 号口。而由于 Z 也不知道 B 的 MAC,还会广播。此时 Y 和 X 也会收到,此时 MAC 表按照时间顺序,又会改为另一个 2 号口,进而在 1 和 2 口之间来回抖动。
解决环路带来的问题
冷备份
在连接线缆时,仅仅连接一条线路。当这条链路出现问题时,由管理员手动切换至另一根线路。
热备份
线缆正常连接,在接口上进行配置,不允许该接口接受和发送任何设备。通过 STP (Spanning Tree Protocol 生成树)实现。
STP
STP 协议会先进行计算选择一个树根,然后将树根上的一个接口进行阻塞,进而无法构成环路。
STP 选举规则 – 802.1D
在所有设备启动时,所有交换机都认为自己是根,然后广播发送 BPDU(Bridge Protocol Data Unit),然后在 BPDU 中的某些参数选择一个真正的树根。
- 在整个拓扑上,选择一台根交换机。
- 对每台非根交换机上,选择一个根端口(RP)。其实就是在非根交换机上离根交换机最近的端口,如果距离一样,则依次比较 BPDU 内的参数。
- 在每条网线上(每个网络),选一个指定端口(DP)。同样在链路上先找到根交换机最近的端口,如果一样,则依次比较 BPDU.
- 余下端口为 BP,被阻塞的端口。
BPDU 比较参数,按照如下的顺序进行比较:
- 根桥 ID(优先级 0 – 61440,默认值为 32768,配置为 4096 的倍数,根的 MC 地址)先比较优先级,再比较 MAC(交换机的背板 MAC 地址)
- COST(发送者桥 ID 到根桥的距离)
- 发送者桥 ID(优先级,桥 MAC 地址)
- 发送者端口 ID(优先级 0 -240,默认 128,配置为 16 的倍数,接口号)先比优先级,选小的,再比接口号。
例子 1
以下拓扑为例,模拟下选择 BPDU 的过程,假设 MAC 地址大小为:SW1 < SW2 < SW3.
首先判断根桥 ID,如果没有配置过,默认都是一样的。接着会比较 MAC 地址,选出最小的 MAC 作为根桥, 也就是 SW1.
在选出根后,根会每 2s 发送一次 BPDU,然后非根交换机转发 BPDU。
比较 COST,SW1 作为根会向 SW2 和 SW3 转发 BPDU,而 SW2 和 SW3 同时也会转发收到的 BPDU 给对方。这里假设都是百兆链路。
这里以 SW2 为视角,会收到 SW1 发送的 BPDU 和 SW3 转发 SW3 的 BPDU. 对于 SW2 的 1 号接口来说 COST 为 0(发送者为 SW1,根桥 ID 为 SW1),对于 2 号口来说,COST 为 19(发送者 SW3,根桥 ID 为 SW1).
100 M -> COST = 19 10 M -> COST = 100
进而 0 小于 19,1 号口为成为 RP.
同理,在 SW3 的视角,收到 SW1 和 SW2 转发 SW1 的BPDU. 选择 2 号口为 RP.
下面接着选择 DP:
先站在 SW1 和 SW2 这条网段的视角,在该网段可以接收到 SW1 直接发送的 BPDU (记为 SW1 1 号口)和 经过 SW2 和 SW3 转发过来的 BPDU(记为 SW2 1号口). 这里比较下两者的 BPDU.
- 首先比较根桥 ID,都是 SW1,一样,继续比较。
- 比较 COST,
- SW1 1 号口,根桥 ID 和 发送者 ID 都是 SW1,所以 COST 为 0
- SW2 1 号口,根桥 ID 为 SW1,发送者为 SW3, 经过 SW2. 所以 COST=19 19=38
- 0 < 19 , SW1 1 号口为成为 DP.
站在 SW1 和 SW3 这段网络上,同理:
- 首先比较根桥 ID,都是 SW1,一样,继续比较。
- 比较 COST:
- SW1 2 号口,根桥 ID 和 发送者 ID 都是 SW1,所以 COST 为 0
- SW3 2 号口,根桥 ID 为 SW1,发送者为 SW2, 经过 SW3. 所以 COST=19 19=38
- 0 < 19, SW3 2 号口为 DP.
最后站在 SW2 和 SW3 这条网段上:
- 首先比较根桥 ID,都是 SW1,一样,继续比较。
- 比较 COST:
- SW2 2 号口,发送者为 SW2 2 号口,根桥 ID 为 SW1 COST = 19
- SW3 1 号口,发送者为 SW3 1 号口,根桥 ID 为 SW1 COST = 19
- 相等继续比较。
- 比较发送者桥 ID 大小:
- SW2 的 MAC 小于 SW3 的 MAC
- 所以选 SW2 的 2 号口为 DP.
最终,余下接口 SW3 的 1 号口为阻塞接口。
总结一下概念:
RP:到根交换机最近的非根交换机接口
DP:在交换机中的连线上,到达根交换机最近的接口
例子2
首先假设 SW1 MAC 小于 SW2,所以根为 SW1.
选择 RP:
以 SW2 的视角,比较过程如下:
- 根桥 ID 都是 SW1,一样,继续比较.
- 比较 COST,对于 3 和 4 两个口来说,发送者和根桥ID都一样,相等。
- 比较发送者 ID,都是 SW1 本身 一样。
- 比较发送者接口 ID,1 < 2. 所以 3 为 RP。
选择 DP:
以 1,3 连线的视角:
- 根桥 ID 一致。
- 比较 COST, 选择 1 号口。COST=0, 另一个为 19. s所以 1 为 DP.
以 2,4 连线的视角:
- 根桥 ID 一致。
- 比较 COST, 同理选择 2 号口,为 DP.
最后 4 号口为 BLOCK。
这里假设 1,3 口为 10M,2,4 为百兆链路。可以发现如果按照上述的规则,4 号口还是一样会被阻塞。但这不符合常理,因为 2,4 口的带宽明显更大。
所以这里的 COST 比较还需要调整,对于选择 DP 不需要改变。
但对于选择 RP 的过程,COST 的值需要加上入接口的 COST。
也就是说,在 1,3 连线时。COST 的比较值为:1 号口的 COST 为 0 100. 2 号口的 COST 为 0 19. 所以选择为 4 号口。
STP 状态
- Disabled: 禁用状态,STP 协议未开启,或端口未打开。
- Blocking: 阻塞状态,不能转发数据,但可以收 BPDU.
- Listening: 确定端口角色。
- Learning:学习 MAC 地址,建立 MAC 表。
- Forwarding: 转发状态。
在交换机接口打开时,进入到 Listening 状态,进行 STP 的计算,需要等待 15s 转发延时。在选举时,无法转发数据。
当 Listening 状态结束后,进入 Learning 状态,学习 MAC 地址,建立 MAC 地址表,需要等待 15s 转发延时。
之后进入 Forwarding 状态,正常转发数据。
如果是被 STP 阻塞的端口进入 Blocking 状态,不能转发数据,但可以接受 BPDU. 当在 20s 内没有收到 BPDU 时,会进入 Forwarding 状态,开始转发数据。
下面看几个具体的例子:
假设网络发生改变,SW1 和 SW2 之间的线断了。此时,SW2 会认为自己是根,因为 SW3 的端口被阻塞,SW2 收不到 SW3 的 BPDU.
此时 SW2 会发送 BPDU 给 SW3,BPDU 内容为(4096, 1, 4096,接口),但 SW3 之前缓存的 BPDU 是(0, 1,4096,接口),发现缓存的 BPDU 更好,所以不会接受 SW2 发来的 BPDU.
直到 20s 过去后,原有的 BPDU 老化,才会接受的新的 BPDU.
接着,SW3 被阻塞的端口被打开,可以发送自己 BPDU 给 SW2,内容为 (0,1,32768,接口),SW2 收到后,发现比自己的好,因为 SW2 的 MAC 地址小。所以认为 SW1 为根,自己的口为 RP.
综上从开始等待老化的 20s 和重新选择角色的 30s,恢复网络总共可能最长需要 50s 的时间。
再假设 SW1 和 SW3 的线断了。
此时 SW3 的 RP 口失效,所以会重新选择角色。此时阻塞口一直能收到 SW2 的 BPDU,SW3 发现该 BPDU,比自己发送的 BPDU 好。所以认为 SW1 为 根。
该过程,恢复网络最多需要 30s.
再看一个实际的场景:
还是 SW1 和 SW3 的线断了。此时拓扑的恢复可能需要 30s 的时间,但 30s 过后,PC1 和 PC2 还有可能是不通的。
因为之前在未断线时,PC1 PING PC2 是通过 SW2 的接口 1 发送的,在转发时,会查 MAC 地址表,而 PC2 的对应接口是接口 1.
当拓扑改变后,虽然经过 30s 重新确定了角色,但对于 SW2 来说,接口1 和 PC2 的 MAC 地址对应关系依然存在。而 MAC 地址的老化时间是 300s.
所以就意味着还需要 300s 的时间,PC2 才能通过接口 2 发送。
但对于一些对网络连通性的企业来说,如银行等,这样的恢复时间太长了。所以就需要通过另外一种机制,解决该问题。
具体来说就是,当拓扑改变时(一个接口由 Blocking 过度到 forwarding 状态),发生改变的交换机,会从 RP 端口向上游交换机(根交换机方向)发送 TCN BPDU(另一种 BPDU),上游交换机收到后,发送 ACK 确认。
上游交换机继续向根的方向发送 TCN BPDU,直到根收到。并向下游发送 TC 消息。收到 TC 消息的交换机会将自己的 MAC 地址老化时间改为 15s, 并向下游扩散,直到全网。
STP
查看 STP 信息
如果是思科的交换机话,默认会选择 PVST 作为默认的 STP 协议。
其中优先级是将 VLAN 号和优先级组成(4bit vlan 号,16 bit 优先级)。
代码语言:javascript复制# 查看 sw1
sw1#show spanning-tree
VLAN0001
Spanning tree enabled protocol ieee
# 表示根信息
Root ID Priority 32769 # vlan is 1, so priority equal 32768 add 1
Address aabb.cc00.1000 # mac
This bridge is the root # to represent root
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
# 表示自己的信息
Bridge ID Priority 32769 (priority 32768 sys-id-ext 1)
Address aabb.cc00.1000
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300 sec
Interface Role Sts Cost Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Et0/0 Desg(指定端口,DP) FWD 100 128.1 P2p
Et0/1 Desg(指定端口,DP) FWD 100 128.2 P2p
Et0/2 Desg FWD 100 128.3 P2p
Et0/3 Desg FWD 100 128.4 P2p
# 查看 sw2
sw2#show spanning-tree
VLAN0001
Spanning tree enabled protocol ieee
Root ID Priority 32769
Address aabb.cc00.1000
Cost 100
Port 1 (Ethernet0/0)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32769 (priority 32768 sys-id-ext 1)
Address aabb.cc00.2000
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300 sec
Interface Role Sts Cost Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Et0/0 Root FWD 100 128.1 P2p
Et0/1 Desg FWD 100 128.2 P2p
Et0/2 Desg FWD 100 128.3 P2p
Et0/3 Desg FWD 100 128.4 P2p
# 查看 sw3
sw3#show spanning-tree
VLAN0001
Spanning tree enabled protocol ieee
Root ID Priority 32769
Address aabb.cc00.1000
Cost 100
Port 2 (Ethernet0/1)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32769 (priority 32768 sys-id-ext 1)
Address aabb.cc00.3000
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300 sec
Interface Role Sts Cost Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Et0/0 Altn(阻塞端口) BLK 100 128.1 P2p
Et0/1 Root FWD 100 128.2 P2p
Et0/2 Desg FWD 100 128.3 P2p
Et0/3 Desg FWD 100 128.4 P2p
# 调整根-让 SW2 成为根-调整优先级
sw2(config)#spanning-tree vlan 1 root primary
# 调整次根-让 sw3 成为次根
sw3(config)#spanning-tree vlan 1 root secondary
总结
当对网络的可靠性有要求时,一帮会采用连接多台交换机,用于冗余备份,但由于出现环路的风险,需要通过 STP 技术在逻辑上将某些接口阻塞掉,防止形成环路。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/167497.html原文链接:https://javaforall.cn