233 lines
15 KiB
Typst
233 lines
15 KiB
Typst
#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之间可以正常通信,网络连通性正常。
|
||
]
|
||
#figure(image("阻断后的拓扑.png",format: "png",fit:"stretch",width: 80%),caption: "查看阻断后的拓扑")
|
||
=== 实验评测
|
||
#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") |