透明网桥
星期1, 2008年10月12日透明网桥最初由数字设备公司(DEC)提出,并被802.1委员会采纳。为清楚起见,将通过逐渐增加特征来“构建”透明桥。
数字设备公司的网桥和802.1委员会标准化的网桥都具有以下特征:
• 纯网桥的混杂侦听和存储转发能力。
• “学习”网桥的站点学习缓冲区。
• “完全”网桥的生成树算法。
注意:中间形式的网桥(纯网桥和学习网桥)都不是标准网桥。802.1d的标准要求,一个网桥必须具备生成树算法和学习能力。部分较早时候提出的网桥并不具备这些特征,之所以在这里介绍它们,主要是因为将每个特征分别讨论,可以使网桥的理解更简单。
1. 纯网桥
最基本的透明网桥形式,是连接到两个或更多LAN上(与LAN之间的接口称为端口)的网桥。这种网桥混杂侦听传输经过的每个包,存储接收到的每一个包直到它可以被发送到除源LAN之外的LAN上去如下图。

透明网桥的设计思想,是让原先设计只在单个LAN上操作的站点能够在多LAN环境中工作。和在单个LAN环境一样,站点可以发送以及分发包,因此网桥必须按它所收到的包格式来发送。如果网桥对包进行了某种修改,比如说,它把源地址覆写为网桥自己的地址,则站点上的协议就可能不能正确工作了。但网桥确实更改了时延参数,对某些单LAN环境中有严格计时器的协议可能有影响,但大多数的协议都没有这样的严格计时器或是可以调整的。
根据以上这些基本思想,纯网桥拓展了LAN的功能。例如,在802.3中,包的大小可以超过802.3硬件所允许的范围。如果用一个中继器而不是用一个网桥来连接2个LAN,则中继器逐位转发它所收到的数据,而且中继器一边的站点在发送数据时,可能会和中继器另外一边的站点端口1 端口2发送发生冲突。然而,在用纯网桥连接几个LAN时,网桥在接收到包时,并不马上发送它,而是先把整个包接收下来并存储,然后等待另外一边的LAN变为空闲。这样就可以避免网桥两边的两个站点在同时发送时所导致的冲突。使用纯网桥可以拓展LAN能力的另一个例子是,在802.5中,使用纯网桥可以增加LAN中的站点数目。
在802.5中,环上的站点总数是有限的,因为时钟抖动在每个站点上累积,而有了足够多的抖动,相位锁循环就无法锁定。网桥可以解决这个问题,因为它在其所连的每个环上实现完全独立的环MAC子层协议(见图连接两个环的简单网桥)。每个环都有自己独立的令牌以及分离的活动监视器(用于同步所有站点时钟的站点)。不管LAN的类型如何,纯网桥都无法克服LAN的带宽限制。如果连接到某个纯网桥的LAN的容量都为10Mb/s(如802.3、802.4和802.5),则可以安全使用的总带宽仍为10Mb。这是因为纯网桥试图保证在任何LAN上传输的每一个包最终都出现在每一个LAN上。由于每一个包都会出现在每一个LAN上,就要求所有LAN上的所有节点的联合传输能力不能超过10Mb(或者这些LAN所能达到的某一速度)。

小警告:“所有LAN上的所有站点的联合传输能力不能超过任何单个LAN的带宽”这个论断并不完全正确,有以下两个原因:
1) 在某个较短的时间间隔中,可能会出现暂时的传输高峰,只要网桥的缓冲区足够大到存储这些额外的包,它们就不会丢失。
2) 如果纯网桥的缓冲区不足以存储这些额外的包,则网桥会选择抛弃一些包。最好的可能性是网桥恰好丢失那些不需要被转发的包(即源地址与目的地址在同一个LAN中)。因此,理论上说来,它的吞吐量可以超过10Mb。因此,理论上说,总的吞吐量可能超过单个LAN的带宽。但实际上,由于纯网桥并不能区分哪些包可以被安全地抛弃而哪些必须进行转发,如果总的带宽超过了LAN的速度,则包会在到达目的地之前就被抛弃。网桥的下一个改进解决了这个问题,它允许网桥智能地选择被丢弃的包以及允许总带宽超过单个LAN的带宽。
2.学习式网桥
假设网桥想知道哪些站点在哪些LAN上,这里有几种可用策略(但实际上并没有用到):
1) 网络管理员可以手工把每个LAN上的所有站点的地址输入到网桥的数据库中去(见图站点地址单独配置)(在802.1标准化透明学习网桥之前,某些厂商曾制造过这种网桥)。

2) 网络管理员可以这样放置站点:每个LAN上的站点地址只在某个范围内。下图是这样的一个例子。

3) 网络管理员可以分配站点地址,使得站点地址可以表明该站点所属的局域网。这样,一个站点地址就可以被分为两个部分(见图“站点地址中的一部分为LAN编号”),一部分是“网络号”,另外一部分表明它在该局域网上的位置。

如,某个地址可能读为“5.21”,表示“5号局域网上的21号站点”。前面所说的这些策略涉及到很难的管理。如果每个站点都有一个全球标识的48位ID(这个ID由每个厂商存储在ROM里面),并在任意位置连接到拓扑结构上,则网桥就能判断站点所处的位置了。这个设想是可行的,假定每个站点在发送包时,在报头的源地址字段里加入自己的地址(见图“地址前缀配置”)(为什么要说是“假定”呢?如果站点在发送包时,在源地址字段里填入的不是自己的地址,不是违反标准的规定了吗?注意,网桥在转发包时,并没有把自己的地址填到源地址字段中去。认为报头中的源地址标识了包的发送者,一般来说这是一个好的假定)。

网桥使用的策略如下:
1) 网桥混杂侦听,接收所经过的每一个包。
2) 对于每一个接收到的包,网桥都会在缓冲区(称为站点缓冲区)中记录下源地址信息和该包所来自的端口的信息。
3) 对于收到的每一个包,网桥在站点缓冲区内查找包的目的地址:a) 如果站点缓冲区里没找到这个地址,网桥把这个包转发给除接收此包的接口之外的所有接口。b) 如果在站点缓冲区内找到这个地址,则网桥只向列表中指定的接口转发该包。如果该指定的接口就是接收该包的接口,则抛弃这个包(即过滤)。
4) 网桥对站点缓冲区中的每一个条目进行计时,然后删除那些在一定时间(用参数agingtime表示)内一直没有包发送来的地址项(由于802.1d的编委是个英国人,因而801中使用的是ageing time)。
假定拓扑结构如下图,B在开始的时候对拓扑结构一无所知。

现在假定站点A要发送一个包给D。这个包如下图所示。

网桥通过查看包的源地址并注意到包是从端口1收到的,则它判断出A在端口1的那端。但网桥还不知道站点D位于何处,所以它把这个包往所有端口(端口1除外)转发。在这个例子中,只往端口2转发这个包(见下图)。

现在假定站点D要发送一个包给站点A(见下图)。

网桥发现这个包是D通过端口2发送过来的,因而可以判断出D位于端口2的位置。而且,网桥已经知道A位于端口1的位置,因而直接把这个包转发到端口1去(见下图)。

现在假定站点Q发送了一个包给A(见下图)。

网桥发现这个包是Q通过端口1发送过来的,因而可以判断Q位于端口1的位置。而网桥已经知道A也位于端口1的位置,因而知道它没有必要对这个包进行转发(见下图)。

学习网桥的概念非常有用,并且可以适用于很多种拓扑结构。例如一个网桥可以有两个以上的端口(见下图)。

开始的时候,B只知道它有3个端口。假定A向D发送了一个包,B注意到A位于端口1的位置,因为B还不知道D的位置,于是它把这个包同时转发给端口2和端口3。经过这个初始的包以后,B的学习状态如下图所示。

现在假定D向A发送了一个包。B将发现D位于端口2的位置,由于B已经知道A位于端口1的位置,所以B只向端口1转发这个包。现在假定Q向A发送了一个包。B将注意到Q位于端口1的位置,而A也是位于端口1的,因而不再需要转发这个包(见下图)。

现在假定Z向C发送了一个包。B发现Z是位于端口3的,但是B还不知道C的位置,所以它必须把这个包同时向端口1和端口2转发。现在,已经解释了多端口网桥的工作原理,让我们来看看多个网桥是如何工作的吧。先看下图所示的例子。

网桥B1并不能区分LAN2和LAN3上的站点。B1只能意识到它连接着2个LAN,一个连接到端口1,另外一个连接到端口2。网桥B2透明地连接LAN2和LAN3,因此B1并不知道B2的存在,就像网桥B2的存在对节点是不可见的。当所有节点都发送过一些包以后,2个网桥上的缓冲区的状态如图下图所示。

对B1来说,它所看到的图“多跳情况下站点位置的学习”的拓扑结构如下图所示。

对B2来说,它所看到的图“多跳情况下站点位置的学习”的拓扑结构如下图所示。

学习网桥可适用于所有树型(无环)拓扑结构。那么学习网桥可以拓展到所有的拓扑结构吗?考虑下图所示的网络。

当站点A想发送一个包时,会发生什么呢? A向哪个站点发送这个包无关紧要。假定这个目的站点还没有发送过任何包,因此网桥的站点缓冲区里还没有这个地址的记录。最普遍的一种猜想就是这个系统将会导致3个包拷贝被转发到LAN2上。如果系统真的是这么实现的,事情还不是太糟糕。但实际上,情况比这个糟糕得多。精确地说,是非常糟糕。
开始时,这3个网桥都
1) 接收包;
2) 注意到A位于LAN1上;
3) 排队等待转发包到LAN 2上。
然后,根据LAN的规则,其中一个网桥(不妨假定是网桥3)首先成功地发送包到LAN2上。由于网桥3的存在对网桥1和2来说是透明的,这个包就会出现在LAN2上,就像是A发送包到LAN2上。这样,网桥1和2就会
1) 接收这个包;
2) 在列表中注明A现在位于L A N 2上;
3) 排队等待转发包到LAN 1上。
下一步,假定网桥1成功地把它最初接收到的包发送到LAN 2上。网桥2和3都将接收到这个包,网桥2只是注意到A仍然位于LAN 2上,而网桥3将会发现A现在已转移到LAN 2上了,然后这两个网桥都会将包排队以等待转发到LAN 1上。现在再假定网桥1成功地把这个包转发到LAN 1上,网桥2和3会发现现在A又位于LAN 1上,然后把这个“新”包放入发送到LAN 2方向上的等待队列。
因而,这里发生的不仅仅是包的循环,还会发生增生扩散。每一次成功的包发送,都会导致在系统中产生2个新的包。如果你对路由器很熟悉,就会知道包循环对路由器来说不是这样糟糕。对路由器来说,每个包都是直接送给指定路由器,每个路由器又只将包送给单一的接口。因而,对于路由器来说,一个包可能被传送无限多次,但在每一跳时,它不会衍生出新的包。在每一个点上,都只有单份包存在。另外,对路由器来说,每个包内部都有一个跳记数,因而产生循环的包可以被抛弃掉。但由于网桥的存在必须是透明的,一个包在第25次被重复传输时,在网桥看来,都跟它首次被传输一样。现在大家都很清楚,当拓扑结构中出现回路时,学习网桥的性能会变得很糟糕,我们可以有几种选择:
1) 我们可认为网桥根本就是一个糟糕透顶的主意。
2) 我们可以在文档中写明,网桥所适宜的拓扑结构必须是无回路的。这样如果有人不小心使拓扑结构出现回路,我们就可以拿着文档振振有辞地对他们说“这全是你的错,下次小心点!”。
3) 我们可以设计能够检测并报告存在回路的网桥。这样,最起码用户可以不必知道域服务存在的问题。
4) 我们可以给网桥设计一个算法,把拓扑结构修剪成一个无回路的子集(一棵生成树)。
结论1肯定是不正确的,因为在无回路的拓扑结构中,网桥很有用处。结论2和3都是不受欢迎的,因为允许拓扑结构中存在回路是很有帮助的。如果没有回路,拓扑结构中就没有冗余,如果有某一处断开,网络就不再连通。回路不应该被理解为是不好的结构,而应该被认为是一种较好的策略。结论2的另外一个不足之处是,它代表了一种脆弱的用户服务的策略。如果结论4的算法可以实现的话,则是非常可行的。幸运的是,这样的算法是存在的,并且很简单(见下图)。

3.生成树算法
生成树算法的目的是让网桥动态地发现拓扑结构的一个无回路子集(树),并且保证足够的连通度,以使得只要物理上可能,每两个LAN之间就存在一条路径。生成树算法的基本思想是,让网桥彼此之间传递特殊的消息,使它们能计算生成树。801.1把这种特殊的消息称为“配置网桥协议数据单元”或者“配置BPDU”。但ISO的一些术语和其他的一些说法已经把人搞糊涂了,为了便于读者理解,在本章中,“配置BPDU”被称为“配置消息”。
配置消息中包含了足够多的信息,以便于网桥可以做以下工作:
1) 在所有LAN的网桥中,选出其中的一个作为根网桥(root bridge)。
2) 计算出这些网桥自己到这个根网桥的最短路径。
3) 对每一个LAN,从位于其上的网桥中选出一个指定网桥(designated bridge)。这个网桥必须是离根网桥最近的那个网桥。指定网桥负责桥其所在LAN上的包转发给根网桥。
4) 网桥选择一个端口(根端口root port),这个端口给出的路径是此网桥到根网桥的最佳路径。
5) 选择那些包含在生成树上的端口。这些端口由根端口以及此网桥成为指定网桥时所在的端口组成。
数据通信就是在生成树的这些端口之间进行发送或接收,而不会发送到那些不包含在生成树内的端口上。
配置消息
网桥发送一个配置消息到某个端口,这个配置消息将会被连接到这个端口的LAN上的其他网桥接收到,并且不再被转发。配置消息有一个普通的LAN数据链路层的报头(见下图)。

数据链路层报头中所包含的目的地址是一个特殊的广播地址,指向“所有的网桥”(由于802.5不能处理真正的广播地址,因而特意为它定义了这个功能地址)。数据链路层报头中所包含的源地址是发送该配置信息的网桥的端口地址(网桥的体系结构要求网桥的每个端口有不同的数据链路层地址)。它的SAP值是01000010,这个数字很方便记忆,且不大容易弄错。
虽然网桥的每一个端口都有自己独立的地址,但网桥也有一个单一的ID,用在配置信息的数据部分中表示这个网桥,这个ID可以是网桥某个端口的LAN地址,也可以是任何一个唯一的48位地址。配置信息的数据部分(其他的部分以后有介绍)包括:
• 根ID:根网桥的ID。
• 发送网桥的I D:发送这个配置信息的网桥的ID。
• 费用:从发送网桥到根网桥的最小花费路径(最起码是发送网桥目前知道的最佳路径)的费用。
网桥开始时假定它自己是根网桥,向它的所有端口发送配置信息,把自己的ID作为根网桥和发送网桥,费用设为0。网桥不断地从它的每一个端口接收到配置信息,并且保留每个端口的“最优” 配置信息(“最优”的定义将在下一段中介绍)。网桥在决定最优配置信息的时候,不仅要比较来自该端口的那些配置信息,还要与网桥从该端口发送出去的配置信息相比较。假定现在有两条配置信息:C1与C2,则
1) 如果C1中的根ID在数值上比C2中的根ID小,我们认为C1优于C2。
2) 如果C1与C2的根ID相同,但C1中的费用比C2低,则C1优于C2。
3) 如果C1与C2的根ID和费用都相同,但C1中发送网桥的ID在数值上比C2中的低,我们认为C1优于C2。
4) 配置信息里还有一个字段,称为端口标识符(port identifier)。发送网桥有一些对它自己的端口的内部编码方式,当它通过端口n发送配置信息时,便把n存储在端口标识符字段中。如果根ID、费用以及发送网桥都相同,则可以通过端口标识符来作比较。这个字段主要用来检测同一网桥是否同时有两个端口连到某个LAN上。这种情况可能发生在两个不同的LAN通过中继器相连或者某网桥的两个端口同时连到同一物理LAN上时。为了简单起见,在以下的例子中,我们将忽略端口标识符字段。
在下图所示的三个例子(a,b,c)中,配置信息C1都优于配置信息C2。对于情况a,C1的根ID比C2的低。情况b,C1与C2的根ID与费用都相同,但C1的发送网桥的序号比C2的低。情况c,C1与C2的根ID相同,但C1的费用比C2的低。

注意到,有了前面的规则,若对每个配置信息构造一个多精度数字:根ID最重要,其次是费用,最后是发送网桥的ID,则可利用该数字对配置信息进行排序。如果网桥从LAN上收到的配置信息优于它想发送的配置信息,则将放弃发送该配置信息。因而当算法稳定时,每个LAN上都只有一个网桥(即LAN上的指定网桥)在发送配置信息。
基于从所有接口收到的配置信息,每个网桥可以独立地判断根网桥。根网桥是该网桥的ID以及它所收到的所有配置信息中的根ID中序号最小的一个。假定某个网桥B的ID为18,它从每个端口收到的最优配置信息如下:

首先,网桥B选择根网桥。本例中,B听到的最优的根ID是12。如果B的ID小于12,B就是根网桥。现在,B开始计算它到根网桥的距离。如果B是根网桥,则距离为0。否则,B到根网桥的距离是各端口所报告的到邻接点的费用与邻接点到根网桥费用之和的最小值。假定我们现在按跳计数(过一个节点的费用为1)。因为B不是根网桥,所以它的费用为86,即它从端口2上所收到的(到根网桥12)费用85加上1所得。B还将选出某个端口,通过它到达根网桥的费用最少。这个端口有时被称为根端口,或者称为内连接(inlink)。本例中,B将选取端口2作为它的根端口。如果同时有多个可供选择的端口,一般选择发送者ID最小的那个端口。如果仍然存在多个可选,则比较端口ID(配置信息中的另一个字段)。当B确定根以及它到根的距离后,B就可以确定它自己的配置信息的组成,并将它与在每个端口所收到的最优的配置信息进行比较,从而确定B是否是该端口的指定网桥。本例中, B的配置信息为12.86.18。B的配置信息优于端口1、3和4所收到的配置信息,因而B被认为是端口1、3和4上的指定网桥(除非它在这些端口上接收到更优的配置信息),并且向这些端口发送B的配置信息12.86.18。
选择生成树的端口
在B计算出根、到根的费用以及每个端口的指定网桥后,就可以确定哪些端口在生成树上,哪些不在。生成树上的端口包括:
1) B的根端口。本例中为端口2。
2) B为其指定网桥的那些端口。本例中为端口1,3和4。
被B选为包括在生成树上的那些端口,处于转发状态( forwarding state),即B将通过这些端口转发或者接收包。其他的端口则处于阻塞状态( blocking state),B既不从这些端口上接收包,也不向这些端口转发包。
一个例子
在下图中,ID为92的网桥有5个端口。端口1接收到的最优配置信息是81.0.81,根网桥ID是81,到根的费用是0,发送这个配置信息的网桥ID是81,在这个配置信息中, 81也是根的ID。端口2收到的最优配置信息是41.19.125;端口3收到的最优配置信息是41.12.315;端口4收到的最优配置信息是41.12.111;端口5收到的最优配置信息是41.13.9 0。

网桥92可确定最好的根是41,网桥92到根的最短距离是12 + 1 =13(通过端口3或4)。网桥92必须从其中(端口3和4)选出一个作为它的根端口,可以比较相邻指定网桥的ID。它将选择端口4作为根端口,因为端口4上的配置信息的邻接网桥的ID为111,小于端口3的邻接网桥的ID315。综上所述,网桥92发送的配置信息将为41.13.92,优于在端口1和2所收到的配置信息。因而在端口1和2上,网桥92将把自己设为指定网桥,并丢弃原先在这两个端口收到的配置信息(见下图)。而网桥9 2的配置信息(41.13.92)并不优于在端口5所收到的配置信息(41.13.90)—根据指定网桥ID序号可判断。

根据以上计算结果,网桥92将把端口4(根端口)以及端口1、2(网桥9 2为其指定网桥的端口)做为生成树上的端口;而端口3、5将被设为阻塞状态—即这些端口上的生成树算法将继续进行,但网桥92并不从这些端口接收包,或发送包到这些端口上,也不需要了解这些端口上的站点位置信息。注意,如果本例中把网桥92的ID号改为15,则根网桥的ID应该是15,到根的费用为0(本身就是根),而且在所有端口上它都将是指定网桥,向所有端口发送配置信息(15.0.15)。
4.生成树算法的改进
到现在为止,我们主要讨论了当算法开始时的一些情况。本节接下来要讨论该算法如何处理在执行过程中发生的故障和拓扑结构的变化。
故障
在前面所述的算法中,我们讨论了怎样初始化一个网络,以及如何新增一条链路或者新增一个网桥,但没有提到如何处理链路或网桥的故障。每个端口所存储的配置信息都包含一个字段:消息生存期(message age)字段,它每隔一个时间单位增加1。当消息生存期到达某个阈值(最大生存数max age)时,这个配置信息被抛弃,网桥开始重新计算(就像它从未从那个端口收到过配置信息一样)。在正常情况下,根网桥周期性地发送配置信息(每一个hello时间)。当根网桥产生一个配置信息时,它的生存期为0。当其他网桥收到根网桥的配置信息时,会触发它们向每个指定的端口发送生存期为0的配置信息。同样,当指定网桥“下游”的网桥收到生存期为0的配置信息时,它们也将向那些指定的端口发送它们自己的生存期为0的配置信息。如果根网桥发生了故障,或者从根到某网桥之间的某个部件发生了故障,该网桥将不再从根端口收到“新鲜的”(生存期为0的)配置信息,它会不断地增加为这个端口存储的配置信息的生存期数,直至达到阈值。此时,网桥将抛弃这个过时的配置信息,重新开始计算根、到根的费用以及根端口。例如,假定下图中端口4的配置信息超时,如果端口3的配置信息还没有超时,则网桥92只需把端口3做为新的根端口,而它在网桥1和2上的配置信息并没有变化。

现在假定端口3上的配置信息也超时了(见下图)。这时,网桥92将把端口5设为根端口,这一变化使得网桥92的配置信息变为41.14.92。

如果端口3、4和5的配置信息都超时了,则网桥92将把自己设为根网桥,并向这5个端口发送它的配置信息(92.0.92),直到它从任一个端口收到有更好“根”的配置信息(见下图)。

以下事件触发生成树计算:
1) 在端口X接收到某配置信息:在这种情况下,网桥把新接收的配置信息与所存储的该端口的配置信息进行比较。如果新接收的配置信息更优,或者相同但是它的生存期数更小,则用新的配置信息覆盖原来存储的配置信息。然后重新计算根、到根的费用以及根端口。
2) 时间记数(timer tick):在这种情况下,网桥在每个时间单位增加每个端口的配置信息的生存期数。当某个端口的配置信息的生存期数到达阈值时,网桥抛弃原先存储的配置信息,开始重新计算根、到根的费用以及根端口。
如果指定网桥只有在收到根网桥发送的配置信息时,才会发送自己的配置信息,则没有必要在配置信息中增加生存期这个字段,因为在传输时它总为0。但是,即使指定网桥没有接收到从根网桥发来的配置信息,它也可能发送自己的配置信息。假定B是某端口的指定网桥。B没有接收到从根方向来的配置信息,所以现在它所存储的根方向的配置信息的生存期为X(B一旦开始存储这条配置信息,就立刻开始计数)。如果有另外一个网桥B2,正要加入网络,因为它还没有收到从B发来的配置信息,所以它将发送自己的配置信息。如果B忽略了B 2发的这条消息,而只是在等待从根方向来的新配置消息,这将增大B2与网络其他部分的不同步。如果B 2没有接收到B的配置信息, B2将把自己设为该端口的指定网桥,从而增加了新的连接,导致产生一个回路。此时,如果B重新发送它的配置信息,且没有生存期或生存期为0,则会减缓这个子树发现故障的时间,因为配置信息的重传看起来像是保证了根在B重传配置信息时还处于正常工作的状态。因此在本例中, B必须发送它的配置信息,且生存期为X。这与新加入的网桥在X个时间单位前接收到B发送的配置信息,效果是一样的。
避免临时循环
当拓扑结构发生变化时(如新加入一个网桥或链路,或者某个网桥或某条链路发生了故障),这个事件需要经过一定时间才能传播到整个网络。在所有网桥都收到这个新变化前,它们使用的数据是不一致的。这种情况有两种可能的结果(它们可能同时在网络的多个部分出现):
1) 如果在旧的拓扑结构中某个网桥的端口未使用,而它还未发现它需要加入到新的拓扑结构中,则可能暂时失去连通性。
2) 如果在旧的拓扑结构中使用了某个网桥的端口,而该端口还未发现它在新的拓扑结构中应停用,则拓扑结构中可能存在临时的循环。
前面已经提到过,带回路的网桥连接要比带回路的路由器连接危险得多,主要有两个原因:
1) 网桥连接的网络中,包的报头没有跳记数,因而发生循环以后会不断地继续下去直至拓扑结构稳定。
2) 网桥连接的网络中,包可能增生扩散,因为网桥可能把一个包转发到多个L A N上,而在一个包发送到某个L A N上时,还可能有几个网桥同时接收到它。相反地,路由器只往一个方向上发送包,并且指出这个包将发给哪个路由器。因此,路由器形成的回路并不会导致包的增生扩展。
桥接拓扑中,临时的划分要比临时的回路好得多(甚至可以说,桥接拓扑中发生的任何事都要比出现回路好得多)。在网桥的某端口由阻塞状态转到发送状态时,如果让它先等待一段时间再进行转换,则可以减少产生回路的可能性。等待时间应足够使新消息传播到网络,这样,在新加入的端口开始发送包之前,需要从新拓扑结构中退出的端口已经听到消息并从拓扑结构上断开。这段等待时间起码是传输到整个网络所需最大时间的两倍。假定B1是“旧”拓扑结构中的根。并假定B1发送了一条配置信息,该信息立刻被发送向这个网络(假定无拥塞)。再假设它的下一条配置信息最大被延迟了X秒,接着B1发生了故障,则离B1最近的网桥要比离B1最远的网桥提前X秒使所存储的B1的配置信息超时并计算新的拓扑结构。现在假定新的拓扑结构中的根是B2(离B1最远的网桥),再假设B2发送的配置信息经过最大时延(X秒)后才到达离B1最近的网桥,则靠近B2近的网桥要比靠近B1的网桥提前X秒得知新的拓扑。在最坏的情况下,新拓扑的消息要经过2倍X的时间才能传给所有网桥。因而,算法不应该允许一个网桥从阻塞状态立刻变为发送状态,而是先把这个端口临时设为第3种状态:它并不发送包,但可以像指定网桥一样发送Hello信息。经过一定时间后,如果网桥仍然认为这个端口应在发送状态,则端口被转为发送状态。这一段时延是为了避免增加多余的连接,直到所有需要在新拓扑中断开端口的网桥都已经知道了新的拓扑。802.1标准中实际要求两种中间状态。这种设计可以在拓扑结构还不稳定时尽可能减少不正确的站点位置信息的扩散。为了减少发送不必要的帧的数目,802.1标准委员会规定在一个网桥建立好它的学习缓冲区(learned cache)之前不允许开始发送。在中间状态的初始部分,网桥不学习站点的地址;在中间状态的后面部分,网桥开始学习那个端口的站点地址,但是还不能在那个端口发送包。也就是说,中间状态被分为两个部分:“侦听”和“学习”。
注意:在最初的生成树算法中,作者只设计了一个中间状态——预发送。802.1委员会询问作者在预发送状态时,网桥是否应获知站点的地址。作者认为这并不重要。委员会决定把预发送状态划分为前面所提的两种状态。但作者认为把中间状态划分为两种状态并不必要,网桥在预发送状态时是否应获知站点地址无关紧要。划分成两个子状态只会让算法显得更复杂。人们需要在以下三种策略中权衡选择:
1) 只有一个中间状态,在其中要获知站点地址;
2) 只有一个中间状态,在其中不获知站点地址;
3) 有两个中间状态,如规范中的那样,在前一阶段网桥不获知站点地址,而在后一阶段中获知。
站点缓冲区超时值
网桥通过“学习”了解站点信息,并把它保持在缓冲区。由于站点可以被移动,因而网桥应该能够“遗忘”某些站点,除非这个站点的信息能够不断被证明为是正确的。这是通过使最近未被确认的条目超时而实现的。选择一个恰当的超时时间比较困难。如果因为某种原因而使某个条目不正确,则包就不会被发送给这个在缓冲区中地址不正确的站点。如果某个条目已经被删除,则发向被删除站点的包会不必要地漏向这个网络的其他部分。如果超时时间过长,则会有太长时间的无意义包的发送。如果超时时间过短,则网络的性能会减低,因为要做不必要的包转发。如果站点位置的改变仅是因为站点被移动,则计时器应以分钟为数量级,有三个原因:
1) 拔下某个站点的插头,再移动这个站点(物理上移动),然后再插上插头,很可能花掉15分钟。
2) 如果移动一个站点的时间少于1 5分钟,但到这个站点开始工作也可能还要再花掉几分钟。
3 ) 被移动的站点可以通过某种策略,以尽快开始工作。例如,它们可以向广播地址发送包。向广播地址发送的包可以被转发到整个生成树上(除非这个广播地址已经被明确申明为不作转发)。当所有的网桥看到从源S发来的包后,它们将修正到S的条目。由于S所发送的广播包可能丢失,没有到达扩展LAN的所有部分,因此S可以在开始加入网络时发送一些广播包,或者认为在它移动的时候,大部分时间内一切都会立刻开始工作,偶尔需要花掉几分钟。如果需要至少15分钟来移动一个站点,则不必使用特殊的机制。
然而,重新生成一棵生成树会改变多个站点的位置。让很多站点在拓扑结构改变了15分钟之后都不能被访问是不大现实的。前面所述的观点都不适用于拓扑结构的变化,原因如下:
1) 生成树用远少于1 5分钟的时间适应新的拓扑结构(如果不是这样,网桥就不是网络互连设备,而是船锚了)。
2) 站点用户可能会对工作的频繁终止感到不解,因为生成树的重新计算对用户方没有任何动作。
3) 因为站点不能注意到生成树重新计算,因此不能通过某个特殊机制(如发送一个广播包)来修正站点的条目。
因此,等待15分钟来“遗忘”一个站点太长了。那如果只花15秒呢?我觉得等15分钟还是等15秒,对网络性能的影响并没有太大的不同。因为,如果一个站点在15秒内并没发送任何包,则它接收包的可能性也很小。15秒间隔之后,如果给那个站点发送的前几个包被不必要地发送到网络的其他部分,这可能不会给网络的性能带来太大的影响。研究短的超时时间设置(“遗忘”时间)对网络性能的影响是很有趣的一件事情。如果可以找到网络性能大幅度下降前的最小超时时间值,并且那个值是数秒钟,则网桥就可以使用那个超时值。可惜的是,我们并不能绝对地确定这个超时时间,因为它和网络的应用类型和拓扑结构有关。可能对某个特定的网络应用和特定的拓扑结构来说, 3秒是最合适的,但对其他的网络应用来说,这个时间设置可能就不合适了。
由于不能绝对地确定某个合适的缓冲区超时时间值,因而这个值应是可配置的。另外,假定缓冲区超时时间值要大于生成树重新计算所需的时间,我们认为需要有两个缓冲区超时值:
网桥能够检测到生成树被重新计算了吗?无论如何,最起码有一个网桥可以检测到。然而,大部分的情况下,一些网桥是注意不到的。当一个网桥不能检测到生成树被重新计算时,在它的缓冲区内存储的大量的站点条目都可能变得不正确。
因此,生成树算法需要增加某种机制,把生成树重新计算的信息可靠地告知所有的网桥。但改进的生成树算法应该保留原算法的“精神”,即所需带宽不因网络规模的增大而增大。例如,如果让每个注意到拓扑结构变化的网桥发送一个广播包,会使开销随网桥总数的增加而增加。改进算法的基本思想是当网桥B发现拓扑结构变化后, B将通知根网桥。但B并不是直接通知根网桥的,而是通知它的根端口上的网桥。然后这个网桥又将通知它的父网桥,如此继续,直到最后根网桥收到这个拓扑结构发生变化的通知。当根网桥收到这个变化的通知时,它在配置信息中设置拓扑结构变化的标志位(the topology change flag),表明拓扑配置已经发生了变化。指定网桥从根端口收到这样的配置信息以后,也在自己作为指定网桥的L A N上发送的配置信息中设置拓扑结构改变位。具体步骤如下:
1) 某网桥注意到生成树算法要求它把某端口转入或转出阻塞状态。
2) 网桥在每个h e l l o时间片内,周期性地往根端口发送拓扑结构改变的消息,直到它的父网桥反馈给它一个带有拓扑结构改变标志的配置信息。拓扑结构变化消息的数据链路目的地址与配置信息的广播地址相同。
3) 某端口上的指定网桥收到拓扑结构变化信息时,做两件事:
a. 执行第2步(通知它的父网桥关于拓扑结构变化的消息)。
b. 在它收到拓扑改变通知的L A N上,网桥在下一条配置信息中设置拓扑改变确认标志。
4) 根网桥每隔一定周期(周期时间=发送时延参数+最大生存期数)发送一个带拓扑结构变化位的配置信息,如果网桥出现以下两种情况之一:
a. 由于它的一个端口改变了状态,它注意到了拓扑的改变。
b. 收到某个拓扑结构改变的消息。
5) 收到带拓扑结构改变位的配置信息的网桥(或者在配置信息中设置拓扑结构改变位的根网桥)使用短的站点缓冲区超时设置,直到它们接收到不带拓扑结构改变位的配置信息为止。
注意:长的缓冲区超时值是一个网络管理参数,短的缓冲区超时值等于发送时延,也是网络管理参数。
网络范围的参数
为了让生成树算法正确运行,所有的网桥必须遵从某些参数。这些参数都是可配置的。这种方法看起来行不通。如果不同网桥上的参数不一致,会怎么样呢?或者说开始的时候,这些网络范围的参数是一致的,然后某个网桥希望把其中一个参数的值改为其他值时又会怎么样呢?如果某些网桥上的参数不一致时,网络会不会终止正常操作?网络的故障是否会使试图修复错误的网络管理命令都不能成功?幸运的是,我们有极好的解决方法。根网桥在它的配置信息中存储了所有网桥都必须遵从的网络参数的值。如果网络管理命令某个网桥去改变某个参数的值,该网桥把配置信息存储在非易失性的存储器中。如果这个网桥成了根网桥,则它将使用自己的值,并把它们放入配置信息中。而端口上的指定网桥复制它从根端口中接收的配置信息中的参数值,放入它所发送的配置信息中。这样,所有的网桥(通过从根端口接收配置信息)都使用当前根网桥的值作为参数。根按这种方式所规定的参数如下:
1) 最大生存期(max age):过了这段时间,配置信息就被抛弃。
2) Hello周期(hello time):发送配置信息的时间间隔。
3) 发送时延(forward delay):在“学习”和侦听状态的时间,这段时间的一半等于确定某个端口位于生成树上到允许该端口开始收发数据包之间的时间间隔。
端口ID
在配置信息中还包括端口ID(port ID)字段,主要有两个目的:
1) (一个不太好的目的)它使得计算生成树时,在同样的拓扑结构下,网桥会选择同样的根端口。例如,见下图,B2有两个端口,这两个端口有同样的指定网桥,所报告的根以及到根的费用也相同。

假定B1是根,那么B2应该选端口2还是端口3作为它的根端口呢?每个网桥都有关于它的每个端口号的内部表示。指定网桥把它的端口号的内部值放入配置信息中。在B2的端口3上,B2将接收到一个配置信息,说明B1是根,到B1的费用为0,指定网桥为B1,端口号为1。在B 2的端口2上,B2会接收到一个类似的配置信息,但是其中的端口号为2。由于“1”小于“2”,因而B2将选择端口3作为它的根端口。
2) (一个更好的目的)它使通过非网桥而形成的回路获得恰当的处理。假定某网桥有多个端口,连接到(在该网桥看起来像)一个单一的LAN上。这有几种可能:
a. 把网桥的两个端口连接到同一个LAN上。
b. 把网桥的两个端口连接到两个通过中继器连在一起的LAN段上。
c. 把网桥的两个端口连接到不同的LAN上,但是这些LAN之间通过不含生成树算法的简单网桥连接。
在下图中,B是根网桥(因为只有一个网桥)。它将向每个端口发送一个配置信息(B,0,B, 端口号)。这样,B会在端口2上收到它从端口1发送的配置信息;在端口1上,则会收到它从端口2上发送的配置信息。由于2>1,B在端口2上收到的配置信息(B,0,B,1)比它在端口1上收到的配置信息(B,0,B,2)更优。因而B将认为端口2上的指定网桥更优。

分配端口号
最近有人跟我抱怨说由于生成树算法的影响,使得网桥不能有多于256个端口。我一开始时不明白为什么生成树算法会有这个限制,直到查阅了802委员会的标准才明白。他们把2字节的端口ID划分为两个部分:高位代表“优先级”,低位唯一地表示这个端口,因而端口号只能有256个。在一开始的生成树算法中,我并没有考虑端口优先级。如果真的需要优先级,建议可以把端口在某个优先级内编号,而不需要特地划分出端口号字段的一部分来显式说明其优先级。例如,首先从最低优先级的端口开始编号,分配端口号1、2和3,直到所有的最低优先级的端口都得到了编号。然后再从次优先级的端口开始编号。假定已经有14个端口被编过号了,则次优先级的端口应该从15开始编号。依此类推,直到所有的端口都被编号为止。这样,就可以有2个字节长的数字来给端口编号,可以容纳64 K个端口,而且同样可以给端口划分等级。对网桥来说,端口号只有本地的意义,它仅仅要求端口号唯一。除非有某种一致性测试要求优先级为12的端口,它的端口号的最高字节正好代表1 2,否则,建议厂商忽略规范中的这一部分,尤其是他们的网桥有超过256个端口时。最近我也跟802委员会提出了这个建议,他们可能会减少优先级的位数,但仍然会让端口ID表明所配置的优先级。
性能问题
生成树算法有两个特性使得性能问题很重要:
1) 一直收不到消息可能使网桥增加连接度。比如,某网桥一直不能从某端口收到任何配置信息,它就会把自己设为该端口的指定网桥。
2) 多余的连接(循环)是潜在的危险。
保证生成树算法在网络发生拥塞时还能正常运行是很重要的。否则,当网络发生临时拥塞时,可能导致生成树算法不正确地把额外的端口转为打开状态而产生循环,并极大地增加拥塞量,以至于算法无法恢复。网桥需要有高性能的CPU。如果网桥的CPU成为了一个瓶颈,网桥会在查看包之前就丢弃包。由于网桥不查看包就无法区分数据包和配置信息,因而网桥不能避免将配置信息也丢弃了。另外一个要求是,无论网络有多么拥挤,网桥也要能够发送配置信息。所有的网络,为了公平起见,都会留给每个站点一个最小的带宽。因此,不管网络有多拥挤,网桥都还能再发送配置信息。由于配置信息的传送具有时效性,因此要求网桥能够通过一定的方法使得配置信息能排在发送队列的前面。802委员会并没有对网桥性能做出要求,网桥可以在功能上做一点削弱,但仍然符合标准。带有低功能网桥的扩展LAN可能得到糟糕的性能,在发生拥塞的时候显得很不稳定。我们并不要求网桥为了使算法正确工作,每收到一条配置信息就要立即对它进行处理。在最坏的情况下,网桥的处理能力只够接收LAN上的每个消息,并判断出是数据包还是配置信息,而不够来运行生成树算法,直到LAN上有一些空闲时间。只要网桥保存了从它有足够的CPU能力来处理配置信息以来的最优的一条配置信息,这些都是可以的。保存最优的配置信息只需通过比较一个由根ID、到根的费用和发送器ID组成的多精度数:根ID .到根的费用.发送器ID。注意:我认为网桥的规范纵容了低性能的网桥。实际运行过程中,低性能的网桥会带来很多麻烦。比如说临时性的拥塞导致配置信息的丢失,从而产生回路,然后回路和数据包增生所导致的拥塞使得情况更严重。如果链路在不知道发送器的情况下也会丢失信息,在这种情况下,拥塞就有可能引起回路。比如说,某条链路上的指定网桥在发送配置信息,但由于链路本身拥塞,无法把这些配置信息传送给其他网桥。802系列的LAN不会发生上述情况,但有些网络会出现这种问题,对于这样的网络来说,使用网桥并不合适。
单向连通
硬件的损坏可能使得一个LAN上的两个网桥之间变为单向连通:桥A可以收到从桥B发送过来的信息,但桥B不能收到从桥A发送过来的信息。这可能是因为桥B的接收器出了问题,或者桥A的发送器出了问题,还可能是其他的一些组件(比如中继器)的收发不大正常。
单向连通可能引发回路。例如,假定B1“听”不到B2(见下图)。如果这是因为B1的接收器出了问题,则B1也不能从LAN上接收到数据包。但是B1还会向LAN上发送包,从而产生了一个回路。

如果是因为B2的接收器出了问题,则B2将不会从LAN上接收到发送给它的包,但它仍然会向LAN上发送包,从而产生回路。网桥的标准中并未涉及如何处理这个问题。一种解决办法是,只要某网桥检测到LAN上的单向连通,就停止对LAN的收发,直到这个问题解决。可以采用下面的办法来检测单向连通:有某网桥持续地发送配置信息,即便你的配置信息优于它。这说明该网桥并没有接收到你发送给它的配置信息。因此要么是你的发送器出了问题,要么是它的接收器出了问题。
可设参数
下列参数可被设置:
1) 桥优先级:一个2字节的值,可以影响根网桥以及指定网桥的选择。它是桥ID中的最高位。数字越小,说明该网桥越有可能成为根网桥。
2) 端口优先级:一个1字节的值,当网桥有两个端口都连接在LAN上从而形成回路时,可以通过它来影响端口的选择。我觉得端口优先级不应该出现在配置信息中,而只用来影响端口号的分配。如果这样,优先级可以是2字节,足够用来给每个端口分配一个唯一的值。
3) Hello周期:认为自己是根网桥的网桥在产生前后两个配置信息之间的时间间隔,推荐时间为2秒。万一配置信息的丢失率较高,可以缩短这个时间来得到较强的健壮性。延长这个时间可以降低生成树算法的费用(因为配置信息的传递间隔变长)。
4) 最大生存期:判断是否抛弃一个“过时”配置信息的时间值。如果这个时间值过小,则生成树的计算会过于频繁,可能导致网络临时性的连接中断。如果这个时间值过大,当拓扑结构变化(如网桥或链路的重起或者发生故障)以后,网络会花掉过长的时间去适应新的生成树。保守的估计是设每一跳时延为2秒,在802.1d中推荐的值是20秒。
5) 发送时延:设定这个参数是为了阻止网桥在拓扑结构更新的消息传变整个网络前就开始收发数据包。该参数需足够长以便让该关闭的链路都关闭后新的链路才加入进来。因为它被调用了2次,因此发送时延应该为新拓扑结构消息传遍整个网络所需时间的一半。当网桥决定把某个端口从阻塞状态转入发送状态时,这个端口先被设为侦听状态。在侦听状态,网桥依然在运行生成树算法,继续向该端口发送配置信息,但并不通过这个端口收发数据包。保持在侦听状态的时间等于发送时延时间,之后这个端口被设为学习状态,此时可以接收数据包,从而了解该端口上的站点位置(但依然不能向它发送数据包)。再经过发送时延的时间后,如果网桥没有得到信息要求它转回到阻塞状态,则把端口转成发送状态。如果把发送时延值设得过小,可能在生成树算法收敛时造成临时的回路,因此在设这个值时需要采取保守的态度。而另一方面,如果把这个值设得过大,会导致生成树重新计算时有更长的划分,从而刺激某些人冒险把这个值设得更小些。802.1d中推荐的值为15秒。也就是说,网桥应延迟对在原先的拓扑结构中为阻塞状态的端口进行收发,并在网桥发现端口应包括在新的生成树中后30秒,才能在新的拓扑结构中处于发送状态。注意,发送时延的时间值也等同于短的缓冲区超时值,在拓扑变化后使用。
6) 长缓冲区超时(long cache timer):可配置的数值。802.1中推荐的值为5分钟。
7) 路径费用:路径费用加上从某端口接收到的配置信息中所包含的费用后,就是通过该端口到根的费用。每个端口的路径费用是独立的。某个端口上的这个值越大,则连接到这个端口的LAN就越靠近生成树中的叶子的位置(也即生成树的末梢)。而越靠近叶子的位置的端口,通过它的传输量就越少。如果某个LAN的带宽比较小或者希望减少在这个LAN的传输,则可以把它设成有较大的路径费。注意:如果把路径费用称为“链路费用”或者“端口费用”可能会好些,以免读者把它当成整条路径的费用。
5.网桥报文格式
生成树算法只有两种报文:配置信息和拓扑变化通告信息。
配置信息格式,下图显示了配置信息的格式。协议标识符:常数0。版本:常数0。信息类型:常数0。标志位字段:

TC:最低位,是拓扑结构改变位。如果在根端口中接收到一个设了TC位的配置信息,说明接收的网桥需要使用一个发送时延值(一个短的缓冲区超时值)来使站点的缓冲区条目超时,而不是使用aging timer(站点缓冲区条目的一般更长的超时值)。
TCA:最高位,拓扑结构改变通告位。如果网桥从根端口中收到设了TCA位的配置信息,说明网桥没必要再通知它的父网桥关于拓扑结构改变的消息。父网桥将负责通知根网桥拓扑结构已改变。
标志位字段中的其他位尚未定义使用。
根ID:每个网桥配有2字节的优先级和6字节的ID,优先级是数值上的高位部分。8字节的根ID由一个优先级加上后面的6字节的网桥的ID组成。
到根的费用:4字节,无符号二进制数,表示从该网桥发送一个配置信息到根网桥的费用。
桥ID:2字节的指定优先级加上6字节的ID(发送该配置信息的网桥的ID)。
端口ID:最前面的也是最高的位是可设置的1字节的优先级。接下来的1字节是网桥指定的
端口号,端口号要求在该网桥范围内是唯一的。802.1委员会最好能把优先级用少于8位来表示,以使网桥可以有多于256个端口,或者是不要在端口ID中显式地表示优先级。
报文生存期:以1/256秒为单位的一个估计时间,是这个配置信息所基于的配置信息从根上被发送而开始计时的。
最大生存期:以1/256秒为单位的一个时间,到那个时刻,此配置信息应删除。
Hello周期:以1/256秒为单位的一个时间,是根网桥发送配置信息的时间间隔。
发送时延:以1/256秒为单位,是网桥将一个端口从阻塞状态转到发送状态时,需要在每个中间状态停留的时间长度。
拓扑变化通告信息的格式
下图显示了拓扑变化通告信息的格式。

协议标识符:常数0。版本:常数0。信息类型:常数1 2 8(十进制)。
6. 其他的网桥问题
本章的后面部分包括了标准透明网桥所引起的一些高级课题,如站点的行为对网桥操作的影响、站点上的桥接环境,桥过滤的构造等等。
多连接的站点
若在网桥的站点缓冲区中有一个错误的条目,其后果是包可能无法送到该站点。当一个站点与某个扩展LAN之间有多个连接时,网桥的站点缓冲区就容易出错。如果该站点的每一个连接点使用不同的数据链路地址,这样的错误就不会发生。但在某些实现中,站点在多条链路上采用同一个地址。假定有下图所示的拓扑结构,站点S同时连接到两个LAN上:LAN1和LAN7。

假设S几乎在同时发出两个数据包(P1, P2)。P1发送到LAN1上,P2发送到LAN7上。P1向右传送,使每个网桥都认为S在它们的左边。同时P2 向左传送,使每个网桥都认为S在它们的右边。假定上述的P1和P2在LAN4“相交”,如下图所示(B4将P2放入要传送到LAN4的队列中,而B3把P1放入传送到LAN4的队列中)。当B3成功地将P1传送给LAN4时,B4就将把S的位置从在它的右边改为在它的左边。B4会继续把P1传送下去,使B5、B6认为S在它们的左边。由于B4也成功传送P2,B3会认为S在它的右边。而B3也继续把这个包传送下去。

这样,便形成了下图的样子。

现在,假定Z是LAN4上的站点,正在向S传送一个包。由于B3认为S在它的右边,B4认为S在它的左边,所以B3和B4都不转发这个包。表面上看来, S与扩展的LAN有多个连接是为了获得更好的可用性,但多个连接点可能使那些网桥搞不清S的正确位置,从而拒绝传送到S的包。
配置过滤器
网桥丢弃了一个包而不是转发它,这种操作称为过滤了一个包。标准透明网桥自动获取站点的地址并实行过滤,因为它并不总把每个包转发到整个生成树上。在所有网桥都获悉了某个站点的位置后,以该站点为目的地的传送都会经过生成树上的从源到该站点的最短路径,而不会“泄露”到生成树的其他部分。过滤的另一大功能是:把某些传输限制在网络拓扑结构的某些部分。一个典型的例子就是时间同步协议不允许出现多次转发所造成的时延,所以要把传输限制在一个LAN内。或者当生成树的不同部分分别管理着终端服务器和主机时,就需要保证终端服务器的协议信息在不同的网络部分间传输时不被泄露。802.1标准规定,网络管理应该能够在网桥的过滤数据库中永久性地设立一些地址,同时指明哪些端口是可以通过的。上述标准所采取的机制是:过滤数据库中的地址带有一个输入端口号以及一个输出端口的标志。当一个包从指定的输入端口输入时,将被转发到指定的输出端口上去。通常人工写入过滤数据库的地址是一些多点广播地址,但也可以指定站点地址。首先,让我们看看一个简单的例子。假设你想用某种协议在端口2、4和5间进行传输,但不想把信息包送到端口1、3、6和7上去(见下图)。

假定协议使用FOO作为组播地址。那么,所用的管理命令大致是这样的(具体的用户界面也许不标准):
1) 创建过滤地址F O O:输入端口2;输出1 -不可,2 -不可,3 -不可,4 -可以,5 -可以,6 -不可,7 -不可。
2) 创建过滤地址F O O:输入端口4;输出1 -不可,2 -可以,3 -不可,4 -不可,5 -可以,6 -不可,7 -不可。
3) 创建过滤地址F O O:输入端口5;输出1 -不可,2 -可以,3 -不可,4 -可以,5 -不可,6 -不可,7 -不可。
现在假设FOO有两个域,两个域间不可相互通信。举例来说,除了在端口2、4和5之间传输之外,FOO还应在端口1和7间传输(见图3 - 3 9)。

除了上述的命令以外,还应该有以下的命令:
1) 创建过滤地址F O O:输入端口1;输出1—不可以, 2—不可以, 3—不可以, 4—不可以,5—不可以,6—不可以,7—可以。
2) 创建过滤地址F O O:输入端口7;输出1—可以,2—不可以, 3—不可以, 4—不可以,5—不可以,6—不可以,7—不可以。
许多产品还提供各厂商特有的过滤方式,比如
• 按照S A P值而不是按照某个地址来过滤。
• 按照源地址来过滤。
注意,设置过滤器可能导致一些预期不到的小问题,因为在生成树定义了逻辑拓扑后,你所想像的物理拓扑的边界也许已不再适用(见下图)。

网桥的不完全透明
在介绍了透明网桥的基本思想之后,我们来谈谈为什么它实际上只能称为“半透明的”。添加网桥会改变站点的环境,产生以下的性能变化:
1) 包丢失率增加。即使是每个网桥都有足够的C P U来读每一个包,并把它放入某一个端口队列,由于链路的拥塞,也会造成包的丢弃。网桥的缓冲不可能无限大,所以队列也不可能任意长。即使可以无限长,随着队列的无限增长,时延也会无限增长。
2) 时延增加。在网桥每一次转发时,必须等待获得一个信道。另外,路径上的一个拥塞的链路会让包在队列中排在后面。
3) 包生存期增加。与时延的增加一样,网桥的引入使包的生存期也增加了。这牵连到一些上层的协议。在一个LAN上不会绕回的计数器,在经过多次网桥转发的包的生存期中,可能就会绕回。
4) 错误率增加。有两种情况会发生数据出错。一是当数据在传送的时候,在数据链路层协议中的循环冗余码(CRC)检测出传输错误。二是当数据在系统内部的总线上传输时或在内存中时,也可能出现错误。如果网桥在收到包及检验了它的正确性后,剥离CRC,并在转发前为它装配上另一个CRC,那么在网桥的系统内部发生的错误就不能被发觉了。所以网桥应保存随包收到的CRC,并在发送时使用这个CRC,则可以发现网桥系统内部发生的错误。
然而,网桥并不是总能保留原有的CRC。比如在802LAN中,没有两个LAN有相同的包格式,802.5甚至有不同的位序(bit order)。这样,网桥只有在两个相同类型的LAN间转发时,才能保留CRC。标准不要求网桥在任何可能情况下都保留CRC,所以,即使是由相同的LAN构成的扩展局域网中,一些网桥在实现时也不保留CRC。在扩展局域网中的异质LAN上,网桥无法保留CRC。这样,数据错误的未检测率随着引入网桥数量的增加而增加。
5) 可能出现包乱序(虽然不常发生)。尽管网桥做了很大的努力使包乱序的可能性最小化,但当生成树重新构造的时候,包乱序的情况还是会发生。
6) 包的重复率增加。为了降低包的重复率,网桥也做了很多工作,但还是可能发生。举例来说,如果用一个转发器连接了原本在生成树中是分离的两个LAN,就会出现一个暂时的环路,在此环路上的信息包就会被复制,还可能是很多次。
除了上述定量的性能变化,网桥还可能带来定性的功能上的不同结果。
1) 站点不能使用本LAN的最大的包尺寸。因为由网桥所连接的不同的LAN,所规定的包尺寸也不一样,如果包尺寸大于另一个LAN所规定的包尺寸,那么当包被转发到另一个LAN时是一定会丢失的。站点的配置中的包尺寸可以比较小一些,可以配置成整个扩展局域网中的最小的LAN的包尺寸。然而,由于源与宿往往在同一个LAN上,所以这样的方法不能令人满意,强制使用一个较小的包尺寸会降低吞吐量。另一个方法是让运输层来找出一个较大的包尺寸,但这并不能保证在运输连接的生存期内都有效,因为重新构造生成树时可能会重新安排路径。所以,在这种设计中,当信息包由802.3传送到FDDI时,网桥定义FDDI的优先级字段的值为0。
如何利用这种信息来解决采用多大的包的问题?一个较简便的方法(无须使用FDDI的优先级字段)是运输层发送一个较大的包,看是否可以成功。如果不成功就发送一个稍小一些的,直到成功为止。源路由解决了这一问题是很有趣的,因为即使是网络层也没有很好地解决这一问题。网络层协议中规定,目的站点可以分割和拼接包,但这严重降低了性能。透明网桥不能分割包,甚至不能提交错误报告来指出包太大了应该被丢弃,因为数据链路层没有协议来支持这种报告。
2) 在数据链路层的特定局域网的信息会丢失。有些LAN有一些特有的信息字段,比如优先级字段。如果包从有优先级字段的LAN发送到无优先级字段的LAN,然后又传到另一个有优先级字段的LAN,那么就没有办法重新构造原先的优先级信息,因为中间的LAN并不能携带这种信息。
3) 会发生未预期的包格式的转换。有一个约定(RFC 1042),把802的一种格式和以太网格式等同。实现方式是,把SNAP SAP同时作为DSAP和SSAP,用3个字节的0来表示OUI,加上后面两个字节的以太网协议类型,构成5个字节的协议类型字段(见下图“从以太网到8023的格式转换”)。

当包被转换成802格式之后,就可以很容易地被转发到其他LAN上而只需最少的格式转换(如,增加一个优先级字段,删除长度字段等)。如果包最终被传送到以太网上且协议类型的前三个字节为0,那么最终的网桥就不会知道包最初的格式是以太网的还是802的。为了与那些只认识以太网格式的老式站点相兼容,网桥用上面提过的方法把包转换成以太网格式。这样,较新的站点如果在802.3上使用SNAP SAP、且5字节的协议类型中OUI=0,则必须能接受以太网包,并像802.3包那样对待。这条规则在RFC 11 2 2中作了描述。但是, RFC只被应用在I P的实现。当另一些协议使用SNAP SAP并且OUI=0时,就会分不清楚接收的包格式与发送的包格式是否相同。
特别地,网桥的供应商知道有一个称为Apple Talk的协议,该协议用收到的包格式是以太网还是802.3来确定其协议本身的版本。所以Apple Talk协议的正确工作要求若发送方发送一个以太网报头的包,则最终接收者也应该收到一个以太网包。同样,如果发送者发送一个802.3格式的包,则最后收到的也必须是一个802.3格式的包。网桥的供应商们提出这样一个方法来解决这个问题,就是检查包的协议类型是否为代表Apple Talk协议的值(设为X)。如果包是以太网格式,而协议类型= X,那么就不再使用在一般转换中使用的802格式的5字节协议类型字段(3字节的0加上X),而是使用一个别的值(00-00-f8)。当这样一个包被转发到802.3 LAN 上时,网桥检查协议类型,如果满足下面两个条件中的一个,就将它转换成以太网格式:
1) DSAP=SNAP SAP,协议的前三个字节为00-00-00,后两个字节不是X。
2) DSAP=SNAP SAP,协议的前三个字节为00-00-f8。
网桥对站点的行为有一些假定,若假定与站点的实际行为有冲突,则可能导致程度不一的后果。
1) 网桥假定某个数据链路源地址在扩展局域网上只出现在一处。但有多个链接的站点可能对它的所有端口使用同一个数据链路层地址,这使网桥的高速缓存出现混乱,结果,包可能无法被传送到一个有多个链接的站点上。
2) 网桥假定一个收到了很多信息包的站点也会传送包。如果一个目的站点是从没有传送过包的,那么送到该站点的包不能在扩展的局域网中被局部化,而只能遍历生成树上的所有LAN。
远程网桥
当人们希望连接两个地理上相隔很远的LAN时,我们不能只是简单地给两个LAN之间加个东西使它们连起来,而应该给每一个LAN选用一个网桥,并且通过点到点的连接把这些网桥连起来(见下图)。这些通过点到点连接的网桥被称作远程网桥,有时它们也被称为半网桥,因为两个网桥加上点到点连接构成的整体可以被看作是一个单一的网桥。

生成树算法在点到点的连接中工作得很好,在点到点链路两端的网桥都简单地把链路看作是一个LAN。一个需要考虑的问题是,生成树算法保证了包可以到达每一个LAN。点到点链路上的两个网桥中的一个是指定网桥,该网桥明确地认为这个点到点链路是在生成树中的,并且将把数据包转发给这个链路。而对另外一个网桥而言,这个点到点链接要么被看作是该网桥的根端口,要么不是。如果看作根端口,这个网桥同样会从这个链路中接收或向其发送数据包,从而这个点到点链路在生成树中将是有用的。如果不把链路看作根端口,那么这个网桥不会把数据包转发给这个链路,并且所有传送到这个链路的包都将被它丢弃。
在一些点到点的链接中,按照通信量计费。在这样的情况下,第二个网桥在将要丢弃数据包的时候给第一个网桥发出警告将是有意义的。标准里并没有指出这该如何做,但是它假定远程网桥应该成对地从同一个供应商那里购买。远程网桥的另外一个问题是:包在点到点链路上传送时,该怎样来表示这个包。通常,点到点链接有一些必须加到包上的报头信息。网桥收到了一个包(包括LAN的报头),它会把这个包作为在点到点连接上传输的包的数据部分(见下图)。这样,CRC将可以被保留。

如果点到点链接不是通过一个直线连接而是通过广域网(WAN cloud),同样可以使用这种技术(见图“网桥通过WAN互连”)。RFC 1483讨论了ATM上的实现方法,而RFC 1490则讨论了帧中继的情形。因为大多数的WAN不提供多点广播的能力,连接到一个WAN的网桥必须预先设置所有其他网桥的网络层地址,每一个网桥都和其他所有的网桥进行通信(见下图)

远程网桥还有另外一个问题:在传送包的时候,需要携带包的类型信息(见下图)。如果B1只是把从某个LAN上收到的包原封不动地打包发送给B2,则B2不能确定这个包是产生于802.3,因而可以一字不差地发送给附属于它的802.3 LAN;还是产生于其他类型的LAN,因而报头必须被修改。这个问题有几种解决办法:

1) B1 和B2用一个专有的机制来传送产生这个包的LAN的类型(见下图)

2) B1和B2可以共同支持一个特殊的包的规范格式,从而可以在点到点链接上传输以前把包转换成这个规范格式。如果规范格式和多个LAN类型中的一个不同,那么所有通过点到点链接传输的包就都必须在传输开始以前和结束以后重新格式化。包的重新格式化存在这样一个问题,即没有办法端到端地保留CRC。
3) B1和B2可以共同支持一个特殊的LAN类型—比如802.3,因此可以在点到点链路上传输以前把非802.3的包转换成802.3的格式,这样802.3的包就可以不被更改地通过。但如果一个包是由802.5产生的并且需要被送到802.5,那么这个包将被毫无必要地重新格式化,同时CRC也丢失了。此外,如果采用的格式没有足够的字段,某个类型的LAN所特有的信息(比如说优先级)也会丢失。
0 Responses to “透明网桥”
Leave a Reply
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。






