• 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 的方法。

  • 相关阅读:
    微服务的优缺点及实践反思
    写在18点39分
    JDK并发包
    AI图1
    梦 周六
    高并发响应时间
    TLS~
    wait与sleep区别
    计算机领域的阿姆达尔定律(Amdahl’s law)
    看界面控件DevExpress WinForms——如何自定义辅助功能属性(下)
  • 原文地址:https://www.cnblogs.com/michael9/p/14160158.html
Copyright © 2020-2023  润新知