L2:数据链路层, 构建冗余链路 : STP(2)

在之前 STP 的文章中,介绍了 CST (公共生成树协议)。其标准是 802.1d. 可是随着网络规模的扩大,以前的 STP 协议不再适用,陆续又出现了很多新版本的 STP 协议。

如果将生成树分类的话,通常分为两类,公有生成树协议和私有生成树协议。

公有生成树协议:

  • 如老版本的 802.1d.
  • RSTP:快速生成树,802.1.w
  • MSTP:多生成树,802.1s

私有生成树协议:

  • PVST+:每 VLAN 生成树(Cisco 设备默认启用)
  • Rapid PVST+:优化了 PVST+ 的生成树速度

8021.D 版本 STP 存在的问题

假设下图中的 MAC 大小为:SW2 < SW1 < SW3

看这样一个拓扑,假设SW1 和 SW2 间,仅允许在 Vlan 10 中通信,Sw1 和 Sw3 间允许所有 Vlan 通信。

按照 STP 的比较规则,会将 SW3 e0/0 阻塞。

但由于 SW1 和 SW2 间,仅仅允许 Vlan 10 的流量。那么 PC5 产生的流量就无法达到 SW2. 于是就存在 Vlan 可能无法通信的问题。

而且假设 SW2 和 SW1 允许所有 VLAN 通过,这时对于 VLAN 20 的 PC5 来说,想要通过必须走 SW2,其实明明走 SW1 和 SW3 之间的路径更好,所以还有次优路径的问题。

所以使用单生成树会有这样的问题:

  • 部分 VLAN 无法通信
  • 次优路径存在
  • 无法实现流量负载分摊

使用 PVST 解决

为了解决 Vlan 无法通信的问题,思科开发了 PVST+ 协议(每 Vlan 生成树),针对每一个 Vlan 生成一颗生成树。之前产生这个问题的原因,就是因为只有一棵树。

现在假设让 SW2 成为 Vlan 10 的树根。让 SW3 成为 Vlan 20 的树根。

这时按照之前划分方法, 对于 Vlan 10 来说,SW3 的 e/0 被阻塞。Vlan 10 的数据可以正常通信。

对于 Vlan 20 来说,SW2 的 e0/0 被阻塞。Vlan 20 的数据可以正常通信。

现在不光是 Vlan 可以正常通信,还带来了流量负载分担的好处,让 Vlan 10 和 Vlan 20 的流量分开走。

PVST+ 配置

实现 SW2 作为 Vlan 10 的主根,Vlan 20 的备份根。

SW3 作为 Vlan 20 的主根,Vlan 10 的备份根。

# 配置 PC4 - PC7
VPCS> set pcname PC4
PC4> ip 10.1.1.4/24

# 配置 SW1 - SW3 
!
interface Ethernet0/0
 switchport trunk encapsulation dot1q
 switchport mode trunk
!
interface Ethernet0/1
 switchport trunk encapsulation dot1q
 switchport mode trunk
!
interface Ethernet0/2
 switchport access vlan 10
 switchport mode access
!
interface Ethernet0/3
 switchport access vlan 20
 switchport mode access
!

# 在 SW1 上查看配置的 VLAN 信息, 可以看到 SW1 作为 SW2 和 SW3 的主根。
# 而且默认使用的就是 pvst mode

SW1#show spanning-tree summary
Switch is in pvst mode
Root bridge for: VLAN0001, VLAN0010, VLAN0020

Name                   Blocking Listening Learning Forwarding STP Active
---------------------- -------- --------- -------- ---------- ----------
VLAN0001                     0         0        0          2          2
VLAN0010                     0         0        0          3          3
VLAN0020                     0         0        0          3          3
---------------------- -------- --------- -------- ---------- ----------
3 vlans                      0         0        0          8          8

# 同样在 SW2 查看 VLAN 信息, 发现并不是根
SW2#show spanning-tree summary
Switch is in pvst mode
Root bridge for: none

Name                   Blocking Listening Learning Forwarding STP Active
---------------------- -------- --------- -------- ---------- ----------
VLAN0001                     0         0        0          3          3
VLAN0010                     0         0        0          3          3
VLAN0020                     0         0        0          2          2
---------------------- -------- --------- -------- ---------- ----------
3 vlans                      0         0        0          8          8

# 在 SW3 查看 VLAN 信息,发现 VLAN10 和 VLAN20 的阻塞端口都在 SW3 上。
SW3#show spanning-tree summary
Switch is in pvst mode
Root bridge for: none

Name                   Blocking Listening Learning Forwarding STP Active
---------------------- -------- --------- -------- ---------- ----------
VLAN0001                     1         0        0          2          3
VLAN0010                     1         0        0          1          2
VLAN0020                     1         0        0          2          3
---------------------- -------- --------- -------- ---------- ----------
3 vlans                      3         0        0          5          8

现在改变让 SW2 作为 VLAN 10 的根,SW3 作为 VLAN 10 的备份根。

SW2(config)#spanning-tree mode ?
  mst         Multiple spanning tree mode
  pvst        Per-Vlan spanning tree mode
  rapid-pvst  Per-Vlan rapid spanning tree mode
SW2(config)#spanning-tree vlan 10 priority 0
SW2(config)#spanning-tree vlan 20 priority 4096

# 在 SW2 重新查询 VLAN 信息,可以作为 SW2 已经作为 VLAN 10 的根了。其中根桥 ID 为 10.
# 介解释下这里为什么是 10?
# 因为 priority 字段组成是由:优先级(2字节) + MAC 地址组成(6字节)
# 优先级:xxxx xxxx xxxx xxxx bit, 前 4 bit 可以进行调整,以区分优先级。
# 后 12 bit,是分配的 vlan 号,共 4096 个,范围是 1 - 4094,其余两个为保留值。

SW2#show spanning-tree vlan 10

VLAN0010
  Spanning tree enabled protocol ieee
  Root ID    Priority    10
             Address     aabb.cc00.2000
             This bridge is the root
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

  Bridge ID  Priority    10     (priority 0 sys-id-ext 10)
             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               Desg FWD 100       128.1    P2p
Et0/1               Desg FWD 100       128.2    P2p
Et0/2               Desg FWD 100       128.3    P2p

改变让 SW3 作为 VLAN 20 的根,SW2 作为 VLAN 10 的备份根。

SW3(config)#spanning-tree vlan 10 priority 4096
SW3(config)#spanning-tree vlan 20 priority 0

# 同样 VLAN 20 中,SW3 作为根。
SW3#show spanning-tree vlan 20

VLAN0020
  Spanning tree enabled protocol ieee
  Root ID    Priority    20
             Address     aabb.cc00.3000
             This bridge is the root
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

  Bridge ID  Priority    20     (priority 0 sys-id-ext 20)
             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               Desg FWD 100       128.1    P2p
Et0/1               Desg FWD 100       128.2    P2p
Et0/2               Desg FWD 100       128.3    P2p

也可以通过如下命令,更改 VLAN 的根:

spanning-tree vlan 20 root primary
spanning-tree vlan 1- root secondary

RSTP

RSTP - 快速生成树,在 STP 的基础上:优化了生成树的速度, 并重新定义了端口角色和转发状态。

端口角色

将原有的 DP,RP,BP 端口 重新定义为如下端口:

  1. DP:指定端口
  2. RP:根端口
  3. AP:替代端口
  4. BP:备份端口

其中 AP、BP 都是被阻塞的端口:

  • AP 收到其他交换机发来的更优的 BPDU 而阻塞。
    • AP 是 RP 的备份
  • BP 收到自己发来的 BPDU 而阻塞的端口。
    • BP 是 DP 的备份

先看下 AP 接口,假设有这样一个拓扑:

根据之前 STP 的规则,SW3 的 e0/1 接口会被阻塞。而阻塞的原因是因为受到 SW2 发来的 BPDU 优于自己端口发出的 BPDU.

这种因为其他交换机而被阻塞的端口叫做 AP 端口。

现在假设 SW3 e0/0 的 RP 端口 down 了,此时 e0/1 接口就会成为 RP 端口,所以称 AP 是 RP 的备份。

在看 BP 接口,看这样一个拓扑:

SW1 由于某种原因,将自己的两个接口连接到一起, 假设 e0/1 被阻塞,这种被自己发的 BPDU 阻塞的端口叫 BP 端口。

当 e 0/1 down 时,e 0/0 成为 DP 端口。所以说 BP 是 DP 的备份。

转发状态

STP 之前的五个状态重新定义,将 Disabled,Blocking,Listening 三个状态合为一个状态,Discarding.

Discarding:不学习 MAC 地址,不转发数据

Learning:学习 MAC 地址,不转发数据

Forwarding:转发状态

比 STP 收敛更快的原因

  • 引入了边缘端口

    用于连接主机,服务器等终端的端口。配置边缘端口的接口,当交换机开启后,会立即进入到转发状态,不需要等待转发延迟(进行 STP 计算)。

    spanning-tree porfast edge
    

    如果不小心将两个边缘端口连接在一起,接口会形成一个临时的环路,但如果收到接口的 BPDU 后,会变换普通的 STP 端口,进行 STP 计算。

  • 根端口的快速切换机制

    在 RP 失效后,AP 会立刻成为 RP 端口,进行转发。老版本的 STP 会有一个 30s 等待时间。

  • P/A 机制

    在 BPDU 报文中,拓展了 FLAG 字段的用法。

    在老版本 STP 中,FLAG 仅仅用到 TC, TCA 两位。(TC 用于通知拓扑改变,TCA 用于确认收到拓扑改变的通知。)

    在 RSTP 中,8 bit 位全被使用,其中 P 位,表示提议位,A 位,表示许可位。

    假设在网络初始时,有这样一个拓扑(MAC:SW1 < SW2):

    在 SW1 和 SW2 启动后,都认为自己是根,然后认为自己的 e0/0 接口都是 DP 接口,进而转发数据。

    接着会发生 RSTP 版本的 BPDU,由于认为自己跟,所以将 P 位置位。表明自己是跟,所在接口是 DP.

    在 SW2 和 SW1 收到相互发送的 BPDU 后,SW2 发现自己的优先级更小,不能作为根,所以会将下一次要发送的 BPDU A 位置位,表示承认 SW1 是根。

    之后 SW1 e0/0 成为 DP,SW2 e0/0 成为 RP,进行转发数据。

    但通常来讲,在 SW2 发送 A 置位前,会先检查自己的建立的端口是否还有其他交换机,防止形成环路,因为一旦确定 RP 和 DP 后,数据就立刻开始转发了。

    所以 SW2 在置位前,会进行判断:

    • 如果自己连接的接口有 DP 接口,则会将 DP 接口临时变成 Discarding 转态,

    • 如果连接的是边缘端口,保持不变。

    • 如果是 AP 端口,保持不变,因为 AP 本身就被阻塞。

    之后在当前端口 P/A 机制确定后,再对其他端口进行 P/A 过程。

  • 拓扑改变机制

    在之前老版本的 STP 中,一旦拓扑改变,改变的交换机会给上游交换机发送 TCN 通知,上游交换机收到后会回复 TCA,接着上游交换机继续发送 TCN 通知,直到根交换机收到 TCN. 在根收到后,会回复 TCA 确认和 TC. 让下游交换机将 MAC 地址的时间缩短为 15s.

    但 15s 的时间依然很长,在 RSTP 中,让拓扑发送改变时(非边缘端口转变成转发端口 如 AP 到 RP), 发生拓扑改变的交换机会清空故障接口学习到的 MAC 地址,会向上游发送 TC (每2s,发送2 次), 收到 TC 的交换机会清空除接口端口和边缘端口外所有的 MAC 地址,并继续向上游扩散,直至全网。

    从而避免 15s 的等待时间。

MSTP

MSTP (多实例生成树)是目前常用的公有协议,对于思科交换机来说,也仅支持 MSTP 这一种公有协议。

MSTP 和 PVSTP 协议很像,也是根据 VLAN 生成不同的生成树。只不过化为生成树的单位是实例,每个实例可以包含多个 VLAN.

还是这个拓扑:

假设有 VLAN 10 和 VLAN 20 两种 VLAN.

如果将 VLAN 10 作为一个实例,拥有一颗生成树。将 VLAN 20 作为一个实例,拥有一颗生成树。

这时可以将 SW2 作为 VLAN 10 的树根,SW3 作为 VLAN 20 的树根。这样也很好的解决,VLAN 无法通信,次优路径和负载分摊的问题。

而且还可以进一步拓展,将多个 VLAN 放入一个实例,如将 VLAN 10 - VLAN 20 放入实例1的生成树,将 VLAN 20 - 30 放入实例2的生成树。

同时 MSTP 还支持多域的概念,同一个 MSTP 域的设备具有以下特点:

  • 启动 MSTP 并有相同的域名
  • 相同的 VLAN 到生成树实例的映射配置(比如 SW1 有 VLAN10-20,放在实例1里面,SW2 也需要有。)
  • 相同 MSTP 修订级别配置(一个数字,类似于版本)
  • 默认存在一个实例 0

MSTP 配置

# SW1 - SW3 配置 VLAN 10 - 29
# SW2 - SW3 交换机之间的端口配置 trunk

# 在 SW1 配置 MSTP
SW1(config)#spanning-tree mode mst
SW1(config)#spanning-tree mst configuration
# 配置域名
SW1(config-mst)#name CCNP
# 配置实例
SW1(config-mst)#instance 10 vlan 10-19
SW1(config-mst)#instance 20 vlan 20-29
# 配置修订版本
SW1(config-mst)#revision 10

# 指定树根
SW2(config)#spanning-tree mst 10 root primary
SW2(config)#spanning-tree mst 20 root secondary
SW3(config)#spanning-tree mst 10 root secondary
SW3(config)#spanning-tree mst 20 root primary

EtherChannel

有时交换机的带宽无法满足转发流量的需要,就会出现阻塞的情况。一般会升级接口的带宽,但往往特别大的流量不是时常发生。

这样直接升级接口就比较浪费,而且需要手动对接口进行配置,比较麻烦。

为了解决这个问题,EtherChannel 接口出现了,它可以将多个物理接口捆绑在一起同时进行流量的转发,在流量较大时增加连接接口的数量,从链路视角看,相当于同时连接多根链路,实现并行传输。

不但这样,还有一个额外的问题,在之前介绍交换机 STP 的内容时,交换机内部是通过 STP 来防止环路,会将某些接口 Block。如果想用这种并行的链路连接时,就可能形成环路。

为了保证在 STP 不失效的情况下,应用并行链路,就会采用 EtherChannel 配置。会将所有绑定的接口视为同一个接口,保证 STP 还能正常运行。

配置了 EtherChannel 的接口,具有如下优点:

  • 逻辑聚合接口,为 STP 提供一个逻辑接口
  • 高带宽
  • 负载分担(机制是根据 XOR 进行计算,进行分摊流量,比如跟源目的 IP 地址的最后一位进行异或运算。)
  • 链路冗余(在断开下,仍能保持运行)

配置 EtherChannel

配置 EtherChannel 时两种方式:

  1. 手动
    • 手动将交换机上多个端口,捆绑成一个
    • 要求所有成员端口都处于转发状态
  2. 自动学习(Pagp 思科私有,LACP 公有)
    • 不要求所有成员端口处于转发状态,可以存在备份链路(根据优先级确定)

手动配置

# 创建
SW1(config)#interface port-channel 1

# 将手动接口纳入 port-channel
SW1(config)#interface range e0/0 - 2
SW1(config-if-range)#shutdown
# 标识手动配置
SW1(config-if-range)#channel-group 1 mode on
SW1(config-if-range)#no shutdown

# 正常配置 vlan
SW1(config)#interface port-channel 1
SW1(config-if)#switchport trunk encapsulation dot1q
SW1(config-if)#switchport mode trunk

自动学习

LACP 模式:

  • Passive:等待主动的接口,建立连接
  • Active:主动发送消息,和另一端的接口建立连接

下面是 LACP 的建立原则:

# SW1 配置
s1(config)#interface port-channel 1

# bind interfaces
s1(config)#interface range ethernet 0/0 - 1
s1(config)#shutdown
s1(config)#channel-group 1 mode active
s1(config)#no shutdown

# apply configuration
s1(config)#interface port-channel 1
s1(config)#switchport trunk encapsulation dot1q
s1(config)#switchport mode trunk

s1#show ip int bri
s1#show etherchannel summary

# SW2 配置
s2(config)#interface port-channel 1

# bind interfaces
s2(config)#interface range ethernet 0/0 - 1
s2(config)#shutdown
s2(config)#channel-group 1 mode active
s2(config)#no shutdown

# apply configuration
s2(config)#interface port-channel 1
s2(config)#switchport trunk encapsulation dot1q
s2(config)#switchport mode trunk

s2#show ip int bri
s2#show etherchannel summary

Cisco 的私有协议 Pagp 其实 IEEE 的 LACP 内容是一样的,只不过将 Active 状态更名为 Desirable 状态,将 Passive 状态更名为 Auto 状态。

在实现 Port-channel 接口时,有一定的要求,需要配置的双方配置相同:

  1. 物理接口支持 Etherchannel
  2. 物理接口保持一致
  3. 绑定的数量一致
  4. 接口模式一样(如二层接口,三层接口)
  5. 接口类型必须相同(带宽, 速率)
  6. 双工模式一致(全双工/半双工)
  7. 工作模式(LACP,Pagp)
  8. VLAN 相同

总结

今天这篇主要是在基础 STP 生成树上进行了拓展,起始部分讲解了传统 STP 生成树面临的问题及不足,并由此展开,介绍了思科 PVSTP 和 RSTP,MSTP 解决这些问题的思路以及各自的优势。

其中 PVST:调整生成树的数量到多颗,通过针对每个 VLAN 而生成一棵树。

RSTP:主要通过重新定义了端口角色和调整调整转发状态来减少 STP 的收敛速度。

Rapid PVST:则是将 PVST 和 RSTP 结合到一起,具备两种协议的功能。

MSTP:则是现在公有 STP 协议常有协议,通过将不同 VLAN 划分实例中,增加生成树的数量。从而解决部分 VLAN 无法通信,无法负载均摊以及私有路径的问题。

最后介绍了在面临流量激增和需要构建冗余接口时,如何配置 Ether-Channel 的方法。

原文地址:https://www.cnblogs.com/michael9/p/14160158.html