大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
冗余链路出现的背景
由于公司对网络的可靠性的要求,大部分公司都会增加额外的交换机,防止在某台交换机出现故障时造成网络的无法使用的情况,例如形成如下图的拓扑的结构。
假设 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 优先级)。
# 查看 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 技术在逻辑上将某些接口阻塞掉,防止形成环路。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/167497.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...