Spanning Tree Protocol介绍Spanning Tree Protocol(STP)主要是用在网桥上,用来避免网络回路,并制造冗余连接(也就是保证网络的可靠性).
这里只是一个大概的介绍,具体的还是要去看IEEE 的 802.1D STP的文档。 先看下面的图: 我们可以看到在stp中,只有一个根节点,然后root port指的是将此网桥和root连接起来的那个端口,而designated port指的是在连接这个lan的端口中,距离root最近的那个port。 这里虚线部分就是没有激活的link,而对应的端口也是关闭的,这些连接其实就是冗余连接,当实线的某些连接不可用时,这些虚线部分的一些就会根据stp的算法进行激活。 而要实现stp的这些目标,就需要在各个网桥之间传递相应的帧(比如树的平衡,还有上面所说的情况等等).而这个帧就叫做bridge protocol data units(UPDUS). 在stp中,只有根节点才会生成BPDUS,而另外的节点只会接收BPDUS或者update它。 在stp中,每个端口都有状态,分别是下面5种: disabled(关闭),blocking(端口启用,可是stp阻塞了它),listening(端口打开,但不能传输数据),learning(学习网桥地址被激活),forwarding(数据能被传输). 来看它的状态图: 这里要注意每个状态的转化都会启动一个相应的定时器。 每个网桥和端口的角色以及状态都依赖于一些设置的参数,这些参数都有默认值,可是也能通过用户控件来改变。 Bridge ID(网桥id),Port ID(端口id)。 而下面的几个参数是用来改变网桥和端口的优先级: Port cost(端口的权重,值越小,权重越大),Timers(stp使用每个端口,每个网桥都有定时器). 下面来看参数的构成(这里是802.1t,他是改变了一些位的表示,相比于802.1D): 可以看到多了system id位,有了它就可以用4096个不同的网桥id来共享相同的mac地址,之前的话就需要4096个mac地址。这里要注意4096不是一个随机的数字,它表示了在802.1Q协议中最大的vlans数目。 802.1t的改变并没有影响stp,从他的观点来看,桥id就是一个8字节的值,端口id就一个2字节的值。它只是影响了用户空间的config工具。 下面来介绍BPDUs BPDUS分为两种类型: 1 Configuration BPDU 主要用来防止回路。 2 Topology Change Notification (TCN) BPDU 当整个网络拓扑改变的时候,一个网桥发给根节点网桥 。比如在当前网络加入一个新的网桥。 来看他们帧的结构: 这里的protocol id和version字段是为了标示stp,rstp还有mstp这几个的区别(后两种都是stp协议的增强),其中后两种linux内核还没有实现。 通过上面的帧的结构那张图我们能看到一个configuration bpdu的所有域,这里重点看一下它的priority vector,它又4个字段组成: Root Bridge ID, Root Path Cost, Bridge ID, and Port ID,而两个优先级向量之间的比较是每个字段依次比较的。也就是说通过这个我们就能确定根节点。 接下来看当一个网络拓扑改变后会发生什么事。 在上面的这个图中,a2和d1中的网络断掉了,此时a2将会连接到d2. 当改变后a2将会开启定时器然后发送tcn到d2,然后d2也会开启定时器,发送tcn到c1,当c1接收到tcn后,他会发送一个config bpdu with tca flag,当a2接收到这个帧后,就会关闭定时器,然后此次拓扑修改就完成。 最后我们来看一下当新加入一个网桥后,会出现的情况。 每一个新加入的网桥都会首先认为自己是根节点,因此它就会发送一个config bpdu,然后他也会接收到一个根节点传过来的bpdu,通过优先级向量的比较,当它的优先级低时,就会设置根节点为本身网络的根节点,而当他优先级高的时候,所有接收到它的bpdu的帧的端口也都修改相应的值。 我这里只是介绍了协议的大概,比如定时器一些都没有涉及,详细的介绍还是应该去看ieee的specifications和源码。 而另外的rstp和mstp都是思科提出来的,内核暂时还没有实现,因此这里就没有介绍。。 |
|