📄 rfc3063.txt
字号:
么都不做。否则,采取做如下动作:为下
一跳产生一线程的撤销;如果节点变成一
新的出口节点时,为这个TCB预先按排
“回绕”事件。
如果Ni=0,转移到Null。 Null
否则,什么都不做。 No change
初始化 创建一跳数为未知值的带颜色线程并扩展之。 No change
至未知值
其它 静态地忽略事件。 No change
状态Transparent
事件 动作 新状态
Recv thread
Flags
CL LP NL
0 * * 如果Hmax+1<Hout, 扩展一透明色线程。 No change
1 0 * 如果节点是出口节点或者如果Hmax<Hout, No change
将接收链接的颜色改为透明色并引发线程
回绕。
否则,扩展线程----如果NL=1,则改变颜色, Colored
如果NL=0,则不改变颜色。
撤销 移去相应的输入链接。
如果Ni=0且节点不是一符合条件的叶节点, Null
将线程的撤销传播至下一跳。
否则,如果Hmax+1<Hout,创建一透明线 No change
并扩展它。
否则,什么都不做。 No change
下一跳 创建一带颜色线程并扩展它。 Colored
的获得
下一跳 如果节点被允许留在输出链接中并且下一
的丢失 跳是存在的,则什么都不做。否则,采取
下动作:引发线程的撤销。
如果Ni=0,则转移到Null。 Null
否则,什么都不做。 No change
其它 静态地忽略事件。 No change
9. 与路径矢量/扩散方法进行比较
尽管路径矢量的大小是随着LSP的长度增加的,但是线程的大小却是一个常数。因此线程算法使用的消息的大小不受网络或拓扑结构的影响。此外,线程合并能力也减少了消息的数目。这些都将提高伸缩性。
在线程算法中,为特殊的LSP改变它的下一跳的节点只与那些在新路径上此节点与LSP出口之间的节点相互作用。但在路径矢量算法中,节点必须引发一个扩散估计以包含那些不在此节点与LSP出口之间的节点。
这个特征使得线程算法更加健壮。如果使用一扩散估计,甚至不在路径上的节点的错误动作也会延迟路径的建立。在线程算法中,唯一能延迟路径建立的节点是那些真正在路径 上的节点。
线程算法很好地适用于下游按需等级分配和下游等级分配。然而路径矢量/扩散算法中,只适用下游等级分配。
线程算法可以随意重试以获得快速地路径重配置。扩散算法则会延迟路径重配置时间,因为在路由变化点的一个节点必须与它的所有上游节点协商。
在线程算法中,如果在新路径上存在一个L3环,节点还能继续使用旧路径,这一点与路径矢量算法相同。
10 .安全考虑
本文档所使用的程序与任何MPLS程序使用中出现的程序在安全性上并不发生冲突。
附录A--算法的进一步讨论
此附录的目的是为了给出一个较不正式和指导性质的算法描述并指出这些算法提出的原因。为了精确描述算法,FSM应该被看作标准。
正如文档主体一样,我们讨论时就好象只存在一个LSP,否则我们总是要说“对于同一个LSP……”。只有算法用于预防环路而不是检测环路时,我们才会这样考虑。
A.1. 环路预防的强制方法
作为开始,我们考虑一个可称之为“强制预防环路”的 算示。在这个算法中,每一次路径建立的尝试都必须到达出口并返回建立路径。这个算法显然是自由环路,因为建立消息实际上送到出口又返回。
例如,考虑一个现有的指向出口节点E的LSP B-C-D-E 。现在A试图加入LSP。在这个算法中,A必须发送一消息给B,B再给C,C再给D,D再给E。然后消息被从E送回到A。最终从B到A的消息包含一个标签绑定,清楚了此路径是一个自由环路,A就可以加入LSP了。
运用我们的术语,我们就说A创建了一个线程并将它向下游扩展。线程到达出口并被回绕。
在前面的例子中,我们不需要假设A是一个入口节点。若对LSP有疑问,任何节点都可以获得或改变它的下一跳节点。
很明显,如果存在一个环路,则线程永不能到达出口,所以它不被回绕。怎么回事呢?路径建立消息一直在环路中。如果在消息中设置一个跳数,则当跳数达到最大值时,消息就会停止在环路中传送。也就是,当收到一具有最大值跳数的路径建立消息时,该路径建立消息不会被送往下游。
如何从一个环线程中恢复呢?对一个L3路由,为了打破环,环中的某一节点必须改变它的下一跳。此节点将把该线程从它的旧下一跳上撤销掉并扩展一线程给它的新下一跳。如果不存在环路,这个线程就可到达出口并被回绕。
A.2. 强制方法有哪些不妥?
看下面的例子:
A
|
B--D--E
|
C
如果A和C都试图加入已有的B-D-E 路径,然后B和D必须保留两个路径建立尝试,一个来自A,一个来自C。也就是D必须跟踪两个线程-A线程和C线程。一般说来,可能有更多的B的上游节点想加入已有的路径,而D也必须跟踪所有这些节点。
如果不使用VC合并,实际上情形并不是很差。若没有VC合并,不管怎样,D实际上为每一上游节点都维持一LSP。然而如果使用VC合并,每维持一LSP请求,就必须保存每个上游链接的状态。若预防环路技术也要求一个节点保存其上游链接所对应的状态信息量,而不是LSP中上游节点数,上述方法就比较好。
另一个问题是,如果存在一个环,路径建立消息就不停地循环。即使一个线程已两次通过某一节点,该节点也无法辨别当前接收的建立消息是否是它过去已接收的某一建立消息的一部分。
我们可以修改这个强制方案来消除这两个问题吗?可以。为了显示如何做,我们提出了两个概念:线程跳数和线程颜色。
A.3. 线程跳数
假设LSP树中每个链接被跳数标记,若想回到上游,你就可以从链接处穿过最远的上游节点到达。
例如,下面的树就采用了链接跳数标记:
1 2
A---B---C K
| |
|3 |1
| |
| 4 5 | 6 7
D---G---H---I---J
|
|2
1 |
E---F
称这些是“链接跳数”
链接AB,EF,KH都被标记为1,因为你可以只走1跳就到达上游。链接BC和FD被标记2,因为你可以走2跳从链接处到达上游。链接DG被标记为4,因为可能需走4跳才能从链接处到达上游;等等。
注意任何一节点处,与下游链接相关的跳数比与上游链接相关的最大的跳数值大1。
让我们来看一个保存这些跳数的方法。
为了保存链接跳数,我们需要在路径建立消息中携带跳数。例如,一个没有上游链接的节点将分配跳数值为1给它的下游链接,并将该值存储到它发往下游的路径建立消息中。一旦值存储到路径建立消息中,我们就可将称它有一“线程跳数”。
当一路径建立消息被收到时,线程跳数被当作消息被接收的上游链接的链接跳数存储起来。
当一路径建立消息被送往下游时,下游链接跳数(还有线程跳数)值被设置为最大的输入链接跳数加1。
假设节点N有一些输入链接和一个输出链接,且链接跳数都被相应地设置,而且节点N现在有一个新的输入链接。只有当当新的输入链接跳数比现有的所有输入链接跳数还大时,下游链接跳数必须改变。这种情况下,必须发送一带有新的更大跳数值的控制消息给下游。
另一方面,若N获得一个其链接跳数小于等于其它所有的现有输入链接跳数的新的输入链接,下游链跳数保持不变,也不必发消息给下游。
假设N丢失了有最大跳数的输入链接。这种情况下,下游链接跳数必须变小且必须发送一消息给下游以说明这种情况。
如果我们不仅关心环路的预防,而且还关心跳数的保存。那么我们将采用下面的规则(这些规则用于合并点处)
A.3.1 当一个新的输入线程被接收时,只有当在它的跳数是所有输入线程中最大时才会被向下游扩展。
A.3.2 否则,回绕线程。
A.3.3 当然一个出口节点总是回绕线程。
A.4. 线程颜色
节点在改变下一跳或获得下一跳时创建线程。我们假定每当节点创建一个线程时,节点分配一种颜色给线程。这种颜色在时间空间上都是唯一的:它的编码包含一个节点的IP地址,而此地址与该节点所保留的编号空间的唯一的事件确认相关联。节点发送给下游的路径建立消息将包含该颜色。另外,当一个节点发送包含颜色的消息给下游时,节点将记录此颜色并且将此颜色设为下游链接的颜色。
当一个带颜色信息的消息被接收时,它的颜色就成为输入链接的颜色。包含某一颜色的消息的线程将被称这具有那种颜色的线程。
当一 线程被回绕(一个路径建立),颜色被移去。链接变为透明色。我们有时候称已建立的LSP为一个“透明”线程。
注意在一个带颜色链接上包不能被转发,而只有在透明链接上才可被转发。
注意如果是线程环,某节点将留意通过特定输入链接上的带节点已留意过的颜色信息的消息。节点或者产生那种颜色的线程,或者节点已有那种颜色的一个不同的输入链接。这个事实可被用来预防控制消息的循环。不过,节点必须记住所有通过它的且未被回绕或撤销的线程的颜色。(也就是,它将不得不在此过程中为每条路径记住一种颜色。)
A.5. 颜色和跳数之间的关系
通过将颜色机制和跳数机制联合起来,我们无需任何节点为每一条LSP上的每一个链接记住多个颜色和跳数,就能够预防环路的发生。
在前面我们已经提到,为了保存跳数,一个节点只有在线程具有最大的输入链接跳数时,才会扩展它。现在我们加入如下规则:
A.5.1 当向下游扩展一输入线程时,线程的颜色也被传到下游(也就是,下游链接的颜色将和具有最大跳数的上游链接的颜色相同)
注意在一个给定的节点,下游链接或者是透明的,或者有且仅有一种颜色。
A.5.2 如果一个链接改变颜色,就没有必须再记住旧的颜色。
现在我们一定义“线程合并”的概念:
A.5.2 假设一个有颜色线程通过一个输入链接到达了一个节点,节点若已经有一个同样跳数或更大跳数的输入线程和一个输出的有颜色的线程。这种情况下,我们就可以说新的输入线程被“合并”到输出线程中。
注意当一个输入线程被合并到输出线程时,没有消息被发往下游。
A.6. 检测线程环
如果存在一个环,则总是存在某一节点具有同种颜色的两个输入线程,或者带颜色的线程将返回它的创建者。这部分,我们给出几个例子以直观地理解线程环是如何被检测的。
1 2
A---B---C K
| |
|3 |1
| |
| 4 5 | 6 7
D---G----H---I---J
|
|2
1 |
E---F
回到前面我们所讲的例子,如果H将它的下一跳从I换到E,我们看看会发生什么?H现在创建一个新的线程并分配一种颜色给它,譬如,红色。由于H有两个跳数分别为1和5的输入链接,它就分配6给它的新的下游链接并试图通过E建立一条路径。
E现在有一跳数为6的红色输入线程。由于E的下游链接跳数现在仅为1,它必须将红色线程跳数改为7,然后扩展至F。然后F再将跳数改为8,扩展红色线程至D。D再以跳数9扩展至G,G再以跳数10扩展线程至
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -