全部博文(101)
分类:
2012-08-30 21:46:12
这是一个已经被说烂的协议, 可惜, 我不认为有很多人了解或者真正理解了里面的细节, 所以, 看的时候还是蛮饶有兴致的, 仔细看了一次, 然后复习了一次, 算是比较清晰了吧.
生成树协议的目的
生成树(Spanning Tree)协议, 说白了就是让网络中的所有交换机形成一个第二层的无环网络. 这是有必要的. 因为实际网络中交换机往往需要多条链路来实现冗余, 让网络不至于因单点故障而中断通信, 因此一个交换机可能需要有多条不同的链路连接到某个端口. 很明显, 这样就造成了网络是环状的(画个图就理解了). 然而, 交换机的特性是只划分冲突域而不划分广播域, 因此这种环状实际上是不允许出现在多个交换机的拓扑中的.
很简单的也很容易出现的一个问题就是广播风暴. 其实就是两个交换机A和B通过两条链路连接, 这就是一个最简单的环路. 当A收到一个广播, 很自然的要向其它所有端口发送. 由于存在环路, 很自然, A的这个端口会收到同样的广播, 然后又重复刚才的操作, 向所有其它端口发送. 这是无法停止的. 可以想象, 当网络比较大的时候, 这种广播会引起所有的交换机同时发送一样的广播包, 导致阻塞链路甚至使交换机down掉. 这就是广播风暴.
很明显, 要解决这种问题只能有一种方法, 就是让存在环路的网络变成没有环路的网络, 也就是让某些冗余的链路暂时不能工作, 而作为正常链路的备份, 当正常链路失效的时候再启用冗余链路. 而生成树协议就是为了达到这个目的.
生成树协议的运行步骤
生成树协议的运行一般是自动的, 也就是说当交换机启动就开始运行这个协议了. 生成树协议包含了一个叫做网桥协议数据单元(BPDU), 所有的生成树协议相关信息都背包含在BPDU中, BPDU是交换机启动后自动发送的, 默认间隔为2秒. 所有交换机用它来:
选择一台交换机作为生成树的根交换机;
计算它到根交换机的最短路径并确定根端口;
在每一个LAN网段(即交换机端口隔离的网段), 选举一个指定端口, 只有指定端口和跟端口才能连接该网段和外部的通信. 同一网段的其它端口都处于阻塞状态, 不能通信.
生成树的端口状态
可以把生成树协议中交换机通信数据分为两类, 一类是BPDU包, 另一类是用户数据. 所有端口在任意状态均会发送BPDU以获得同样的拓扑. 在这个基础上, 可以把生成树协议中的交换机端口分为5种状态:
侦听状态: 侦听和发送BPDU来确定下一个稳定的生成树拓扑. 交换机启动时处于这个状态, 持续15秒, 期间不发送用户数据. 这个状态下生成树完成根桥, 指定端口和根端口的选举.
学习状态: 侦听状态后, 根端口和指定端口进入学习状态, 这个状态还是不转发用户数据, 而只通过收到的用户数据学习该端口下都有那些MAC地址, 从而建立MAC映射表. 持续15秒.
阻塞状态: 侦听状态后, 非根端口和指定端口直接进入这个状态. 只接收用户数据包和BPDU, 不进行转发. 当20秒内未收到BPDU后, 重新进入侦听状态.
转发状态: 学习状态后, 根端口和指定端口进入转发状态. 这时指定端口开始转发所有的BPDU和用户数据.
禁止状态: 不转发用户数据和BPDU, 可以理解成不参与协议了.
生成树收敛是指交换机处于转发或阻塞状态, 而不存在侦听或者学习状态. 因为这时候生成树是稳定的.
当网络拓扑产生变化需要重新计算生成树, 到网络重新收敛, 通常需要20+15+15=50秒. 而如果直接连接的链路失效(如直连端口失效), 能被CDP直接检测到, 因此不需要20秒的生存时间, 重新收敛只需要30秒.
根桥(根交换机)和指定端口的选举
根桥的选举可以用一个字来形容: 低. 即比较谁的Bridge ID最低谁就是跟桥. BID由两部分组成: 优先值和MAC地址, 先比较优先值再比较MAC地址. 默认优先值是一样的. 所以如果想人工干预跟桥选举, 就可以设置低的优先值.
所有的交换机如何都得知谁的BID最低呢?当然是通过BPDU. 如前面所说, 所有交换机刚启动的时候均处于侦听状态, 即不发送用户数据, 发送和接收BPDU. BPDU含有下面4字段在选举中很重要:
Root ID: 本交换机当前"承认"的根桥, 在网络未稳定前, 每收到更低BID网桥发来的BPDU, 该交换机都会将自己发送的BPDU中Root ID字段替换成这个更低的BID(注意不是直接转发这个BPDU). 网络稳定后, 网络中所有BPDU的Root ID都是变成一样的了.
Bridge ID: 本交换机的BID, 在选举指定端口时使用, 通过它也了解了哪些交换机在同一LAN中.
Root Path Cost: 达到根桥的成本, 在选举指定端口时使用.
Port ID: 端口ID, 选举指定端口时, 在当通过前面三个条件不能判断时使用端口ID判断(其实就是判断同一交换机的不同端口, 当这些端口在一个LAN中时).
首先, 广播自己的BPDU, 其中包含一些重要的字段(详见下面的指定端口选举). 最初的BPDU中BID字段和Root ID字段均为本交换机的BID. 在之后的过程那个中, 每个交换机如果收到的BPDU中的Root ID比自己的Root ID低, 则将这个Root ID替换当前自己发送的BPDU中的Root ID并继续广播, 通过这个过程, 最终所有的交换机都接收和发送相同Root ID的BPDU, 而这个BPDU的Root ID就是跟桥的BID.
选择了跟桥以后, 就开始选举指定端口. 指定端口按顺序判断Root ID, Root Path Cost, BID和Port ID, 并选出最低的值作为该网段的指定端口. 另外, 每个交换机上有一个根端口, 该端口是交换机上Root Path Cost最低的端口, 也就是该交换机上离跟桥最近的端口. Root Path Cost是在BPDU接收端口上进行累加的(注意: 发送端口不参与), 如果该端口连接到快速以太网, 则该端口要累加19.
根桥, 指定端口和根端口选举完毕后, 进入学习状态, 然后进入转发状态. 剩下的端口直接进入阻塞状态.
RSTP(Rapid STP)
快速生成树利用了一些技巧让生成树收敛得更快. 比如, 设置与终端相连的端口为边缘端口, 不会形成环路, 因此不再经过侦听和学习状态而直接进入转发状态. 当边缘端口的连接稳定下来以后, 它不会再引起拓扑的变化. 细节不再详述了.