脱壳的乌龟图片:Spanning Tree Protocol介绍

来源:百度文库 编辑:九乡新闻网 时间:2024/05/01 07:31:56

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都是思科提出来的,内核暂时还没有实现,因此这里就没有介绍。。