趁着国庆赶紧总结一下对数通这一块的复盘。
STP
生成树协议(Spanning Tree Protocol,STP)主要用于解决网络中的环路问题,并在网络拓扑发生变化时,实现链路交换的自动收敛。
以前在学校只听到过广播风暴,但是没有在实际场景中遇到过广播风暴,上个月在大枣园社区的监控项目中,出现了成对的无线网桥因没有开启RLDP,导致监控室的摄像头总有几个出现卡死的情况,后来通过底层抓包才发现,是两端出现了广播风暴,一秒长达7w的广播包,后来通过做端口隔离解决了广播风暴。
生成树,是指在交换网络中构造一个树形拓扑,生成一个无环的网络,确保在某一时刻,从某一源网络发送到任何目标网络的路径只有一条,因此不会出现环路问题。
如果出现某条正在使用的链路发送故障,则开启生成树协议的交换机能将之前阻塞的接口打开,恢复网络中的备份链路,从而保证连通。
运行生成树协议的网络中,交换机执行生成树算法(Spanning Tree Alogorithm,STA)(这类算法我们在学习树形结构的时候,学习了很多,如kruskal、prim等),通过选择生成树的树根,再寻找其他所有非根节点到达根结点最近的链路作为主要链路,如果该路径不是最短路径,则逻辑上断开。
BPDU报文
在了解生成树算法之前,我们首先需要学习BPDU报文,BPDU是STP协议中交换机之间进行信息交流的协议数据单元,也就是(Bridge Protocol Data Unit)。
在二层结构中,我们通过数据帧进行数据交换,而BPDU报文帧具有两种类型:
- 配置BPDU:由运行STP的根交换机周期性发送(包括网桥ID、发送网桥ID、链路开销、时间间隔)等内容。
-
TCN BPDU:当网络拓扑发生变化时,其他交换机向跟交换机发送更新通知,同时其他交换机收到这台交换机发送的TCN BPDU告知更新,会回复确认信息TCA。当根交换机收到更新通知后,会发送配置BPDU,通知其他交换机重新计算拓扑链路开销。
所谓根交换机在待会STP选举中再做讲解。
BPDU报文帧内容
报文字段 | 字节数 | 说明 |
---|---|---|
PID | 2字节 | STP协议ID,该字段总为0 |
PVI | 1字节 | STP协议版本,STP(802.1d)传统生成树,值为0;RSTP(802.1w)快速生成树,值为2;MSTP(802.1s)多生成树,值为3 |
BPDU Type | 1字节 | 指示当前BPDU消息类型:0x00为配置BPDU,负责建立和维护STP;0x80为TCN BPDU,传送拓扑变更 |
Flags | 1字节 | 标志,最低位=TC,拓扑变化标志;最高位=TCA,拓扑变化确认标志 |
Root ID | 8字节 | 根ID,根交换机的RID,由2字节的桥优先级和6字节MAC地址构成 |
RPC | 4字节 | 根路径开销,指示发送BPDU报文的端口累积到根的开销 |
Bridge ID | 8字节 | 当前交换机的RID,也由2字节的桥优先级和6字节MAC地址构成 |
Port ID | 2字节 | 端口ID,当前发动端口ID |
Message Age | 2字节 | 消息生存时间,指该BPDU报文的有效转发时间,大于Max Age会被丢弃。 |
Max Age | 2字节 | 最大生存时间,指示BPDU消息的最大生存时间,即老化时间。 |
Hello Time | 2字节 | Hello消息定时器,根交换机,定时就会发送一次BPDU Hello报文,遍历拓扑。 |
Fwd Delay | 2字节 | 转发延时,指在拓扑更新后,交换机在正式发送数据前维持监听和学习状态的时间间隔 |
STP接口状态
运行STP的交换机二层接口工作状态分别是Block、Listening、Learning、Forwarding。
- Block:阻塞态,此时该接口不转发、不学习数据帧的MAC地址,只监听上游发送的BPDU报文。
- Listening:监听态,此时该接口接收和发送BPDU报文,但不学习数据帧的MAC地址,可以参与STP选举。
- Learing:学习态,监听态中如果被选举中则进入学习态,此时该接口接收、发送和学习数据帧的MAC地址,但不转发数据帧。
- Forwarding:转发态,此时接口在从学习态通过等待Forward Delay后,接口进入转发态,转发态下为了构造自身的MAC地址表,接口将学习数据帧的源MAC地址。
- 禁用状态:接口在该状态下,不参与STP选举与计算,不发送和接收BPDU报文,也不转发任何数据帧。
定时器
- Hello Time:当STP构建的拓扑稳定后,根交换机会定时向网络中发送配置BPDU数据帧,由网络中其他交换机转发,并扩散至整个网络,根交换机发送BDPU报文的时间间隔就是Hello Time,默认为2s。
- Max Age: 为稳定拓扑,如果交换机发现某个根接口一段时间内都没有收到BDPU帧,则认为所在网络拓扑发生了变化,就向该根发送一个TCN BPDU帧,这段时间就是最大生存时间Max Age,一般默认20s。
- Forward Delay:当交换机从学习态转化为转发态所需要的延时时间,需要30~50s,最短为2倍的Forward Delay,最长为Max Age 加上两倍的Forward Delay。(Listening→Learning 需15s,Learning→Forward 需15s)
STP选举
- 先选举出一个根节点,再从根节点出发,在交换网络中计算生成树,构建无环路的树形拓扑。根交换机在网络中的任务是在冗余的交换网络中发送配置BPDU帧和TCN BPDU帧,当网络的拓扑发生变化时,可以及时调整网络拓扑,维护交换网络的稳定。
- 冗余网络中的每一台交换机上电后,都会假定自己就是根交换机,同时发送BPDU报文,并在根ID字段填入自己的Bridge ID,(由两部分组成,前2字节是交换机优先级,默认值32768,0x8000)由于Bridge ID 的后6个字节是交换机MAC地址,因MAC地址唯一,因此Bridge ID也具有唯一性。根交换机的选举规则是:Bridge ID数值越小的交换机,越有可能被选举为根交换机。
- 起初几台交换机都认为自己是根交换机,发送自己的BPDU帧,同时接收其他交换机发送的BPDU帧。在生成树选举的过程中,MAC地址小的,导致Bridge ID被选为根交换机,根交换机选举完成后,其他交换机不再发送自己的BPDU报文,只转发根交换机的BPDU报文。但出于网络稳定性,往往性能好的核心交换机需要选举为根交换机,此时可以通过修改网络中交换机的优先级,将需要称为根交换机 的优先级配置得最低,配置次低的交换机作为根交换机的备份。
选举根接口
- 选出根交换机后,其他交换机自动成为非根交换机。每台非根交换机都需要选举出一个到达根交换机的最近接口作为根接口,用于接收根交换机发送的BPDU报文。
- 如果冗余的网络中存在环路,非根交换机会拥有到达根交换机的多条路径,那么非根交换机会选出到达根交换机的本地最短路径的接口作为根接口。在启动生成树网络中,进行最短路径选择的依据依次是路径开销,发送者Bridge ID,发送接口Port ID,接收接口Port ID。
比较路径开销
选择根接口时,首先会比较STP中每一个接口的路径开销,路径开销由交换链路的带宽决定。
带宽 | IEEE 803.1d | IEEE 803.1t |
---|---|---|
10Mbit/s | 100 | 2000000 |
100Mbit/s | 19 | 200000 |
1000Mbit/s | 4 | 20000 |
10Gbit/s | 2 | 2000 |
当非根交换机到达根交换机的多条路径开销相同时,通过比较报文的Bridge ID来选择最短路径。
当以上两者开销仍相同时,可以通过比较发送接口的Port ID来判断。Port ID 越小,越能成为最短路径。
选举指定接口
所谓指定接口,是指以太网段到达根交换机最近的接口,且一直为转发状态。在STP中,每个以太网段都需要选举出一个指定接口,根交换机没有根接口,根交换机的所有接口都是指定接口。
每个网段上,有且仅有一个指定端口,选定指定端口后,未被选择的既不是指定端口又不是根端口的端口,将进入阻塞状态。
STP拓扑变更
在冗余的网络中,选举出根交换机,根接口和指定接口后,生成树协议将在网络中阻塞其余接口,形成没有环路的树形结构网络,实现网络通信。
1、根交换机的功能
当网络通过收敛处于稳定状态时,根交换机在全网中每2s发送一次BPDU报文,同步全网的拓扑状态。非根交换机从根接口上接收到该BPDU后,修改其中发送者Bridge ID字段和发送Port ID字段,从自己的指定接口向其他网段发送变更过的BPDU报文,使BPDU报文顺利地扩散到整个网络。
2、TCN拓扑变更通知
当拓扑发生改变时,非根交换机发送拓扑变更通知TCN BPDU报文。TCN BPDU报文的主要作用是当变更拓扑时,向根交换机报告拓扑变更,并由根交换机向全网发送配置BPDU。
3、TCN BPDU报文格式
当BPDU报文中的标志字段最低位置1时,表示该报文为TC BPDU报文,当最高位置1时,表示该报文为拓扑变更确认TCA 报文。
4、拓扑变更收敛过程
通常发生以下情况时,交换机会发送TCN BPDU报文。
① 当链路发生故障时,处于转发态或监听态的端口过渡到阻塞状态。
② 增加了新的链路,处于未启用状态的接口进入转发态。
③ 网络中其他交换机发现拓扑变更,向根交换机发送TCN BPDU报文,交换机从指定端口接受TCN BPDU报文。
这三种情况时,交换机认为网络拓扑发生了变化,即会生成TCN BPDU报文,并从自己的根接口发送出去。如果上游交换机从指定接口收到此报文,则会向发送者发送TCA 确认,并置为配置BPDU。如果发送者没有收到TCA,则会一直发送TCN BPDU。同样,收到TCN BPDU的交换机会产生自己的TCN报文并从根接口向根交换机发送。所有交换机都会进行相同的操作,直到根交换机收到此报文,收到网络拓扑变更消息。
最后,根交换机会向全网发送TC BPDU通知,网络中的每台交换机都转发,通知所有交换机网络拓扑发生变更消息。收到TC BPDU报文的交换机都将自己的MAC地址表的老化时间修改为15s(MAC地址表默认老化时间为300s),以更快地学习到新的转发路径。
为了帮助理解,我通过拓扑图来演示这个过程。毕竟这个过程对后面的RSTP/MSTP都有作用。
STP协议中冗余链路的切换过程
在此图中,SW4与SW6之间的链路是主要链路,此时SW5到SW6的链路在逻辑上断联。
- 如果此链路出现故障,SW4因为没有收到SW6的TCA报文,从而阻塞了SW4的指定端口G0/1,因此SW4会从自身根接口G0/0发送TCN BPDU给自己的上行交换机。
- 报文到达SW2,SW2会向SW4发送TCA报文,告知收到其拓扑变更通知,并再从G0/0向根交换机发送TCN BPDU报文。
- 根交换机SW收到了TCN报文后,告知SW2已收到拓扑变更,因此开始广播泛洪的发送TC报文,所有接收到TC报文的非根交换机,都会将自身的MAC表的老化时间缩短,同时从自身的指定端口向下转发TC报文,直到扩散全网。
- SW6收到TC报文后,会重新选举接口,选G0/2作为自己的根接口 ,而SW5的G0/2接口由原本的阻塞态,通过Forward Delay后,变为指定接口,从而完成荣誉链路的切换。(此时SW5由阻塞态变为转发态的时间延时为两倍的Forward Delay时间,共30s)
RSTP
由于在STP中,从阻塞态变为转发态所需的时间为30~50s,在现实网络中极大的影响了传输效率,由此诞生了快速生成树协议(Rapid Spanning Tree Protocol,RSTP)
RSTP接口状态
与STP不同,RSTP中接口状态只有3种,分别是Discarding、Learning、Forwarding。(用图或许更直观)
STP接口 | RSTP接口 | 是否转发数据 | 是否学习MAC地址 |
---|---|---|---|
禁用 | 丢弃 | 不转发 | 不学习 |
阻塞 | 丢弃 | 不转发 | 不学习 |
监听 | 丢弃 | 不转发 | 不学习 |
学习 | 学习 | 不转发 | 学习 |
转发 | 转发 | 转发 | 学习 |
也就是说,在STP中的禁用、阻塞、监听态在RSTP中统称为丢弃态,并且丢弃态不学习也不转发,只监听和自收发。
RSTP接口类型
在STP中,接口类型包括根接口(Root Port,RP)、指定接口(Designated Port,DP)、阻塞接口(Block Port,BlP)和(Disable Port,DiP)。为了提高速度,在RSTP中,除这些接口外,还增加了替代接口(Alternate Port,AP)和备份接口(Backup Port,BP)。
- 根接口:非根交换机距离根交换机最近的接口。(根交换机上没有根接口,全是指定接口)
- 指定接口:用于接收指定的下行交换机的数据的以太网段接口。
- 替代接口:作为根接口的备份接口,可以接收BPDU报文但不转发数据。当根接口故障时,替代接口自动成为根接口。
- 备份接口:作为指定接口的备份接口,可以接收BPDU报文但不转发数据。备份接口出现在非根交换机上。
当网络拓扑发生变化时,替代接口和备份接口都能够立即接替根接口和指定接口实现网络的快速收敛。
BPDU格式变化
RSTP相对于STP对BPUD报文做了一些更改,主要修改了标志字段,叫做RSTP BPDU。
在STP中,BPDU报文中的标志字段只使用最高位和最低位,即TCA标志位和TC标志位。
而在RSTP中,则利用此字段中剩余的6个bit来标识其他内容,分别增加了接口角色、学习、协定、等标志位。
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|
TCA字段 | 协定 | 转发 | 学习 | 接口类型 | 接口类型 | 提议 | TC字段 |
- RSTP和STP对于BPDU报文的处理方式也有很大差别。在STP中,根交换机从指定接口发出BPDU报文,非根交换机从根接口接收到BPDU报文后,会重新产生一个新的BPDU报文,从指定接口发送出去。如果非根网桥没有收到根交换机发送的BPDU报文,它就不能确定网络中的链路是否发生故障。
- 因此在RSTP中,根交换机每隔Hello TIme都会发送BPDU报文, 非根交换机即使没有收到根交换机的BPDU报文,也会按照Hello Time(默认2s)周期性地发送包含自身的BPDU报文。对于下连交换机,如果指定端口在连续3个Hello Time内都没有收到任何BPDU报文,那么该交换机就会认为和上连交换机之间的链路出现了故障,并进行老化处理。
- 此时BPDU报文充当了交换机之间的keep-alive报文。而在STP中,只能被动等待20s的BPDU老化时间,相比之下,RSTP发现链路故障所需的时间更短。