1.详细说明STP的工作原理
在二层交换网络中,逻辑的阻塞部分的接口,实现从跟交换机到所有节点唯一的路径称为最佳路径,生成一个没有环路的拓扑。当最佳路径出现故障时,个别被阻塞的接口将打开,形成备份链路。
2. STP的接口状态有哪些,每个状态的作用是什么?
STP的接口状态
状态名称 | 状态描述 |
禁用(Disable) | 该接口不能收发BPDU,也不能收发业务数据帧,例如接口为down |
阻塞(Blocking) | 当该接口被STP阻塞。处于阻塞状态的接口不能发送BPDU,但是会持续侦听BPDU,而且不能收发业务数据帧,也不会进行MAC地址学习 |
侦听(Listening) | 当接口处于该状态时,表明STP初步认定该接口为根接口和指定接口,但接口依然处于STP计算的过程中,此时接口可以收发BPDU,但是不能收发业务数据帧,也不会进行MAC地址学习 |
学习(Learning) | 当接口处于该状态时,会侦听业务数据帧(但是不能转发业务数据帧),并且在收到业务数据帧时会进行MAC地址学习 |
转发(Forwarding) | 处于该状态的接口可以正常的收发业务数据帧,也会进行BPDU处理。接口的角色需是根接口或指定接口才能进入转发状态 |
3. 说明STP在结构突变时的表现
结构突变主要有三种故障:根桥故障、直连链路故障、非直连链路故障
(1)根桥故障
<1> 根桥故障
- 在稳定的STP网络中,非根桥会定期收到来自根桥的BPDU报文
- 如果根桥发生了故障,停止发送BPDU,下游交换机就无法收到来自根桥的BPDU报文
- 如果下游的交换机一直收不到BPDU报文,Max Age计时器(缺省:20s)就会超时,从而导致已经手打的BPDU报文失效。此时,非根桥会互相发送配置BPDU,重新选举新的根桥。
<2> 端口状态
SW3的预备端口,20S会从Blocking状态进入到Listening状态,在进入Learning状态,最终进入Forwarding状态,进行用户流量的转发。
<3> 收敛时间
根桥故障会导致50s左右的恢复时间,等于Max Age加上两杯的Forward Delay收敛时间
(2)直连链路故障
<1> 直连链路故障
- 当两台交换机之间用两条链路互连时,其中一条是主用链路,另一条为备用链路。
- 当网络稳定时,交换机SW2会检测到根端口的链路发生故障,则其备用端口会进入用户流量转发状态。
<2> 端口状态
备用端口会从Blocking状态,迁移到Listening-Learning-Forwarding状态
<3> 收敛时间
直连链路故障,备用端口会经过30s后恢复转发状态
(3)非直连链路故障
<1> 非直连故障
- 在稳定的STP网络,非根桥会定期收到来自根桥的BPDU报文
- 若SW1和SW2之间的链路发生了某种故障(非物理故障),因此导致SW2一直收不到来自根桥的SW1的BPDU报文,Max Age计时器(缺省:20s)就会超时,从而导致已经收到的BPDU报文失效。
- 此时,非根桥SW2会认为根桥失效,并且认为自己是根桥,从而发送自己的配置BPDU给SW3,通知SW3自己是新的根桥
- 在此期间,SW3的预备端口一直收不到包含根桥的BPDU,Max Age计时器超市后,端口进入到Listening状态,开始向SW2“转发”从上游发来的包含根桥ID的BPDU
- 因此,Max Age计时器超时后,SW2和SW3几乎同时收到对方发来的BPDU,再进行STP重新计算,SW2发现SW3发来的BPDU更优,放弃宣称自己是根桥,并且重新定义端口角色。
<2> 端口故障
SW3的预备端口20s后会从Blocking状态进入到Listening状态,再进入Learning状态,最终进入到Forwarding状态,进行用户流量的转发
<3> 收敛时间
非直连故障会导致50s左右的恢复时间,等于Max Age加上2倍的Forwarding Delay收敛时间
4. RSTP对于STP的改进项有哪些?仔细说明
(1)改进点1:端口角色
通过对端口的增补,简化了生成树协议的理解便于部署
<1> RSTP的端口角色一共有四种:根端口、指定端口、Alternate端口和Backup端口
<2> 根端口和指定端口的作用和STP中相同。Alternate端口和Backup端口的作用描述如下:
从配置BPDU的报文发送角度来看:
- Alternate端口就是由于学习到其他网桥发送的配置BPDU报文而阻塞的端口
- Backup端口就是由于学习到自己发送的配置BPDU报文而阻塞的端口
从用户流量角度来看:
- Alternate端口提供了从指定桥到根的另一条可切换路径,作为根端口的备份端口
- Backup端口作为指定端口的备份,提供了另一条从根桥到相应网段的备份通路
<3> 给一个RSTP域内所有端口分配角色的过程就是整个拓扑收敛的过程
(2)改进点2:端口状态
RSTP的状态规范缩减为3种,根据端口是否转发用户流量和学习MAC地址来划分
- Discarding状态:不转发用户流量也不学习MAC地址
- Learning状态:不转发用户流量但是学习MAC地址
- Forwarding状态:既转发用户流量又学习MAC地址
(3)改进点3:RST BPDU
<1> RSTP的配置BPDU充分利用了STP报文中的Flag字段,明确了端口角色
<2> 除了保证和STP格式基本一致之外,RSTP做了如下变化:
- type字段:配置BPDU类型不再是0而是2,所以运行STP的设备收到RSTP的配置BPDU时会丢弃
- flag字段:使用了原来保留的中间6位,这样改变的配置BPDU叫做RST BPDU
<3> RST BPDU的报文格式
<4> RST BPDU与STP配置和BPDU报文格式的不同点。包括:BPDU类型和Flag字段
1> BPDU类型,1 Byte,RST BPDU的类性质为0x02
2> 标志,1 Byte,包括:
bit 7:TCA,表示拓扑变化确认
bit 6: Agreement,表示同意,用于P/A机制;. bit 5: Forwarding,表示转发状态
bit 4:Learning,表示学习状态
bit 3和bit2:表示端口角色,00表示未知端口,01表示替代或备份端口,10表示根端 口,11表示指定端口
bit 1: Proposal,表示提议,用于P/A机制;. bit 0: TC,表示拓扑变化。
(4)改进点4:配置BPDU的处理
(5)改进点5:快速收敛机制
注意:这个P/A机制是RSTP完成快速收敛的核心手段,因为他改变了STP依照计时器收敛的方法,可以理解为完成选举后立即切换状态,完成收敛。
- 事实上对于STP,指定端口的选择可以很快完成,主要的速度瓶颈在于:为了避免环路,必须等待足够长的时间,使全网的端口状态全部确定,也就是说必须要等待至少一个ForwardDelay所有端口才能进行转发
- 而RSTP的主要目的就是消除这个瓶颈,通过阻塞自己的非根端口来保证不会出现环路。而使用P/A机制加快了上游端口进入Forwarding状态的速度
(6)改进点6:拓扑变更机制
<1> 在STP中,如果拓扑发生了变化,需要先向根桥传递TCN BPDU,在由根桥来通知拓扑变更,泛洪TC置为的配置BPDU
<2> 在RSTP中,通过新的拓扑变更机制,TC置位的RST BPDU会快速的在网络中泛洪
(7)改进点7:保护功能
<1> BPDU保护
在交换设备上,通常将直接与用户终端(如PC机)或文件服务器等非交换设备相连的端口 配置为边缘端口。
如上图所示:
- sw3与某主机互联,并设置该互联端口为边缘端口。
- 后来该主机被恶意用户侵占,并伪造RST BPDU攻击SW3,因此边缘端口会收到RST BPDU,失去边缘端口特性,并进行生成树计算
<2> 根保护
由于维护人员的错误配置或网络中的恶意攻击,根桥有可能会收到优先级更高的RST BPDU,使得根 桥失去根地位,从而引起网络拓扑结构的错误变动。这种拓扑变化,会导致原来应该通过高速链路 的流量被牵引到低速链路上,造成网络拥塞。
如图所示:
- 网络稳定时,SW1为根桥,向下游设备发送最优RST BPDU。
- 如果SW2被恶意用户侵占,例如恶意修改SW2的桥优先级,使得SW2的桥优先级优于sw1,此时SW2会主动发送自己的RST BPDU。
- 当SW1的指定端口收到该RST BPDU后,会重新进行生成树计算,而SW1也会失去根桥的地位,引起拓扑变动。
<3> 环路保护
在运行RSTP的网络中,根端口状态是依靠不断接收来自上游交换设备的RSTBPDU维持。当由于链 路拥塞或者单向链路故障导致根端口收不到来自上游交换设备的RST BPDU时,此时交换设备会重 新选择根端口。
如图所示:
当SW1和SW3之间的链路发生单向链路故障时,SW3由于根端口在超时时间内收不到来 自上游设备的BPDU报文,Alternate端口切换成根端口,根端口切换成指定端口,从而形成了环 路。
<4> 防TC-BPDU攻击
交换设备在接收到TC置位的RST BPDU报文后,会执行MAC地址表项的删除操作。如果有人伪造TC置位的RST BPDU报文恶意攻击交换设备时,交换设备短时间内会收到很多RST BPDU报文,频繁的删除操作会给设备造成很大的负担,给网络的稳定带来很大隐患。
如图所示:
如果SW3被恶意用户侵占,伪造大量TC置位的RST BPDU并向外发送。SW2收到这些RST BPDU后,会频繁执行MAC地址表项的删除操作,形成巨大负担。
5.生成树实验
(1)接入层
[sw1]vlan 2
[sw1-vlan2]q
[sw1]port-group group-member g0/0/3 g0/0/4
[sw1-port-group]port link-type access
[sw1-GigabitEthernet0/0/3]port link-type access
[sw1-GigabitEthernet0/0/4]port link-type access
[sw1-port-group]port default vlan 2
[sw1-GigabitEthernet0/0/3]port default vlan 2
[sw1-GigabitEthernet0/0/4]port default vlan 2
[sw1]int g0/0/1
[sw1-GigabitEthernet0/0/1]port link-type trunk
[sw1-GigabitEthernet0/0/1]port trunk allow-pass vlan 2
[sw1-GigabitEthernet0/0/1]undo port trunk allow-pass vlan 1
[sw1]int g0/0/2
[sw1-GigabitEthernet0/0/2] port link-type trunk
[sw1-GigabitEthernet0/0/2] undo port trunk allow-pass vlan 1
[sw1-GigabitEthernet0/0/2] port trunk allow-pass vlan 2
[sw2]vlan batch 3 to 4
[sw2]int g0/0/3
[sw2-GigabitEthernet0/0/3]port link-type access
[sw2-GigabitEthernet0/0/3]port default vlan 3
[sw2]int g0/0/4
[sw2-GigabitEthernet0/0/4]port link-type access
[sw2-GigabitEthernet0/0/4]port default vlan 4
[sw2]int g0/0/1
[sw2-GigabitEthernet0/0/1]port link-type trunk
[sw2-GigabitEthernet0/0/1]port trunk allow-pass vlan 3 4
[sw2-GigabitEthernet0/0/1]undo port trunk allow-pass vlan 1
[sw2]int g0/0/2
[sw2-GigabitEthernet0/0/2] port link-type trunk
[sw2-GigabitEthernet0/0/2] undo port trunk allow-pass vlan 1
[sw2-GigabitEthernet0/0/2] port trunk allow-pass vlan 3 to 4
(2)汇聚层
[sw3]vlan batch 2 to 4
[sw3]vlan 100
[sw3-vlan100]q
[sw3]int g0/0/5
[sw3-GigabitEthernet0/0/5]port link-type trunk
[sw3-GigabitEthernet0/0/5]port trunk allow-pass vlan 2
[sw3-GigabitEthernet0/0/5]undo port trunk allow-pass vlan 1
[sw3]int g0/0/4
[sw3-GigabitEthernet0/0/4]port link-type trunk
[sw3-GigabitEthernet0/0/4]port trunk allow-pass vlan 3 4
[sw3-GigabitEthernet0/0/4]undo port trunk allow-pass vlan 1
[sw3]port-group group-member g0/0/2 g0/0/3
[sw3-port-group]port link-type trunk
[sw3-GigabitEthernet0/0/2]port link-type trunk
[sw3-GigabitEthernet0/0/3]port link-type trunk
[sw3-port-group] undo port trunk allow-pass vlan 1
[sw3-GigabitEthernet0/0/2] undo port trunk allow-pass vlan 1
[sw3-GigabitEthernet0/0/3] undo port trunk allow-pass vlan 1
[sw3-port-group] port trunk allow-pass vlan 2 to 4
[sw3-GigabitEthernet0/0/2] port trunk allow-pass vlan 2 to 4
[sw3-GigabitEthernet0/0/3] port trunk allow-pass vlan 2 to 4
[sw3]dhcp enable
[sw3]int vlan 100
[sw3-Vlanif100]ip add 10.1.1.1 24
[sw3-Vlanif100]dhcp select interface
[sw3]int g0/0/1
[sw3-GigabitEthernet0/0/1]port link-type trunk
[sw3-GigabitEthernet0/0/1]port trunk allow-pass vlan 100
[sw3-GigabitEthernet0/0/1]undo port trunk allow-pass vlan 1
[sw4]vlan batch 2 to 4
[sw4]vlan 100
[sw4-vlan200]q
[sw4]int g0/0/4
[sw4-GigabitEthernet0/0/4] port link-type trunk
[sw4-GigabitEthernet0/0/4] undo port trunk allow-pass vlan 1
[sw4-GigabitEthernet0/0/4] port trunk allow-pass vlan 2
[sw4]int g0/0/5
[sw4-GigabitEthernet0/0/5] port link-type trunk
[sw4-GigabitEthernet0/0/5] undo port trunk allow-pass vlan 1
[sw4-GigabitEthernet0/0/5] port trunk allow-pass vlan 3 to 4
[sw4]port-group group-member g0/0/2 g0/0/3
[sw4-port-group]port link-type trunk
[sw4-GigabitEthernet0/0/2]port link-type trunk
[sw4-GigabitEthernet0/0/3]port link-type trunk
[sw4-port-group]undo port trunk allow-pass vlan 1
[sw4-GigabitEthernet0/0/2]undo port trunk allow-pass vlan 1
[sw4-GigabitEthernet0/0/3]undo port trunk allow-pass vlan 1
[sw4-port-group]port trunk allow-pass vlan 2 to 4
[sw4-GigabitEthernet0/0/2]port trunk allow-pass vlan 2 to 4
[sw4-GigabitEthernet0/0/3]port trunk allow-pass vlan 2 to 4
[sw4]dhcp enable
[sw4]int vlan 200
[sw4-Vlanif200]ip add 10.1.2.1 24
[sw4-Vlanif200]dhcp select interface
[sw4]int g0/0/1
[sw4-GigabitEthernet0/0/1]port link-type trunk
[sw4-GigabitEthernet0/0/1]port trunk allow-pass vlan 200
[sw4-GigabitEthernet0/0/1]undo port trunk allow-pass vlan 1
(3)核心层
[sw5]vlan 100
[sw5-vlan100]q
[sw5]vlan 200
[sw5-vlan200]q
[sw5]int vlan 100
[sw5-Vlanif100]ip add 10.1.1.2 24
[sw5]int vlan 200
[sw5-Vlanif200]ip add 10.1.2.2 24
[sw5]int g0/0/1
[sw5-GigabitEthernet0/0/1] port link-type trunk
[sw5-GigabitEthernet0/0/1] undo port trunk allow-pass vlan 1
[sw5-GigabitEthernet0/0/1] port trunk allow-pass vlan 100
[sw5]int g0/0/2
[sw5-GigabitEthernet0/0/2] port link-type trunk
[sw5-GigabitEthernet0/0/2] undo port trunk allow-pass vlan 1
[sw5-GigabitEthernet0/0/2] port trunk allow-pass vlan 200
(4)配置生成树
[sw3]stp mode stp ---配置生成树的工作模式
[sw4]stp mode stp
[sw2]stp mode stp
[sw1]stp mode stp
[sw3]stp root primary ---配置当前设备为根桥
[sw4]stp root secondary ---配置当前交换机为备份根桥
由于默认所有接口都要参与生成树,所以将SW3和SW4的G0/0/1接口的生成树关闭,也将连接PC机接口的生成树关闭
[sw3]int g0/0/1
[sw3-GigabitEthernet0/0/1]undo stp enable---关闭接口的生成树
[sw4]int g0/0/1
[sw4-GigabitEthernet0/0/1]undo stp enable
[sw1]int g0/0/3
[sw1-GigabitEthernet0/0/3]undo stp enable
[sw1]int g0/0/4
[sw1-GigabitEthernet0/0/4]undo stp enable
[sw2]int g0/0/3
[sw2-GigabitEthernet0/0/3]undo stp enable
[sw2]int g0/0/4
[sw2-GigabitEthernet0/0/4]undo stp enable
查看SW1和SW2的端口状态
查看SW4的端口状态
(5)将根端口修改为g0/0/4
- 修改RPC
[sw4]int g0/0/3---在根桥收到的接口上修改RPC
[sw4-GigabitEthernet0/0/3]stp cost 1---将RPC修改为1
查看SW4的端口状态
- 修改PID
[sw3]int g0/0/3---在根桥发送接口上修改PID
[sw3-GigabitEthernet0/0/3]stp port priority 0---将PID修改为1(默认步长为16的倍数)
查看SW4的端口状态