#import "labtemplate.typ": *
#show: nudtlabpaper.with(title: "生成树协议（STP）配置",
  author: "程景愉", 
  id: "202302723005", 
  training_type: "无军籍",
  grade: "2023",
  major: "网络工程",
  department: "计算机学院",
  advisor: "张军",
  jobtitle: "工程师",
  lab: "306-707",
  date: "2025.09.19",
  header_str: "《网络工程》实验报告",
)
#set page(header: [
    #set par(spacing: 6pt)
    #align(center)[#text(size: 11pt)[《网络工程》实验报告]]
    #v(-0.3em)
    #line(length: 100%, stroke: (thickness: 1pt))
],)

  #show heading: it => box(width: 100%)[
    #v(0.50em)
    #set text(font: "Noto Sans CJK SC")
    #it.body
  ]

#outline(title: "目录",depth: 3, indent: 2em)
#outline(
  title: [图目录],
  target: figure.where(kind: image),
)

  #show heading: it => box(width: 100%)[
    #v(0.50em)
    #set text(font: "Noto Sans CJK SC")
    #counter(heading).display()
    // #h(0.5em)
    #it.body
  ]
#set enum(indent: 0.5em,body-indent: 0.5em,)
#pagebreak()

= 实验目的
#para[
  本实验旨在使学生掌握生成树协议（STP）的基本概念和配置方法，通过实际操作学习如何在网络设备上配置STP，理解其防止环路、优化网络拓扑的功能，并培养分析和解决网络问题的能力。通过实验，学生将深入理解STP在现代网络中的应用，提升实践技能，为未来的网络工程职业生涯和专业认证考试打下坚实的基础。
]
= 实验原理
== STP概述
#para[
  生成树协议（Spanning Tree Protocol，简称STP）是一种工作在OSI模型第二层（数据链路层）的通信协议，其基本应用是防止交换机冗余链路产生的环路，确保以太网中无环路的逻辑拓扑结构，从而避免广播风暴和大量占用交换机资源的问题。
]
== STP工作原理
=== 基本概念
#para[
  STP通过选举一个根交换机（Root Switch）来确定生成树，其他交换机通过计算到根交换机的最短路径来决定端口的状态，从而实现网络中的环路消除。
  以下是一些基本概念的解释：
]

- 网桥（Bridge）：STP在IEEE标准中提出被提出时，是施用于网桥上的。网桥是一种网络设备，用于连接两个或多个局域网段，能够根据数据帧的目的MAC地址来转发数据帧。在STP中，网桥负责维护网络的拓扑结构，防止环路的产生。交换机是一种高级的网桥。
- 根桥（Root Bridge）：根桥是STP网络中的逻辑中心，负责周期性发送配置BPDU（桥协议数据单元），以维持生成树的稳定性。根桥的选举基于桥ID（BID），即桥优先级和桥MAC地址的组合，BID最小的设备会被选举为根桥。
- 桥ID（BID，Bridge ID）：桥ID由两部分组成：桥优先级和桥MAC地址。桥优先级是一个2字节的数值，其取值范围是0到61440，缺省值通常为32768，步长为4096。桥MAC地址是网桥的硬件地址。在STP网络中，桥ID最小的设备会被选举为根桥。
- 端口ID（PID，Port ID）：端口ID由端口优先级和端口编号组成，用于标识每个接口，在选举指定端口（Designated Port）时使用。端口优先级范围是0到240，缺省情况下为128。
- BPDU：Bridge Protocol Data Unit，交换机之间用于交换信息的数据帧。
- 根端口（Root Port）：根端口是指非根桥上用于连接到根桥的最优路径的端口。每个非根桥只有一个根端口，这个端口提供了到达根桥的最低路径开销。根端口负责将BPDU（桥协议数据单元）从非根桥传递到根桥。如果一个非根桥有多个端口连接到根桥，那么根据路径开销、BID（桥ID）、PID（端口ID）等参数，选择其中的一个作为根端口。
- 指定端口（Designated Port）：指定端口是每个网段上用于转发BPDU和用户数据的端口。在每个网段上，只有一个端口可以是指定端口，它负责向所连接的网段转发BPDU。通常情况下，根桥上的所有端口都是指定端口，因为根桥是STP网络的逻辑中心。
- 备用端口（Alternate Port/Backup Port）：备用端口是指那些既不是根端口也不是指定端口的端口。这些端口在STP中被阻塞，不参与数据的转发，但它们仍然会接收BPDU，以便于在网络拓扑发生变化时，可以快速转变为根端口或指定端口，从而提供链路的备份。
=== STP算法的步骤
  生成树算法有三个步骤，下面以@原始有环拓扑 为例，说明STP的工作原理。
  #figure(image("原始有环拓扑.jpg",format: "jpg",fit:"stretch",width: 25%),caption: "原始有环拓扑")<原始有环拓扑>
+ 选举根交换机

  拓扑中，BID最小者当选。
  - BID的比较方法：
    - 优先级取值越小，则网桥ID则越小。
    - 若优先级相同，则比较MAC地址，从MAC地址的左侧开始依次比较，数值小的，则网桥ID就越小。
    - 如A-MAC前四位是00-01，B的前四位是00-05，那么A的BID更小，A当选根交换机。

+ 选举根端口

  在每一个非根交换机上选出一个根端口RP（Root Port），这个RP只能有一个。根端口用于接受根交换机发来的BPDU，也用来转发普通流量。
  
  - 根端口RP的选举：
    - 首先，保证BPDU接收端口到根交换机的路径成本最小。链路带宽对应的成本值见下表#footnote[摘自#link("https://support.huawei.com/enterprise/zh/doc/EDOC1000128401/33f9bf9d")[IEEE 802.1d-1998标准方法、IEEE 802.1t标准方法和华为计算方法中规定的路径开销列表]]：
        #figure(
          table(
            align: horizon+center,
            rows: 1.5em,
            columns:(auto,auto,auto), 
            inset: 6pt,
            table.header(
              [*端口速率*], [*IEEE 802.1t标准的路径开销*], [*华为计算方法的路径开销*],
            ),
            "100Mbps", "200 000", "200",
            "1000Mbps", "20 000", "20",
            "10Gbps", "2 000", "2",
            "40Gbps", "500", "1",
          ),
          caption: "链路带宽的成本"
        )
        例如，一系列千兆网口组成的路径，每经过一个设备的成本就是4。成本最小的口就是根端口。
        #figure(image("线路成本.jpg", format: "jpg", fit:"stretch",width: 45%),caption: "链路成本示例")<链路成本>
        如@链路成本，A是根交换机，从B、C的G0/1口到A的成本值均为4，所以它们都被选为根端口。但是D的G0/1与G0/2口成本值都是4+4=8，成本值相同，则还需要进行网桥ID的比较。
    - 对端的网桥ID（BID）最小。如上文所述，@链路成本 这种情况中D到A的无论哪条路成本都是8，则需要继续比较双方中哪个接口的对端BID更小。
        #figure(image("对端BID最小.jpg", format: "jpg", fit:"stretch",width: 80%),caption: "对端BID最小")<对端BID最小>
        B是00-06，C是00-05，即对端C的BID更小，所以D的G0/2被选举为了根端口。
    - 对端的端口ID（PID）最小。在最后，如果路径成本和网桥ID都相同，则还要比较端口ID的大小。
        #figure(image("对端PID最小.jpg",format: "jpg", fit:"stretch",width: 65%),caption: "对端PID最小")<对端PID最小>
        此处的PID优先级都是默认值，为128。而Fa0/1比Fa0/2小，所以Fa0/1被选举成为了根端口RP。

+ 选举指定端口并阻塞备用端口AP

  每条链路的两个端口中有且仅有一个端口需要被选为指定端口DP（Designated Port）。指定端口DP用于转发根交换机发来的BPDU，也用来转发普通流量
  - 指定端口的选举条件
    - 根交换机的所有端口都是指定端口DP。
    - 根端口的对端端口一定是指定端口。如交换机D的RP是G0/2，G0/2的对端是C的G0/3，那么，C的G0/3就是指定端口。
    - BPDU转发端口到根交换机的路径成本最小的是指定端口DP。例如D、E之间的两条链路，D到A的成本更低，所以在这两条链路上，DP均在D交换机处。
   选举完指定端口，剩余端口就成了备用端口AP（Alternate Port），将他们阻塞（Block）掉，即可在所有交换机之间形成一条无环的链路。
   #figure(image("成品图.jpg",format: "jpg",fit:"stretch",width: 40%),caption: "最终形成的链路拓扑（绿色粗线为连通的链路）")<成品图>
== BPDU保护
#para[
  如果有人伪造RST BPDU恶意攻击交换设备，当边缘端口接收到该报文时，会自动设置为非边缘端口，并重新进行生成树计算，引起网络震荡。配置BPDU保护功能后，如果边缘端口收到BPDU报文，边缘端口将会被立即关闭，防止网络中的恶意攻击。
]
// == RSTP
// #para[
  
// ]
// == MSTP

= 实验环境
== 实验背景
#para[
  某公司购置了 4 台交换机，组建网络。考虑到网络的可靠性，将 4 台交换机如
图 Figure 6 所示拓扑搭建。由于默认情况下，交换机之间运行 STP 后，根交换机、根端
口、指定端口的选择将基于交换机的 MAC 地址的大小，因此带来了不确定性，极
可能由此产生隐患。公司网络规划，需要 S1 作为主根交换机，S2 作为 S1 的备份根
交换机。同时对于 S4 交换机，E0/0/1 接口应该作为根端口。对于 S2 和 S3 之间的
链路，应该保证 S2 的 E0/0/3 接口作为指定端口。同时在交换机 S3 上，存在两个接
口 E0/0/10、E0/0/11 连接到测试 PC，测试 PC 经常上下线网络，需要将交换机 S3 与
之相连的对应端口定义为边缘端口，避免测试电脑上下线对网络产生的影响。
]
== 实验设备
#align(center)[#table(
  columns: (auto, auto,auto),
  rows:(2em,2em,3em),
  inset: 10pt,
  align: horizon+center,
  table.header(
    [*设备名称*], [*设备型号*], [*设备数量*]
  ),
  "交换机", "华为S5735S", "4",
  "PC", "联想启天M410
  Windows 10", "2",
)]

#para[另有网线若干，控制线1条。]
= 实验步骤及结果
== 实验拓扑
  按实验背景，绘制拓扑图如下：
  #figure(image("实验拓扑.png",format: "png",fit:"stretch",width: 60%),caption: "实验拓扑图")<实验拓扑>
  #para[
  要求在配置好各个端口的路径开销值之后，运行STP能将@实验拓扑 中的Blocked Port端口阻塞。
  ]
== 按照拓扑图接线
  按照拓扑图接线。
  #figure(image("接线图.jpg", format: "jpg" ,fit:"stretch",width: 80%),caption: "接线图")
== 配置PC
#para[
  设置两台PC的IP地址分别为`10.130.81.211`和`10.130.81.203`。
]
== 配置STP
#para[下列许多步骤在LSW1、LSW2、LSW3和LSW4上都有相同的操作，这里只列出*LSW2*上的操作步骤。]
=== 配置STP工作模式
  配置环网中的设备生成树协议工作在STP模式：
  #figure(image("step0.png",format: "jpg",fit:"stretch",width: 100%),caption: "配置STP工作模式")
=== 配置根桥和备份根桥设备
  配置根桥设备为LSW1，备份根桥设备为LSW4：
  #figure(image("step1.png",format: "jpg",fit:"stretch",width: 35%),caption: "配置根桥LSW1")
  #figure(image("step2.png",format: "jpg",fit:"stretch",width: 60%),caption: "配置备份根桥LSW4")
=== 配置端口路径开销
  配置端口的路径开销值：
  #figure(image("step3.png",format: "jpg",fit:"stretch",width: 60%),caption: "配置端口路径开销")
  特别地，LSW3的g0/0/1口的路径开销值为20000:
  #figure(image("step4.png",format: "jpg",fit:"stretch",width: 70%),caption: "配置LSW3的g0/0/1口路径开销")
=== 使能STP破除环路
  - 将与PC机相连的端口设置为边缘端口:
  #figure(image("step5.png",format: "jpg",fit:"stretch",width: 70%),caption: "配置LSW3边缘端口")
  配置LSW3的g0/0/1口为边缘端口，并启用BPDU保护功能：
  #figure(image("step6.png",format: "jpg",fit:"stretch",width: 70%),caption: "配置LSW3边缘端口并启用BPDU保护")
  - 设备全局使能STP:
  #figure(image("step7-1.png",format: "jpg",fit:"stretch",width: 30%),caption: "全局使能STP")
== 实验结果验证
=== 查看各交换机端口状态
  配置完成后，查看各个交换机的端口状态，确认生成树协议已经生效。
  在LSW1上执行display stp brief命令，查看端口状态和端口的保护类型，结果如下：
  #figure(image("lsw1dis.jpg",format: "jpg",fit:"stretch",width: 75%),caption: "查看LSW1的STP状态")
  将LSW1配置为根桥后，与LSW2、LSW3相连的端口g0/0/1和g0/0/2在生成树计算中被选举为指定端口。
  
  在LSW2上执行display stp interface g0/0/1 brief命令，查看端口g0/0/1状态，结果如下：
  #figure(image("lsw2dis.jpg",format: "jpg",fit:"stretch",width: 80%),caption: "查看LSW2的g0/0/1端口状态")
  端口g0/0/3在生成树选举中成为指定端口，处于*FORWARDING*状态。端口g0/0/2在生成树选举中成为Alternate端口，处于*DISCARDING*状态。

  在LSW3上执行display stp brief命令，查看端口状态，结果如下：
  #figure(image("lsw3dis.jpg",format: "jpg",fit:"stretch",width: 80%),caption: "查看LSW3")
  端口g0/0/2在生成树选举中成为根端口，处于*FORWARDING*状态。此外，由于我们配置了BPDU保护，g0/0/10状态的Protection字段显示为*BDPU*。

  在LSW4上执行display stp brief命令，查看端口状态，结果如下：
  #figure(image("lsw4dis.jpg",format: "jpg",fit:"stretch",width: 80%),caption: "查看LSW4")
  端口g0/0/1在生成树选举中成为根端口，处于*FORWARDING*状态；端口g0/0/2在生成树选举中成为 Alternate 端口，处于*DISCARDING*状态；
=== 查看网络连通性
  在IP地址为`10.130.81.211`的PC上执行ping命令，查看与IP地址为`10.130.81.203`的PC的网络连通性，结果如下：
  #figure(image("ping.jpg",format: "jpg",fit:"stretch",width: 70%),caption: "查看网络连通性")
#para[
  可见两台PC之间可以正常通信，网络连通性正常。
]
=== 实验评测
#para[
  经过教辅亲自测试，S2与S3以及S2与S4之间的链路断开后，网络依然可以正常通信，各交换机`display stp brief`显示结果正常，说明STP配置成功，网络环路被成功破除。
]
= 实验总结
#para[
  本次实验通过配置生成树协议（STP），实现了对网络中的环路进行消除，保证了网络的稳定性和可靠性。通过实验，我掌握了生成树协议的基本概念和工作原理，学会了如何在网络设备上配置STP，理解了STP的防止环路、优化网络拓扑的功能。实验中，我通过实际操作，深入理解了STP在现代网络中的应用，提升了实践技能，为未来的网络工程职业生涯和专业认证考试打下了坚实基础。
]
#show heading: it => box(width: 100%)[
  #v(0.50em)
  #set text(font: "Noto Sans CJK SC")
  // #counter(heading).display()
  // #h(0.5em)
  #it.body
]
#pagebreak()
#bibliography("ref.yml",full: true,title: "参考文献",style:"gb-7714-2015-numeric")