美文网首页路由协议
STP工作原理 - kummer话你知

STP工作原理 - kummer话你知

作者: kummerwu | 来源:发表于2017-01-17 12:10 被阅读1402次

    STP解决什么问题

    生成树协议(Spanning-Tree Protocol,以下简称STP)是一个用于在局域网中消除环路的协议。运行该协议的交换机通过彼此交互信息而发现网络中的环路,并适当对某些端口进行阻塞以消除环路。由于局域网规模的不断增长,STP已经成为了当前最重要的局域网协议之一。

    二层网络环路会引发哪些问题

    环路导致网络报文风暴:
    由于在二层网络中,广播,组播,未知单播都采用了泛洪的方式,如果网络中存在环路,会导致报文无限复制,直到最终网络崩溃。

    由于泛洪导致网络报文转发环路

    环路导致MAC表震荡
    如上图,在报文复制的过程中,SwitchB会发现PC1的报文一会儿从上面接口收到,一会儿从下面接口收到,反复震荡,导致MAC表不稳定。
    即使是已知单播,也可能会导致问题,如下图:

    已知单播导致的MAC震荡
    1. PCB发送单播报文给PCA,该报文源Mac为MacB,目的Mac为MacA。
    2. SW1从B接口收到该报文,所以SW1认为MacB对应的出接口为B
    3. 该单播报文也会被SW2转发,从A端口进入SW1,这样SW1又认为MacB对应的出接口为A。
    4. 改过程反复出现,导致SW1的MAC表不停震荡。

    STP如何解决问题

    下图是一个有环路的网络演示例子,我们看看STP如何在这个网络中计算出一个生成树,并将会导致环路的链路阻塞。


    一个有环路的网络
    • 1. 选根桥:首先各交换机根据优先级和MAC地址,选出一个BID最小的交换机,作为整个网络的根。

    相关术语:
    网桥:比较早期的网络中,称交换机为网桥。在某些场景中网桥和交换机会交替使用。
    网桥ID:BID—网桥的优先级+网桥MAC。
    根桥:BID(网桥ID)最小的网桥定为根桥。在没有配置优先级的网络中,根桥将有MAC地址最小的网桥担任。如果网络中配置了各个交换机的优先级,则由优先级最小的交换机当人跟桥。

    选出整个网络的根节点
    • 2. 确定根端口、指定端口、可选端口

    根端口和指定端口和可选端口的内涵:
    根端口(RP-RootPort),交换机上最优的端口。

    • 根端口的概念是针对交换机的,是指(一个非根桥的STP)交换机上离根桥最近的端口。
    • 一个STP交换机上有且仅有一个RP。
    • 对于根桥发出的报文来看,流量从根端口进入交换机

    指定端口(DP-DesignatedPort),链路上的最优端口。

    • 指定端口的概念是针对于某链路的,指定端口是链路上离根桥最近的端口。
    • 一个链路上有且仅有一个DP。
    • 对于根桥发出的报文来看,流量从指定端口流出交换机。

    可选端口(AP-AlternatedPort):, 非最优端口

    • 即非根端口,也非指定端口,说明该端口不在生成树上,则该端口需要阻塞。所以可选端口也称为阻塞端口。

    我们看看根端口RP和指定端口DP的简单示例,对RP和DP有一个直观的认识。指定端口DP就是树中父节点上的端口,根端口RP就是树中子节点上的端口。


    一颗生成树中的根端口和指定端口
    • 3. 关闭所有阻塞端口的流量转发功能
      相当于把可能形成环路的端口流量转发功能全部关闭(俗称破环或剪枝),通过这样的操作,将物理上的一个网状拓扑改造为一个逻辑上的树状拓扑。从而消除网络环路。

    看看完整的示例,包括根端口RP,指定端口DP和可选端口AP。STP通过关闭AP端口的转发功能,将物理上的网状拓扑,转变为逻辑上的树状拓扑。从而消除网络环路。


    网络中的RP,DP和阻塞端口的完整示例

    在整个网络消除环路,稳定后,应该处于这样一种状态

    1. 根桥在周期性的发送Hello BPDU
    2. 这些BPDU报文从根往叶子周期性发送(基于根桥的保活周期)
      非根桥周期性的从RP端口收到这些BPDU(如果有必要,更新本地信息后),
      从DP端口将这些报文往树的叶子方向
    3. 对于阻塞接口,应该能周期性的收到DP发送过来的报文。

    拓扑变化后的响应

    1. 从上面过程可以看到,BPDU会周期性的从树根往叶子发送。
    2. 每一个端口的最优BPDU都有一个有效期,如果超过这个有效期有没收到BPDU,则认为该BPDU已经无效。尝试重新收敛。

    *---
    *---

    更多的细节

    1. 协议基础:报文格式

    要实现STP功能,网桥之间必须要进行一些信息的交互,这些信息交互单元就称为配置消息BPDU(BridgeProtocolDataUnit)。STPBPDU是一种二层报文,目的MAC是多播地址01-80-C2-00-00-00,所有支持STP协议的网桥都会接收并处理收到的BPDU报文。该报文的数据区里携带了用于生成树计算的所有有用信息。具体如下:

    BPDU报文格式

    各字段的含义

    在BPDU中,最核心的字段是根桥ID,跟路径成本,发送网桥ID,端口ID四个字段。这四个字段组成四元组,用来比较两个BPDU的“好坏”。四元组越小,说明越好。
    注:发送网桥ID,端口ID仅仅在路径成本相同时发挥作用

    字段名 字段含义
    协议ID: 该值总为0。
    版本号: STP的版本(为IEEE 802.1d时值为0)。
    报文类型: BPDU类型(配置BPDU=0,TCN BPDU=80)。
    标记域: LSB(最低有效位)=TCN标志;MSB(最高有效位)=TCA标志。
    根网桥ID: 根信息由2字节优先级和6字节ID组成。
    这个信息组合标明已经被选定为根网桥的设备标识。
    根路径成本: 路径成本为到达根网桥交换机的STP开销。
    表明这个BPDU从根网桥传输了多远,成本是多少。
    这个字段的值用来决定哪些端口将进行转发,哪些端口将被阻断。
    发送网络桥ID: 发送该BPDU的网桥信息。由网桥的优先级和网桥ID组成。
    端口ID: 发送该BPDU的网桥端口ID。
    计时器: 计时器用于说明生成树用多长时间完成它的每项功能。
    这些功能包括报文老化时间、最大老化时间、访问时间和转发延迟。
    最大老化时间: 网桥将将根桥看做不可用前保留根ID的最大时间。
    访问时间: 根网桥连续发送BPDU的时间间隔。
    转发延迟: 网桥在监听学习状态所停留的时间。

    2. 协议运行过程

    • 自认老大(根桥):最初,每一台交换机都认为自己是根桥,尝试向外通告这一信息。
    • 周期通告:STP交换机在每一个端口上定期(2s)发送BPDU报文
    • 发现强者,归顺强者:每台交换机除了发送BPDU外,也从所有端口上接收BPDU,一旦在某端口上收听到比自己发的还要“好”的BPDU,那么这个端口就提取该BPDU中的某些信息,更新自己的信息。并停止在该链路上发送BPDU。
      收到更好的BPDU后需要更新的信息包括:
      • 自己认为的根桥BID(总体决策):从所有端口中最好的BPDU中获得。
      • 本路由器的根端口(RP,总体决策):从所有端口中最好的BPDU中获得。
      • 链路上的指定端口(DP,端口决策):如果从该端口收到更好的BPDU,则说明别人李根桥更近,则自己端口不是DP,否则则认为自己是DP。

    再次强调一下,比较BPDU的“好坏”的方式(自己的或其他交换机的),都是根据上面提到的四元组来完成的,即最低桥ID、最低根路径成本,最低发送者BID,最低端口ID。该端口缓存他人BPDU后,自己则立即停止发送BPDU。
    当发送BPDU的时候,交换机填充Sender BID字段的总是自己的BID,而填充Root BID字段的是“当前我所认为是根桥的”BID。

    • 最终收敛:此过程一直持续,直到最终网络收敛:最优的根桥最终被选举出来,并且RP,DP端口也被确定下来。整个网络归顺到一颗以最优BID为根的生长树上来。

    3. 具体过程分析:选举根桥

    1. 初始状态,自立山头:,虽然A的BID最小,但初始状态还没有互通信息,各自自立山头,此时正确的树上仅有孤零零的一个根节点。

    初始状态,自立山头

    2. 发现强者,归顺强者:通过BPDU的对外通告,树逐渐向外生长,收复C和D两个节点,但B节点还不再王化之内。

    发现强者,归属强者

    3. 通告全网,天下归心:随着根桥的势力范围扩大,已归顺节点(如图中的C和D)也帮着A对外宣传根桥是A,最终该信息传遍全网,天下归心,大家都臣服在A的STP树下。至此,全网就有了一个统一的根,即BID最小的A。

    归顺中央,统一全网

    4. 具体过程分析:最佳树的生成与RP和DP的确定

    整个网络的破环与剪枝过程与选举根桥过程类似,都是从根桥出发,这棵树逐步向外生长,直到最后长满整个网络。
    1. 天地初开,一片混沌:此时正确的树上仅一个跟节点,其他节点的信息都是错误或不可信的。

    天地初开,一片混沌(左边是物理视图,右边是树的逻辑实体)

    2. 树开始向外“生长”:离根最近的交换机首先收到根节点的召唤(根节点会发送“最优”的BPDU),加入到树上来。产生了正确的RP,DP信息。

    树开始向外生长(左边是物理视图,右边是树的逻辑实体)

    3. 树“生长”至整个网络:随着树的进一步生长,节点一个接一个的加入到树上来(通过向外发布“更好”的BPDU吸引其他节点加入)。最终遍布整个网络,形成了一颗全网的STP树。

    树长满整个网络(左边是物理视图,右边是树的逻辑实体)
    注1:当然树的生长并不是一帆风顺的,有时候由于网络时延或定时器的原因,
    某些节点可能会加入错误的分枝,但最终这些误入歧途的节点都能重新找到正确的分枝加入
    
    注2:虽然我们上面为了说明简单,将根节点的选举和DP,RP的确定分两个阶段来说明,
    实际协议运行过程中,并没有明确的区分这两个阶段。他们是统一在“最佳BPDU传递”这
    个统一的协议处理流程中的。
    

    5. 拓扑变化后的收敛

    与拓扑变化后的收敛密切相关的几个基本概念:
    1. 端口状态机
    STP交换机端口一共有五个状态:

    • Disable:表示端口还没有使能
    • Blocking:表示端口是AP(即非DP,也非RP),不能进行报文转发工作。
    • Listening,Learning,Forwarding:表示端口是DP或RP,可以进行报文转发工作,但如果端口当选DP或RP就开始转发工作的话,可能网络中还有环路。(这是因为此时网络还没有完全收敛,可能自己的信息还不全,做出的决策时错误的;也有可能虽然自己的是正确决策,但别人还没有获得完整的信息,别人的决策不正确。),为了避免这种情况发生,STP采用了延迟转发工作的决定,等待网络完全稳定收敛下来后才进入转发工作状态。
    STP端口状态机 STP端口状态机说明

    2.几个相关定时器

    • Hello Timer:STP交换机发送BPDU的时间间隔。当网络拓扑稳定之后,该计时器的修改只有在根桥修改才有效。根桥会在之后发出的BPDU中填充适当的字段以向其他非根桥传递该计时器修改信息。但当拓扑变化之后,TCN BPDU的发送不受这个计时器的管理。
    • Forwarding Delay Timer:指一个端口Listening 和Learning的各自时间,默认为15秒,即Listening状态持续15秒,随后Learning状态再持续15秒。这两个状态下的端口会处于Blocking状态,这是STP用于避免临时环路的关键。
    • Max Age:端口的BPDU老化的时间,前文已经探讨过。端口会根据接收到的BPDU存储所接收到的最好的四个信息(根桥BID、累计根路径开销、发送者BID和发送端口PID)。每次接收到合适的BPDU,端口都会启动这个Max Age计时器。超过这个Max Age时间端口接收不到合适BPDU,就会认为该BPDU已经失效。这个时间默认为20秒。

    3. 拓扑变化后重新收敛需要解决那些问题

    • 让网络逻辑拓扑重新恢复成一颗完整的树。

    网络拓扑变化后,可能新增了链路,导致树上又引入了环,此时需要重新破环。
    也可能树中某些链路断了,导致树的断裂,此时需要启用原来被删链路,恢复树的连通性。
    甚至是根桥down掉了,需要重新选择根桥。

    解决方法:其实重新生成STP树没有什么特别的,其过程与初始收敛过程完全相同。
    有一点需要说明的是:如果DR端口down了,或者根桥down了,需要等待MaxAge时间,
    到了MAXAge时间后,通过BPDU的老化机制将无效BPDU删除,并重新尝试生成新的BPDU。

    ![Uploading Paste_Image_518231.png . . .]

    • 即使恢复了STP树,拓扑变化可能会MAC表错误,需要尽快清除这些错误MAC,否则流量仍然不能恢复。

    比如:一个网络最初如下:假设网桥 B1 阻塞了通向 B4 的链路。A 和 B 是具有已建立连接的两个工作站。流量从 A 到 B 进入 B1、B2、B3,然后进入 B4。


    最初网络拓扑

    现在,假设 B2 和 B3 之间的链路发生故障。在 B1 以转发模式将其端口应用于 B4 之前,A 和 B 之间的通信会中断(使用默认参数的情况下最长中断 50 秒),这个比较容易理解。但是我们发现,即使B1-B4之间链路打开了,A->B的通讯仍然无法恢复,这是因为当 A 要向 B 发送帧时,B1 交换机上MAC表错误导致的,(B1仍然认为主机B的出接口是B2),数据包将被发送到黑洞。当B要到达A. Communication丢失在五分钟,直到A和B MAC地址的条目老化。


    错误的MAC表导致转发黑洞

    解决方法:为了尽快恢复流量转发,STP引入了变更通知和应答消息
    在常规 STP 操作中,网桥一直从其根端口上的根网桥接收配置 BPDU。但是,它从未派出BPDU往根网桥。为此,引入了称为拓扑更改通知 (TCN) BPDU 的特殊 BPDU。因此,当网桥需要对拓扑更改发出信号时,它开始在其根端口上发送 TCN。指定的网桥接收并确认 TCN,还为自己的根端口生成另一个 TCN。此过程将一直持续,直到 TCN 发现根网桥为止。
    TCN 是非常简单的 BPDU,不包含网桥每 hello_time 秒(这是本地配置的 hello_time,不是配置 BPDU 中指定的 hello_time)发送的任何信息。指定的网桥通过立即发回设置了拓扑更改确认 (TCA) 位的正常配置 BPDU 来确认 TCN。通知拓扑更改的网桥不停地发送其 TCN,直到指定的网桥确认它为止。因此,指定的网桥将应答 TCN,即使不从其根网桥接收配置 BPDU 也是如此。

    变更通知上报,直到树根

    将事件广播到网络
    只要根网桥得知网络中有拓扑更改事件,就会开始发送设置了拓扑更改 (TC) 位的配置 BPDU。这些 BPDU 将由网络中设置了此位的每个网桥转发。因此,所有网桥都注意到拓扑更改情况,并可以将其老化时间缩短到 forward_delay。网桥在转发和阻塞端口上接收拓扑更改 BPDU。
    TC 位在 max_age + forward_delay 秒(默认情况下为 20+15=35 秒)内由根网桥设置。

    BPDU从根向下发送

    BPDU发送时机

    1. 对于根桥,主动发送BPDU:根据Hello周期,主动通过所有DP发送BPDU
    2. 非根桥,中继BPDU:从RP收到BPDU,从所有DP发送出去。

    什么时候认为是拓扑发生了变化

    1.网桥至少有一个指定端口,并且某端口从其他(Blocking、Listening、Learning)状态转到Forwading状态。
    2.某端口由Forwading、Learning状态转到Blocking状态。

    拓扑变化的实例分析

    1. 根桥宕机
      根桥如果down机的话,所有网络都收不到保活报文,到了MaxAge后,网络重新选举。
      (皇上驾崩,天下大乱,群雄逐鹿,重立新主)

    2. 某条链路break,比如下图:SW1是ROOT,SW1和SW3之间cost 是100,其他cost 都是20.所以正常情况下,会将SW1和SW3之间的链路剪枝。如果SW1和SW2之间的链路出现故障,我们看看重新收敛过程如何。

    一个例子
    1. 出现故障的链路是SW2的RP端口链路,SW2无法从他的RP端口收包根桥的保活BPDU.
    2. 因为SW2也无法从其他端口收到BPDU保活,所以一段时间过后,SW2认为网络中没有根了(实际上是因为信息的缺失而导致错误的认为)。SW2开始自立为王(根桥)。
    3. SW4发现根桥发生了变化,但他也不知道具体是什么情况,领导(上游节点)既然这么说了,就跟着领导走吧。他也宣称根桥变成了SW2。并把这一信息向外扩散。
    4. SW3收到SW4的宣告,发现不对,SW1应该比SW2更强,并且自己离SW1更近,随即SW3宣告SW1应该是老大,并自己变成该网段的DP,开始在该网段上发送BPDU。随后大军压境,重新收复SW4和SW2.最终恢复天下太平。

    参考资料:

    Cisco:网络拓扑变化
    STP与RSTP的比较

    相关文章

      网友评论

      • 叶桐学:学习一下
      • 商业无忧:链路上的指定端口(DP,端口决策):如果从该端口收到更好的BPDU,则说明别人李根桥更近,则自己端口不是DP,否则则认为自己是DP。

        这个不是太理解,能否更深入的讲解一下,谢谢!!!

      本文标题:STP工作原理 - kummer话你知

      本文链接:https://www.haomeiwen.com/subject/yftlvttx.html