交换机本质上是高性能的网桥(细节上有所不同,这里只针对共同点),它们用于连接多个物理的链路层网络(如以太网)或成组的站,并对网络数据的流通进行管理。以下内容将网桥和交换机忽略区别,同等看待。
网桥/交换机最基本的应用就是将两个交换机连接起来形成一个扩展的局域网,如图所示:
第一次打开网桥/交换机时,它的数据库是空的,因此它不知道除自己之外的任何站的位置。当它每次接收到一个目的地不是自己的帧时,首先检查自己的转发表中是否存在目的端口,若没有则添加一个条目(记录地址、到达时间),同时为除该帧达到的端口之外的所有端口做一个备份,向所有端口发送这个帧的备份。如果网桥/交换机未学习到这个位置,每个帧将会被交付到每个网段,因此随着不断“学习”的过程,这种开销会显著降低。另外,由于站可能出现移动、网卡更换、MAC地址改变等情况,所以网桥/交换机发现在数据库中有对应端口的MAC地址,这个信息也不能假设永远是正确的。为了解决这个问题,在每次学习一个地址后,网桥/交换机会为这个条目启动一个计时器,如果在有效期内没有再次看到该条目中的地址,这个条目会被删除。网桥/交换机的自学习和过滤功能可以优化其工作效率。
前述网桥称为透明网桥(transparent bridge),它接收到达的每一帧,并根据自学习算法维护、更新其路由表。这类网桥会定期更新过期的条目,因此无需担心站或网桥迁移、断电后网络拓扑结构改变的问题。但这种网桥存在一个问题:当两个以上的网桥使用(或交换机端口交叉连接)时,网络拓扑结构会产生回路,引发转发帧的无限循环,并迅速扩散到整个网络的回路中。网络中充斥着大量广播帧导致大面积网络拥塞,这种现象就称为广播风暴(broadcast storm)。
广播风暴的产生过程如下:
上图只是PC1发送信息的情况,如果有多台主机发送,情况更糟糕:
为了解决透明网桥的缺陷,需要改进网桥的协议,以确保帧不会沿回路传播。生成树协议就是一个解决方案。
生成树协议(Spanning Tree Protocol)通过在每个网桥禁用某些端口来工作,这样可避免拓扑环路(即两个网桥之间不允许出现重复路径)。在图论中,一个生成树是一张图中所有节点和部分边的集合,从任何节点到其他节点不存在环路。STP的目标就是在网络图中找出一个生成树来。
为了实现STP,还需要各网桥之间按照生成树算法要求进行信息交换,以便找出根网桥及其子网桥,并关闭一些端口以禁用某些会形成回路的通道。信息交换通过网桥协议数据单元(Bridge Protocol Data Unit)来实现。另外还需要为端口设置一些角色。
网桥协议数据单元(Bridge Protocol Data Unit,BPDU)是运行生成树协议的网桥之间进行信息交换的的消息帧。其组成如下(也适用于RSTP):
协议(Prot)字段给出协议ID,被设置为0。版本(Vers)字段决定是使用STP还是RSTP。类型(Type)字段与版本字段类似。标志(Flags)字段包含拓扑变化(TC)和拓扑变化确认(TCA)位,附加位包含建议(P)、端口角色(00未知,01备用,10根,11指定)、学习(L)、转发(F)和协议(A),这些是端口状态和角色的概念。根ID字段给出发送方使用的根网桥标识符,即从网桥ID字段中获得的MAC地址。这些ID字段都用一种特殊方式编码,包括MAC地址之前的一个2字节的优先级字段(可通过管理软件设置),优先级字段可以要求生成树采用某个特定的网桥作为根。
根路径成本(cost)是在根ID字段中指定的计算出的到达某个网桥的成本。PID指发送方的端口号,它被附加在一个1字节的可配置的优先级字段之后。MsgA是消息有效期,MaxA是超时最大期限(默认为20秒)。Hello Time指出配置帧的传输周期。转发延迟指出处于学习和侦听状态的时间。
需要注意的是,消息有效期(MsgA)字段不是固定值。当根网桥发送一个BPDU时,它将该字段设置为0。网桥转发接收到的不是根端口的帧,并将消息有效期加1。从本质上说,该字段是一个跳步计数器,用来记录BPDU经过的网桥数量。当BPDU被一个端口接收时,它会被保留至超时。若超过这个时间,根端口没有接收到另一个BPDU,根网桥会被放弃,并重新开始根网桥的选举过程。
网桥/交换机的端口可能有5个状态:阻塞、侦听、学习、转发和禁用。他们之间的状态转换如图所示:
上图中,实线箭头表示端口的正常转换,虚线箭头表示由管理配置引起的改变。在初始化后,端口进入阻塞状态,此状态下不进行地址学习、数据转发或BPDU发送,但它会监控接收的BPDU,并在它需要被包含在将到达的根网桥的路径中的情况下使端口转换到侦听状态。在侦听状态下,该端口允许发送和接收BPDU,但不进行地址学习或数据转发。经过一个典型的15秒转发延迟,端口就进入到学习状态中,这时它被允许执行数据转发以外的所有操作。要从学习状态进入到转发状态,端口还需要等待另一个转发延迟。
相对于端口状态机,每个端口都扮演一定的角色,这个角色可能是根端口、指定端口、备用端口或备份端口(备用端口和备份端口在RSTP才出现)等,角色概念在生成树协议和快速生成树协议中很重要。根端口是生成树中位于根的线段终点的端口;指定端口是指处于转发状态,并与根端口相连线段中路径成本最小的端口;备用端口是与根相连线段中成本更高(相较于当前最优选择而言)的端口,备用端口不处于转发状态;备份端口是指连接到同一线段中作为同一网桥/交换机指定端口使用的端口,因此备份端口可接管一个失效的指定端口而不影响生成树的拓扑结构,但它不能在网桥失效的情况下提供一条到根的备用路径。
STP建立生成树的过程如下:首先选举根网桥。根网桥是在网络中标识符最小的网桥。当一个网桥初始化时,它假设自己是根网桥,并用自己的网桥ID作为根ID字段的值发送配置BPDU消息。如果它检测到一个标识符更小的网桥时,则停止发送自己的帧,并基于接收到的ID更小的帧构造下一步发送的BPDU,发出根ID更小的BPDU的端口被标记为根端口(即端口在根网桥的路径上)。剩余端口被设置为阻塞或转发状态。一个网桥完成这个过程后,就有可能会变成子网桥(如果存在ID比它小的网桥)。对每个网桥进行同样操作,如此漫延,就构成了生成树。
BPDU的根ID字段是判定根网桥归属的依据,哪个BPDU的根ID字段最小则发送这个BPDU的网桥就被选举成为根网桥,其所有端口都是指定端口。接下来每个子网桥会选择最靠近根网桥的那个端口作为指定端口,指定端口处于转发状态,而其他非指定端口则不能处于转发状态。
当网络拓扑发生变化时,STP就需要重新建立生成树。在STP中,当一个端口进入阻塞或转发状态时,意味着发生了拓扑变化(试想一个生成树添加或减少了一条边),此时需要等待新的拓扑信息传播到整个网络中,即等待新的生成树形成。当网桥检测到一个连接变化时,它向根端口以外的端口发送拓扑变化通知(TCN BPDU),通知自己在原来生成树中的父网桥,这样层层向上传递直到根网桥,同时网桥还发送一个拓扑变化确认信息(TCA BPDU)给TCN BPDU的发送方。根网桥接收到拓扑变化信息后,向所有端口发送TC BPDU(即配置了TC位的BPDU),逐层传递下去。接收到TC BPDU的网桥会将其数据库的有效期(老化时间)从300秒减少为15秒。这样,网桥的数据库中已有的错误条目可被快速清除并重新学习。
STP解决了在冗余网络中形成的环路导致广播风暴的问题,但缺陷是在网络拓扑发生变化后,STP只能通过一定时间内未接收到BPDU来检测。如果这个时延很大,收敛时间(沿着生成树重新建立数据流的时间)可能会比预期大。收敛时间过长会导致在TC BPDU还未传递到所有网桥时,旧拓扑结构中原本处于转发状态的端口还未收到自己应该停止转发的通知而继续转发消息帧,这可能会形成临时环路。为了解决这一问题,又提出了快速生成树协议(Rapid Spanning Tree Protocol,RSTP)。
RSTP相较于STP主要有3点改进:
在RSTP中,端口新增了备用端口和备份端口两个角色,以便网络拓扑结构发生变化时能快速找出一个备选方案。此外,端口状态还从5个减少到3个(丢弃、学习和转发),RSTP的丢弃状态代替了STP中的禁止、阻塞和侦听。
由于RSTP只使用一种类型的BPDU,因此没有专门的拓扑变化BPDU。在RSTP中,检测到一次拓扑变化的网桥会发送一个表示拓扑变化的BPDU,任何接收到它的网桥会立即清除自己的过滤数据库。这时,无需等待拓扑变化传递到根网桥再经过转发延迟后返回,而是立即清除条目,这个改变显著减少了收敛时间。
RSTP将边缘端口特殊对待。边缘端口和点到点链路上的端口通常不会形成环路,因此RSTP允许它们直接进入转发状态。
对于生成树的维护,在STP中,BPDU通常情况下由通知网桥或根端网桥来发送,而RSTP则允许所有网桥定期发送,以便确定相邻网桥是否正常运行。当某一网桥检测到拓扑变化时,它会向所有相邻网桥都发送TC BPDU,这样可以更快地将拓扑变化通知到整个网络。当一个网桥接收到这一信息时,它会更新除边缘端口以外的所有条目。
STP和RSTP都属于单生成树协议(Single Spanning Tree Protocol,SSTP),尽管RSTP相较于STP已经有了相当大的改进,但面对大规模网络时RSTP的收敛时间仍然比较长,且拓扑影响面也比较大。此外,在面对不对称网络时,单生成树就会影响网络的连通性。且链路被阻塞后不承担任何流量,这造成了带宽的极大浪费。因此,多生成树协议被提出,主要是PVST和PVST+
本文内容摘自《TCP/IP详解 卷1:协议(中文版)第2版》,百度百科,维基百科等,图片来源于网络