zoukankan      html  css  js  c++  java
  • 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 的方法。

  • 相关阅读:
    ECharts之柱状图 饼状图 折线图
    Vue自定义指令(directive)
    HDU 1231 最大连续子序列
    POJ 2533 Longest Ordered Subsequence
    HDU 1163 Eddy's digital Roots
    HDU 2317 Nasty Hacks
    HDU 2571 命运
    HDU 4224 Enumeration?
    HDU 1257 最少拦截系统
    HDU 2740 Root of the Problem
  • 原文地址:https://www.cnblogs.com/michael9/p/14160158.html
Copyright © 2011-2022 走看看