Design and Implementation of a Routing Control Platform
 
0.Abstract
1.Introduction
2.Interoperating
3.RCP Architecture
4.RCP Architecture and Implementation
5.Evaluation
6.Conclusion
7.REFERENCES
 
EGP:外部网关协议
(Exterior Gateway Protocol)是一种在自治系统的相邻两个网关主机间交换路由信息的协议。
EGP通常用于在因特网主机间交换路由表信息。
 
CIDR:Classless InterDomain Routing,无类别域间路由选择。将多个路由地址聚合成一个。可以跨越“类”的限制,如C类地址为/24,CIDR聚合之后可以为/22。
 
BGP(Border Gateway Protocol,边界网关协议)是用来连接internet上的独立系统的路由选择协议。BGP4支持CIDR寻址方案。BGP主要用于互联网AS(自治系统)之间的互联,BGP的最主要功能在于控制路由的传播和选择最好的路由。
 
为什么不同AS之间的路由选择不能使用内部网关协议,如RIP或OSPF?
1.因特网的规模太大,使得AS之间路由选择非常困难。
计算链路状态花费的时间太长;而且不同AS之间对于链路状态的度量标准不同,代价同是1000,在不同AS中意义是不同的。
2.AS之间的路由选择必须考虑有关策略。
不同AS性能相差可能会很大,所以依据跳数做路由选择不合适。而且还要考虑有关策略,有的AS愿意让别人过,有的AS不愿意让别人过,有的AS只愿意让交钱的人过,有的AS不愿意让自己的信息从某个AS中过。
 
BGP的目的是找一条能够到达并且比较好的路由,不是去寻找最佳路由。BGP采用路径向量(path vector)路由选择协议,它与距离向量协议和链路状态协议都有很大的区别。
 
(OSPF,EIGRP都是网络层的,协议号是89,88
RIP是传输层,使用UDP 520端口
BGP是应用层的,使用TCP 179端口)
 
每个AS至少有一个BGP发言人(BGP speaker),BGP发言人一般是边界路由器(也可以不是)。两个AS的BGP发言人使用TCP连接交换信息,彼此成为对方的邻站(neighbor)或对等站(peer)。
BGP发言人交换信息后,根据所采用的策略从收到的路由信息中找出到各自AS的较好路由(例:途经那些AS,从哪个AS走。是以AS为单位的。)
 
BGP是一种外部网关协议(EGP),与OSPF、RIP等内部网关协议(IGP)不同,其着眼点不在于发现和计算路由,而在于控制路由的传播和选择最佳路由。  
BGP使用TCP作为其传输层协议(监听端口号为179),提高了协议的可靠性。   
BGP进行域间的路由选择,对协议的稳定性要求非常高。因此用TCP协议的高可靠性来保证BGP协议的稳定性。   
BGP的对等体之间必须逻辑上连通,并进行TCP连接。目的端口号为179,本地端口号任意。   
路由更新时,BGP只发送更新的路由,大大减少了BGP传播路由所占用的带宽,适用于在Internet上传播大量的路由信息。   
BGP是一种距离矢量路由协议,从设计上避免了环路的发生。AS之间:BGP通过携带AS路径信息标记途经的AS,带有本地AS号的路由将被丢弃,从而避免了域间产生环路。AS内部:BGP在AS内学到的路由不会在AS中转发,避免了AS内产生环路。   
当BGP运行于同一自治系统内部时,被称为IBGP;当BGP运行于不同自治系统之间时,称为EBGP。 
 
BGP-4的四种报文
1.OPEN(打开)报文,与相邻的另一个BGP发言人建立关系,使通信初始化。
2.UPDATE(更新)报文,通告某一路由的信息,以及列出要撤销的多条路由。
3.KEEPLIVE(保活)报文,周期性地证实邻站的连通性。
4.NOTIFICATION(通知)报文,发送检测到的差错。
 
1.建立连接时先发送OPEN报文,对方若同意,就用KEEPLIVE报文响应。
2.一旦邻站关系建立,就要周期性地发送KEEPLIVE报文,一般30秒一次,KEEPLIVE报文长度只有19字节,只用BGP报文的通用首部,不会造成网络上太大的开销。
3.UPDATE报文是BGP协议的核心内容。撤销路由时可以一次撤销多条,但是增加新路由时,每个更新报文只能增加一条。
 
BGP可以很容易地解决距离向量算法中"坏消息传得慢"的问题。当某个路由器出问题时,BGP发言人可以从不止一个邻站获得路由信息,距离向量算法不能给出正确的选择的原因是,不能指出哪些邻站到目的站的路由是独立的。
 
BGP其他内容(如报文格式)详见谢希仁计算机网路第五版
 
 
 
Abstract
自制系统(AS:Autonomous System)中的路由器必须将它们获得的关于如何到达外界目的地的信息分布开来。现在的内部边界网关协议(iBGP)架构有严重的问题:一个“完全啮合"的iBGP配置不能扩展到大网络,而且,“路由器的反应”会带来一些问题,比如协议震荡和持续的环路。
 
而我们提议的路由控制平台(Routing Control Platform(RCP)),它收集外部目的地和内部拓扑的信息,并且为AS中的每一个路由器选择BGP路由。
 
RCP是逻辑中心化的平台,与IP转发层不同,IP转发层代表路由器做出路由选择并且使用未修改的iBGP协议对于选择的路由与路由器进行交流。RCP在不牺牲连通性的情况下提供了可扩展性。
 
这篇文章中,我们在商品硬件上呈现了RCP模型的设计与实现。通过对Tier-1(比较底层的一种网络)主干网的BGP和内部路由信息的追踪,我们证明了RCP足够快、足够可靠,以控制大网络上的BGP路由选择。我们展示了RCP对路由的分配是正确的,即使当功能是重复的和分布式的,而且我们可以期待,使用RCP的网络的收敛速度可以与现在的iBGP架构相比。
 
1.介绍
边界路由协议,这个因特网的域间(interdomain)路由协议,容易发生协议震荡和转发环路,对AS(自治系统)内的拓扑变化的敏感度高,操作人员难以对它理解和管理。我们通过引入一个路由控制平台(RCP),RCP基于计算路由信息和高级网络工程目标而计算一个AS里每个路由器的BGP路由。这篇文章描述了RCP模型的设计和实现,这个RCP模型足够快速、足够可靠,以协调大型主干网络的路由。
 
1.1一个AS内的路由分布
一个单独的AS里的路由器交换通往外界的目标路由,使用的协议叫internal BGP(iBGP)。小网络的每两个路由器之间都有一个iBGP会话(session),这是典型的“全啮合”iBGP拓扑。然而,“全啮合”iBGP协议不能扩展,因为每个路由器必须:
1.与其他任何一个路由器有一个iBGP会话
2.将BGP更新信息送到其他的每一个路由器
3.为每个邻居针对每个目标前缀发过来宣传(advertisements)保存一个本地副本。
4.有一个新的iBGP会话配置,每当一个新的路由器加入网络。
虽然每个路由器上的更快的处理器和更多的存储芯片可以支持更大的全啮合配置,但是已安装的路由器会落后于新的路由器 (the installed base of routers lags behind the technology curve),而且升级路由器很昂贵。此外,当它们达到资源限制的时候,支持BGP的路由器不会总是优雅地下调。举个例子,如报告中所讲,路由器在这种情况下会坏掉,或者使网络持续不稳定。本文中,我们呈现了,一种解决方案设计、实施、评估,这种解决方案的表现如同全啮合的iBGP配置一样,拥有少得多的开支并且没有改变已经安装的路由器。
 
为了避免全啮合的扩展问题,现在的大型网络中有代表性的iBGP配置如同分层的路由反映器。一个路由反映器为每一个目标前缀选择一个单独的BGP路由并且将这个路由通知给它的客户端。使用路由反映器降低了使用的存储空间以及连接到路由器的开销,代价是在潜在的网络行为上做出让步(即损失了网络的灵活性)。举个例子:反映器没有必要做出与全啮合状态相同的选择。不幸的是,穿越AS的路由从不同的路由反映器那里会被分配不同的BGP路由,导致矛盾。这些矛盾会导致协议震荡以及持续的转发环路。为了避免这些问题,操作者必须确保路由反映器以及它们的客户端对于内部拓扑拥有一致的视图,这需要将大量的路由器配置为路由反映器。这强迫大型主干网络要有很多的路由反映器为了降低矛盾的可能性。
 
1.2路由控制平台(RCP)
RCP提供了全啮合iBGP配置的固有的正确性以及路由反映器的可扩展性。RCP选择BGP路由,根据一个AS里的路由器的行为,这个AS使用完整的视图和可用的路由和IGP拓扑的。如图1,RCP与每个路由器都有iBGP会话;这些会话让RCP可以从每个路由器上获得BGP路由信息,并且给每个路由针对每个目标前缀分配一个路由选择。不像路由反映器,RCP会为每个路由器分配不同的BGP路由。这种灵活性使得RCP可以给每个路由器分配与全啮合配置相同的路由,并且使得每个路由的iBGP会话数与网络规模无关(只需与RCP建立IBGP会话)。我们想象,仅仅通过使用iBGP与自己的路由器交流。RCP可能会最终与邻域交换域间路由信息。使用RCP在域间交换可达性信息可以推动网络路由架构的发展。
 
想要成为一个如今iBGP解决方案的可行的选择,RCP必须满足两个主要涉及目标:
1.为了可靠性,即使当功能是重复的以及分布的,RCP必须使路由器分配的信息一致化。
2.即使在为大量的目标前缀和路由器计算路由的时候,也要能够对网络事件快速做出反应(网络事件如链路故障、外部BGP路由改变)。
这篇文章阐证明了RCP可以被做成足够快、足够可靠,以支持如今的iBGP架构,不需要对已有的路由器做出任何改变。
在第二部分对BGP路由做出一个简短的综述之后。
第三部分呈现了RCP架构,并且描述了如何去计算一致的转发路径,在不需要在副本之间做任何精确地协调的情况下。
第四部分,我们描述了一个是实现在商品硬件上的模型,它可以计算并且传播有上百个路由器的路由选择。
第五部分通过对大型骨干网络上的BGP和OSPF信息的重演证明了我们的模型的有效性;我们还讨论了处理OSPF引导的BGP路由改变的挑战,并评估了一个潜在的解决方案。
第六部分概述了这篇文章的贡献。
 
1.3相关工作
我们通过建立一个系统,这个系统也可以控制一个网络的BGP路由选择,来将以前的路由监视方面的工作更进一步。
此外,RCP与最近的路由软件方面的工作有关,包括被运用在如今的商业路由器上的专利系统;与这些形成对比,RCP使每个路由器的路由选择都是根据整个网络来做的,而不是单个路由器。
我们的工作还和之前的,关于从交换点的路由服务器上申请路由政策的工作有关,这项工作的目的是为了避免对全啮合的eBGP会话的需求;形成对比,RCP的目的是提升在一个单独的AS中分布和选择RGP路由的可扩展性和正确性。
RCP使用的有效率的对每个路由器的路由的存储技术,与被雇佣在路由服务器设施上的技术比较类似。
 
之前的工作已经提议过改变iBGP去避免震荡;但是不像RCP,这些其他提议需要在支持BGP(BGP-speaking)的路由器上做出重大的修改。
RCP为每个路由器选择路由的逻辑,与之前的传输管理的大型网络范围路由模型相关;RCP的重点是BGP路由器的实时控制,而不是对现今的路由系统中的路由器的建模。
之前的工作已经使得对于这样一个系统的需求被关注,这个系统拥有网络范围的BGP路由控制;这篇文章中,我们呈现了这样一个系统的设计、实施和评估。
如果想了解架构以及每个路由的标准活动的综述,可以看相关工作讨论,在[1,2]。

2.对现有路由器的交互操作
这部分呈现了一个AS内部BGP路由的综述,并强调了RCP必须如何做去避免对现有IP路由器进行修改的意义。

路由协议功能划分:
大多主干网络中,路由器有三种协议:
1.外部边界网关协议(eBGP),同邻域交换可达性信息;
2.内部边界网关协议(iBGP),将这些信息在AS内传播;
3.内部网关协议(IGP),计算如何到达同一AS内的其他路由器。
如图:

BGP是一种路径矢量(path-vector)协议,每个网络将它们自己的AS号加入路径,在公告被传播到下一个域之前;相对地,如同OSPF和IS-IS的IGPs是有代表性的链路状态(link-state
)协议,每条链路上都有一个可调节的权值。每个路由器将从路由协议那里获得的信息结合起来,以构建一个本地转发表,这个转发表与路径上下一个链路的每个网络前缀相匹配。在我们的设计中,RCP假定分配一个单独的最佳BGP路由的可靠性,这个BGP路由是分配给每个路由器针对每个前缀的;RCP也假定使用iBGP分配路由,依靠路由器将BGP和IGP数据“合并”,以构建它们的转发表。

BGP路由选择过程:
为了为每个前缀选择路由,每个路由器针对从eBGP和iBGP邻居那里获得的一系列路由应用如表所示的选择过程。

0.如果出口路由器不可达则忽略
1.最高本地优先级
2.最短AS路径长度
3.最低源点类型
4.最低MED(只有多个下一跳邻居在同一个AS中时才比较)。
(Multi-ethnic Discriminators,BGP路由协议中选择最优路径的一个属性。如果Origin类型无法比出最优路径,则选择拥有最小MED值的路由,并且只有当多个下一跳邻居在同一AS时才比较MED值。如果要在多个不同AS的下一跳中比较MED,可在BGP进程中输入命令bgp always-compare-med,注意须保证此命令在整个AS的路由器上输入,否则可能产生路由环路。默认的MED值为0,如果收到一条没有MED的路由,也认为是0。)
5.eBGP获得的信息优先级高于iBGP获得的信息
6.通向出口路由器的IGP路径开销最低
7.BGP发言者的路由ID最低

以上选择过程从本质上根据路由的很多属性对它们进行了比较。最简单的事例,一个路由器根据第二步中的最短AS路径选择路由,公告这个路由的路由器的ID(第七步中)就不产生影响了。然而,其他步骤所依据的路由属性,比如本地优先级,是通过配置在边界路由器上的路由协议分配的。RCP必须处理这样的情况:边界路由器将政策应用到他们从eBGP邻居那里获得的路由,以及所有的路由器都将路由选择过程应用到它们获得的BGP路由上。

选择最近的出口路由器:
在主干网络中,一个路由器常常有多重的BGP路由,它们“同样地好”,通过选择过程的第五步。

 

举个例子,图中的路由器Z,从三个边界路由器W,X,Y处获得相等AS路径长度的通向一个目的地的路由。为了降低网络资源消费,每个路由器的BGP选择过程会选择最近的出口路由器,根据IGP路径开销。BGP选择X,通向X的IGP路径开销为2。这被称作“早退(early-exit)”或“热土豆(hot-potato)”路由。RCP必须对IGP拓扑有一个实时的视角来为每个路由对每个目标前缀选择最近的出口路由器。当IGP拓扑改变的时候,RCP必须识别哪个路由器应该改变他们正在使用的出口路由器。

热土豆路由带来的挑战:
一个单独的IGP拓扑改变,会使得多个路由器改变它们多个前缀的BGP路由。

 

如果图中链路V-X的权值从1变为3,Z将选择它的数据通过出口Y,而不再选择X。当多个目标前缀被影响,这些热土都路由改变会导致数据传输发生很大的、无法预料的改变。此外,网络会经历一个较长的收敛延迟,因为路由器再访问BGP路由选择要穿过多个前缀。延迟一到两分钟是常见的。为了处理热土豆路由,RCP必须在IGP改变的时候,针对每个前缀为每个路由器配置。最终,我们将RCP视作一种方法,以超越热土豆路由,通过更灵活的方法去选择出口路由器,这点将在5.4部分讨论。

 
 
3.RCP架构
在这一部分,我们描述了RCP的架构。
我们首先呈现了RCP的三个组成块:
1.IGP观察器
2.BGP引擎
3.路由控制服务器(Route Control Server(RCS))
我们描述了每个模块可以获得的信息,包括RCS在分配路由的时候必须满足的约束条件。我们接着讨论了RCP的功能如何被重复使用以及分布到一个AS中的很多物理节点上,在保持一致性和正确性的情况下。我们的分析显示了副本没有必要运行一个单独的一致性协议:因为RCP设计的是让每个RCS做出路由选择,只在它有完整的IGP拓扑和BGP路由的那部分,这样,即使没有一致性协议,所有的副本也会做出一样的选择。
 
3.1 RCP模块
为了完善路由,每个路由器会在一个全啮合的iBGP配置下做出选择,RCP必须获得IGP拓扑信息和从每个路由器通向目的地的最佳路由,最佳路由是从相邻的ASes获得的。正因如此,RCP由三个模块组成:IGP观察期,BGP引擎,和路由控制服务器。
1.IGP观察器与一个或多个路由器建立IGP邻接关系,邻接关系使得RCP可以接收IGP拓扑信息。
2.BGP引擎从路由器获得路由信息并且将RCS的路由分配方案送到每个路由器。
3.RCS根据IGP观察器获得的IGP拓扑和BGP引擎获得的BGP路由,为每个路由器计算出最佳BGP路由。
 
RCP与一个AS内的路由器通讯,使用的是标准路由协议,如图概括。

假使IGP连接图G=(R,E),表示一个单独的AS,R表示路由器,E表示拓扑内的边。尽管一个AS内的IGP拓扑是一个典型的单独的连在一起的组件,链路、路由器或者接口的故障间或地会使网络发生划分。因此,G包含了一个或多个连载一起的组件;例如:G={P1,P2,…,Pn}。RCS仅仅为它掌握了全部IGP和BGP信息的划分Pi计算路由,而且为每个划分计算路由是独立的。
 
3.1.1 IGP观察器(Viewer)
RCP的IGP观察器监视IGP拓扑并且将这些信息提供给RCS。IGP观察器建立IGP邻接关系以接收IGP链路状态广播(Link-State Advertisement,LSA)。为了确保IGP观察器不会被路由数据包,要把IGP观察器和路由器之间的链路权重设置的很高,让IGP观察器不成为任何最短路径上的中间跳。因为IGPs如OSPF何IS-IS执行可靠的洪泛链路状态广播,IGP观察器可以维持一个随时更新的对IGP拓扑的视图,当链路权值发生变化或者设备启动或关闭。用洪泛的方式传播链路状态广播意味着IGP观察器可以接受链路状态广播,从所有在划分内的路由器,仅仅与一个单独的划分内的路由器建立邻接关系。这看似明显的性质有着重要的意义:
 
报告(Observation)1 IGP观察器对他所连接的所有划分,都有完整的IGP拓扑。
 
IGP观察器对所有在这个AS内的路由器计算成对的最短路径并且将这个信息提供给RCS。IGP观察器只需要发现AS内的两个路由器之间的路径的开销,并不需要知道IGP权值。RCS接下来用这些路径开销进行选择,AS内的任意路由器,最短出口路由器将被选中。
 
一些情况下,在IGP图内的不止一个路由器,选择了同一个路由器作为一个或多个目的地的出口路由。举个例子,一个网络在一个城市里有不止一个通道路由器,它们都通过一个网关路由器将包发送给一个或多个目的地。这些路由器会一直使用相同的BGP路由器作为网关。这些组可以被根据IGP拓扑加工:举个例子,路由器可以被根据OSPF区域分组,因为所有在相同区域的路由器会做出相同的BGP路由选择。因为IGP观察器知道IGP拓扑,它可以决定哪组路由器需要被分配相同的BGP路由。通过这种形式聚集路由,IGP观察器可以减少RCS必须要执行的独立的路由计算数目。虽然IGP拓扑是一种方便的方法,让IGP观察器选择路由分组,但不一定要选择这种方式;举个例子,一个操作者可以用命令决定如何分组。
 
 
 
3.1.2 BGP引擎
BGP引擎保持与AS内的每个路由器的iBGP会话。这些iBGP会话让RCP可以
1.获得候选的路由
2.与路由器交流路由选择
由于iBGP是在TCP上运行的,BGP引擎不需要与每个路由器建立物理的邻接关系。事实上,BGP引擎可以建立并保持iBGP会话,与任意通过IGP拓扑可以到达的路由器,这让我们可以做出以下报告:
 
报告2 一个BGP引擎可以与它所连接的IGP划分内的所有路由器建立iBGP会话。
 
这里,我们做一个合理的假设:两个端点之间的IGP连通性足以在它们之间建立一个BGP会话;事实上,持续的拥塞或者错误配置会导致这个假设不成立,但这两种情况属于异常。实际使用中,路由器常常将BGP包配置在转发路径上的高优先级队列以确保这些包的交付,即使在拥塞的时候。
 
除了接收BGP更新,RCP也使用iBGP会话将选择的BGP路由送到路由器。因为BGP更新有一个“下一跳”属性,BGP引擎可以通过网络中其他路由器的下一跳地址来公告路由。这个特性意味着BGP引擎不需要转发数据包。BGP路由有代表性地携带“下一跳”属性,根据所获得这个属性的出口路由。也就是说,RCS可以将路由送到路由器不改变下一跳属性,路由器会转发包到出口路由。
 
一个路由器以同样的方式与BGP引擎交互,好像是与一个普通的BGP发言路由器,但是BGP引擎可以给每个路由器发送不同的路由。(相对地,传统的路由反映器会给它的每个相邻的路由器送相同的路由。)一个路由器只会在选择了一个从AS内的邻居那里获得的新路由时,给BGP引擎发送BGP更新信息。类似地,BGP引擎只会在一个路由器的选择需要改变时给路由器发送更新信息。
 
3.1.3 路由控制服务器(RCS)
RCS从IGP观察器接收IGP拓扑信息,从BGP引擎接收BGP路由,计算最佳路由,并且使用BGP引擎将最佳路由发送到路由器。RCS不会给已经有最佳路由(由表中过程选择)的路由器分配路由。为了对一些划分中的一组路由器做出路由选择,以下报告必须是对的:
 
报告3:RCS只能对它拥有IGP和BGP路由信息的划分内的路由器做出路由选择。
 
注意,之前的报告保证了RCS可以(而且会)为划分内的所有路由器做出路径分配。虽然RCS将路由分配到路由器的过程有重要的灵活性,让RCS为每一个路由器分配的都是它在全啮合的iBGP配置中会选择的路由是合理的。为了模拟全啮合的iBGP配置,RCS在每个路由器上执行表1中的BGP选择过程。RCS可以进行这些计算因为:

 
1.知道IGP拓扑,RCS可以决定一个在它所看见的划分内的路由器的出口路由的集合;
2.选择过程的接下来的4步,比较BGP消息本身的属性
3.第5步,RCS将从eBGP获得的一条路由配置到一个路由器,将iBGP获得的一条路由配置到另一个路由器。
4.第6步,RCS比较由IGP观察器发过来的IGP路径开销;
5.第7步,RCS知道每个路由器的路由器ID因为BGP引擎与每个路由器都有一个iBGP会话。
 
经过对路由的比较,RCS可以给每个路由器送去合适的路由。
 
使用之前工作中得来的高级正确性性能作为向导,我们认识到网络中的路由必须满足以下性能(注意iBGP没有从本质上满足它们):
 
 
 
1.路由有效性:RCS分配的路由不能制造转发回路、黑洞或其他阻止包发到预定目的地的异常。
 
        为满足这个特性,要保持以下两点不变:
        1.RCS必须分配路由,使得任何一个路由器到它被分配的出口路由器的最短IGP路径上的路由器必须与它拥有同样的出口路由器。
        2.RCS分配的BGP路由上的IGP路径的下一跳只能穿过同一个划分内的路由器作为下一跳。
 
当RCS计算出与全啮合配置下相同的路由时,第一点特性总是会被保证,与它在全啮合iBGP配置的情况下被保证的原因相同。在全啮合情况下,每个路由器仅仅选择最短IGP路径作为出口路由器。所有在最短路径上的路由器也会选择同样的最近的出口路由器。
 
第二点特性被保证,是因为RCS不会给一个路由器分配其他划分内的出口路由器。
 
通常地,RCS在分配路径方面有重要的灵活性;RCS必须保证这些特性被保持,即使它并不是在模拟一个全啮合的配置。
 
 
 
2.路径可见性:每个路由器需要能够和至少一个RCS交换路由。
 
AS中的每个路由器都会收到一些通向外部目的地的路由,如果有的话。
为确保这个特性被满足,每个划分都要有一个IGP观察器,BGP引擎和RCS。复制这些模块可以降低某些路由被划分导致与三者之一或更多失联的可能性。如果RCS被复制了,两个副本可能会给在相同一条从路由器到出口路由器的IGP路径上的路由器们分配BGP路由。为保证当两个副本为同一划分内的路由器分配路由的时候不造成转发回路,他们必须做出一致的路由选择。如果一个网络中有多个RCSes,RCS的路由计算行为必须是确定性的:相同IGP拓扑和BGP输入必须总是产生相同的结果。
 
 
 
如果一个划分将一个路由器与RCP分离了,我们注意:
1.情况不会比现在的方案差,当一个路由器无法从它的路由反映器接收到BGP路由。
2.很多情况下,路由器仍然可以使用它由eBGP获得的路由去路由数据包,这将会很可能是它最好的路由,因为无论如何它都与大部分剩余网络划分开了。
 
 
 
3.2 分布式RCP的一致性
这一部分中,我们讨论由复制和分布RCP模块所带来的潜在的一致性问题。为了使网络划分健壮,以及避免产生单点故障,RCP模块需要被复制。(我们期待很多可能的将路由器分配给副本的设计策略将会出现。可能的方案包括使用最近的副本,拥有原始的和备用的副本,等等等等)复制带来了每个副本对网络状态(例如,IGP拓扑和BGP路由)有不同的视图的可能性。如果路由器从不同副本获得路由,这些不一致性可能是短暂的也可能是持续的,并且它们可以产生问题,如路由环路。这些不一致性的潜在威胁看起来创造了对一个一致性协议的需求,这个一致性协议可以确保每个RCS副本对网络状态有相同的视图(而且,也就是说,会做出一致的路由选择)。
 
在这一部分,我们讨论了这些不一致性的nature(分类?性质?)和后果并且呈现了令人吃惊的结果:不需要一致性协议来避免持续性不一致。
 
在讨论了为什么我们首先关注RCS副本在稳定状态下的一致性问题之后,我们解释了我们的副本策略如何确保RCS副本在稳定状态下对每个路由器做出一样的路由选择。特别地,我们展示了如果多个RCS副本与AS内的一些路由器连接,这些副本会对路由器做出相同的路径分配。我们将我们的分析集中到稳定状态下的RCS路径分配的一致性问题上(如图所示)。

 
3.2.1 短暂性与持续性的矛盾
因为每个副本可能会在不同的时间接收到BGP和IGP更新,副本可能在任何给定的时间对于每个目标没有一个一样的观点;结果就是,每个副本可能会为一样的一些路由器做出不一样的路由选择。图4阐明了一个时间线来战士这个短暂的周期。在这个短暂的周期中,路由可能会不一致。在每个前缀的基础上,较长的暂时周期不是常见的情况:虽然BGP更新数据传输是连续的,对一个单独目的地的更新数据传输在一个单独的AS看来是相对突发性的,有一个较长的沉默周期。这就是说,一组更新信息会在一个相对短的时间间隔(例如:几秒钟到几分钟)内到达同一个AS内的一些路由器,但是在较长的时间量程(例如:几小时),对外部目的地的BGP路由是相对稳定的。
 
我们关注的是在暂时的周期结束之后对每个目标的路由的一致性。由于网络实际上会被划分进“稳定状态”,RCP必须考虑可能在这些周期内存在的网络划分。需要注意的是,任何AS内的路由协议,包括任何iBGP配置,都会在BGP和IGP路由发生不断的变化时有暂时的不一致路径分配。对比,发生在RCP下的,以及在典型的iBGP配置下的,这些暂时的不一致性的性质和范围,是未来的工作的一个方面。
 
3.2.2 RCP副本在稳定状态下是连续的
RCS副本在稳定状态下会做出一致的路由选择。虽然看起来这样一个一致性需求需要一个单独的一致性协议,我们展在一部分中展示这样一个协议不是必须的。
 
 
命题1:如果多个RCSes在划分Pi内分配路由,则每个Pi上的路由器会从每个RCS收到同样的路由分配。
 
证明:回忆一下,两个RCS会对划分Pi内的一个路由器做出不同的路由分配,只有当这两个副本接收到不同输入的时候(例如,从不同的路由器组获得BGP路由,或者IGP拓扑的不同的视图)。假定RCSes A和B动给Pi内的路由器分配路由。根据报告1,A和B都有Pi内完整的IGP拓扑,根据报告2,A和B都有Pi内完整的BGP路由信息。由报告3,A和B可以对Pi内的所有路由器做路由分配。此外,因为A和B对于Pi内的所有路由器都有完整的IGP和BGP信息(也就是说,副本接收到了相同的输入),A和B会对Pi内的每个路由器做出相同的分配。
 
我们注意到,故障会违反报告2;在某些情况下,IGP等级的链接存在与BGP引擎和一些路由器之间,但是,因为某些原因,iBGP会话发生了错误(例如:由于拥塞、错误配置、软件故障等等)。结果,报告3过于保守,因为有可能会存在这样一个情况:两个RCS会从一个划分中的不同子集获得这些路由器的BGP路由信息。这种情况下,根据设计,任何RCS都不会给这个划分内的任何路由器分配路由,即使这些RCS共同拥有完整的BGP路由信息(每个有一部分,通过交换能组成完整的)。这种情况下,由于没有一致性协议,活跃性受到了影响,但是正确性没有受到影响——换句话说,两个或者多个RCSes在他们共同拥有完整的BGP信息的时候可能会不分配路由,但是不会对同一个路由器发送不同的路由。
 
 
4.RCP架构和实现
为证明RCP架构的可行性,这一部分呈现了一个RCP模型的设计与实现。可扩展性和效率造成了主要的挑战,因为主干AS有很多路由器(例如500-1000)以及很多目标前缀(例如150000-200000),而且路由协议必须快速收敛。
首先,我们描述了RCS在BGP和IGP路由改变的时候如何为每组路由器计算BGP路由。
然后,我们观察器如何获得IGP拓扑的视图并提供只把计算BGP路由所必须的信息提供给RCS。我们的IGP观察器模型由OSPF实现;当描述我们的模型的时候,我们把IGP观察器描述为“OSPF观察器”。
最后,我们描述BGP引擎如何与AS里的路由器和RCS交换BGP路由信息。
 
4.1 路由控制服务器(RCS)
RCS处理消息从BGP引擎(们)和OSPF观察器(们)那里获得。图5展示了RCS执行的高级处理。RCS从BGP引擎接收到更新消息并且将收到的路由存入路由信息库(RIB)。RCS为每个路由器做出路由选择并且将选择的路由存入每个路由器的RIB-Out。RIB-In和RIB-Out表在前缀上作为树目录被实现。RIB-In维持一个对每个前缀的路由清单;每个BGP路由有一个“下一跳”属性,这个属性在它被获得的地方唯一地识别出口路由。如图5所示

如图5所示,RCS也从IGP观察器接收每一对路由器的IGP开销。RCS使用RIB-In去计算每个路由器的最佳BGP路由,使用之前那张选择过程表的0和6步。在为一个路由器计算一个路由分配之后,RCS将路由分配送到BGP引擎,BGP引擎将更新消息送到路由器。从OSPF观察器接收到的路径开销改变信息,可能需要RCS重新计算被选择的路由,当BGP选择过程的第6步被用于去选择一个路由而且这个通向出口路由的路径开销改变了。发现被改变的路由是一个开销很大的过程,如图5所示,我们设计使用出口路由器的路径开销排名去有效率地实现这个行为。
我们现在更加详细地描述这个方法以及其他的设计见解,在图6的帮助下,图6展示了主要的RCS数据结构:

 
1.为每个BGP路由只储存一个单独的副本。
 
为每个路由器对每个目标前缀的的BGP路由存储一份单独的副本需要非常大的空间。为了减低存储需求,RCS只把路由存在RIB-In表中。BGP路由的“下一跳”属性唯一识别出口路由(BGP路由从那里获得)(The “next hop”attribute of the BGP route uniquely identifies the egress router where the BGP route was learned。)当收到更新信息,RCS可以根据前缀给RIB-In做索引,还可以根据下一跳属性添加、更新,或者移除适当的路由。为了实现RIB-Out,RCS给每个路由器配置了一个影子表(shadow tables),这是一个前缀索引树,里面包含了指向RIB-In表的指针。图6这些由BIB-Out指向RIB-In的指针的两个例子:路由1是路由器1的前缀1,路由2是路由器2和路由器3的前缀2。
 
2.对已被分配每个路由的路由器保持追踪
 
当一个路由被撤销,RCS必须为每一个使用被撤销的路由的路由器再计算路由。
为了快速识别受到影响的路由器,RIB-In表中每个被存储的路由都有一个列表,列表中是向后的指针,指向被分配这个路由的路由器。
举个例子,图6展示了RIB-In里两个前缀2上的路由2上的指针表示路由器2和路由器3被分配了这个路由。
当接收到这个前缀从下一跳被撤销的指令,RCS重新为这个清单上的路由器运行选择程序,在RIB-In里剩下的路由中为那些路由器和前缀选择。不幸的是,ME优化不能被用于BGP公告,因为每当新的路由到来时,RCS为每个路由器计算路由分配。
 
3.根据IGP路径开销为每个路由器维持一个出口路由器的序列
 
一个单独的IGP路径开销的改变可能会影响出口路由器上很多个目标前缀的BGP选择。为避免对每个前缀和路由器的路由选择重新访问,RCS根据IGP开销为每个路由器维持一个出口点的序列(图6中的出口“清单”列表)。对每个出口,RCS保存指向RIB-Out中使用这个出口点的前缀和路由的指针(在"使用表"中)。
例如,路由器1使用出口1去到达前缀2和前缀3,于是它的使用表包含了指向RIB-Out中的这些针对路由器1的入口的指针(它们依次指向存储在IRB-In中的路由)。如果从路由器1到出口1的IGP路径开销上升了,RCS将eg1在出口清单中的位置下调,直到遇到一个IGP路径开销更高的出口路由器。于是RCS只需要重新计算之前被分配BGP路由通向出口1 的前缀的BGP选择(也就是说,使用表里包含的前缀)。类似地,如果一个路径开销改变导致出口3成为了路由器1的最近出口点,RCS操作出口清单(将出口3移动到清单的最顶端),而且只需要重新计算使用出口3超过的出口路由器相关的目标,因为它们现在可能需要被分配给出口3。
 
4.给相关路由器组分配路由
 
RCS可以给一组路由器对一个目标前缀分配一样的BGP路由,而不是为每个路由器计算BGP路由。这些路由器组可以被IGP观察器识别或者被网络操作者严格配置。当RCS使用组,RIB-Out和出口清单表记录的都是路由器组而不是每个路由器,很大程度减少了存储空间和CPU开支。RCS也会维持每个组的路由器清单,以指导BGP引擎将BGP路由送到组里的每个成员。分组做出了一个权衡,在减少开支的需要和为一个组里的路由器分配不同的路由的灵活性之间。在我们的模型实现中,我们用入网点(Points-of-presence)(与OSPF域相一致)去形成组,本质上在做BGP路由选择的时候将每个POP看作一个图中的节点。
 
 
 
4.2 IGP观察器实例:OSPF观察器
 
OSPF观察器连接网络中的一个或多个路由器以接收链路状态公告(LSA),如图3所示。

OSPF维持一个实时更新的网络拓扑视图并且计算每一对路由器之间的路径开支。图7展示了OSPF观察器的处理行为。通过提供路径开销的改变和组内成员信息,OSPF观察器以两种主要方式从RCS卸下工作:

 
1.只将路径开销变化送到RCS。
 
除了在网络变化的时候发起路由状态广播之外,OSPF还会周期性地刷新路由状态广播,即使网络是稳定的。OSPF观察器过滤掉了LSA刷新,因为它不需要RCS做什么。OSPF通过以下方式过滤掉LSA刷新,它维持一个网络状态的拓扑模型,并使用这个模型去决定新接收来的LSA是表述了网络拓扑的改变还是仅仅是图7中的一次刷新。为了改变LSA,OSPF观察器在每个路由器的视角运行最短路径有线算法以选择新的路由开销。OSPF只把最短路径开销改变的最短路径送到RCS。
 
OSPF观察器必须捕获OSPF区域在路径开销上的影响。为了稳定性目标,一个OSPF域可能会被划分为辐射状(hub-and-spoke)拓扑。区域0是轮轴,它是中心区域连接着其他作为轮辐的非中心区域。每条链路明确属于一个区域,连接多个区域的路由器叫边界路由器。路由器获得他连接的链路所在的区域的全部拓扑信息,通过区域内的LSA。然而,路由器无法获得遥远的区域的完整拓扑(即它所连接的所有链路都不在的区域),但是它们可以同其他边界路由器获得那些区域的拓扑,以概括LSA的形式。
 
看起来OSPF观察期以一个完整拓扑的角度去做最短路径优先计算,忽视掉区域边界。然而,如果两个路由器在同一个区域,它们之间的最短路径一定会在这个区域内,即使存在一条穿过多个区域的更短的路径。于是OSPF观察器在计算的时候不能忽视掉区域边界,它必须分两个阶段去计算:
1.域内阶段:观察器由LSA分别计算每个区域的开销,如图7。
2.域间阶段:随后,OSPF观察器计算不同区域内的路由器之间但是将不同区域连接起来的路径的开销。
有时候OSPF观察器只知道一部分区域的拓扑。这种情况,OSPF观察器只在可见区域内执行域内阶段,域间阶段,边界路由器发来的概括LSA使得OSPF观察器可以从不可见区域内的路由器那里获得那些区域的路径开销。
 
 
2.通过将组内的路由器结合起来降低RCS的开支
OSPF观察期可以利用区域结构减少RCS必须考虑的路由器的数量。要实现这个目的,OSPF观察器:
1.提供区域0内的所有路由器的路径开销(包括不在区域0内的边界路由器)。
2.形成每个非0区域的路由器分组并且提供这些分组信息。
额外的好处是,OSPF观察器不需要与非0区域建立物理连接,因为来自区域0的概括LSA允许计算区域0内的每个路由器到其他路由器之间的路径开销。OSPF观察器也使用概括LSA去决定路由器分组。非常重要的一点需要注意:将路由器分组是一个RCP提高效率的的内部构想,它不需要任何协议或者路由器配置的改变。
 
 
 
4.3 BGP引擎
 
BGP引擎从路由器获得BGP消息并且送到RCS。BGP引擎还从RCS收到指令将BGP路由送到路由器。我们已经通过修改Quagga软件路由器实现了BGP引擎,它为每个路由器存储外出路由并且从RCS获得路由分配,而不是自己计算路由分配。BGP引擎从RCS接收工作,通过以下两个设计:
 
 
1.高效地刷新缓存BGP路由
 
BGP引擎存储一个本地的RIB-In和RIB-Out的高速缓存。RIB-In缓存可以让BGP引擎在不影响路由器的情况下提供最新的路由的副本,这使得引入一个RCS副本或者从RCS错误中恢复变得容易。类似的RIB-Out引擎使得BGP引擎可以在不影响RCS的情况下给路由器分配BGP路由,这使得iBGP连接的暂时的故障容易恢复。因为路由是分配给每个路由器的,所以BGP引擎对每个路由器维持一个RIB-Out,使用与RCS同样种类的数据结构。
 
2.管理与路由器的低级通话
 
BGP引擎提供一个简单、稳固的层面,以进行路由器之间的交互,并且维持与路由器之间的BGP会话,而且将RCS发出的或者发向RCS的很多个更新消息合成一个流。它管理很多TCP连接并且支撑建立BGP会话和与路由器交换更新的低级细节。
 
 

5.评估

评估强调稳定性和效率。
评估目标:
1.决定我们的模型在哪种环境下可行,也就是说,一定数目的前缀和路由的功能和行为以及路由器和路由器分组的数目。
2.决定瓶颈,并需要进一步提高。
 
我们展示了:
5.1 方法
5.2 5.3 评估结果
5.4 在削弱了IGP路径开销变化和BGP选择的紧耦合的情况下的实验结果。
 
5.1方法、
 
BGP数据包括
    1.时间戳的BGP更新
    2.周期性的垃圾
    3.时间戳的LSA
我们开发了一个路由器仿真器,它可以读取时间戳的BGP和OSPF数据,然后回放这些信息。为初始化RCS到一个真实的状态,在任何实验被进行之前路由器仿真器读取并回放BGP表垃圾。
 
 
通过选择性地过滤数据,我们使用单独的数据集合去考虑网路规模(路由器或路由器组的数目)和路由数目(路由的前缀的数目)的影响。
 
 
通过计算一部分路由器组的路由的数目计算网络规模。
只考虑一部分前缀,去评估路由数目对RCP的影响。
 
即使不选择整个网络,而选择一部分来评估,这一部分也会收到RCP功能的益处,如私人或虚拟私人网络。
 
评估RCS主要的度量是:
1.不同情况下对每个路由器做路由选择优化的所需时间
2.维持多样的数据结构所需的存储空间。
 
通过3种方式测量这些度量:
1.白盒:首先我们用白盒测试了RCS的功能并测量了BGP和OSPF相关的消息被处理的时候RCS使用的空间和需要的时间。
2.黑盒无队列:路由仿真器在某个时间重放某条消息并在发送下一条消息之前等待响应。这个技术测试了协议在与RCS交流,递交信息时需要的额外开支。
3.黑盒实时:路由仿真器重放根据消息中记录的时间戳这些消息。这个情况下,RCS进行的处理会使得消息被排列,因此提高了路由仿真器测量的有效处理的时间。
 
所有的黑盒测试,RCS将路由送回路由器仿真器来让测试可以被完成。
 
5.2中,我们评估了RCP如何处理BGP更新并优化路由选择。我们主要的提升是,识别每个路由器的RIB-Out的影子表,与RCS使用相同的数据结构,因此,对RCS存储空间需求的评估充分展示了它的可行性。
 
5.3中,我们呈现了对OSPF观察器和RCS中OSPF相关过程的评估。我们评估OSPF观察器,通过让它读取并处理之前被监视程序丢弃给一个文件的LSAs。OSPF观察器的白盒行为是计算每两个点之间的最短路径和OSPF分组。OSPF观察器可以运行在测试模式,这个模式中它可以记录路径开销的改变以及分组的改变,这些消息在正常的操作模式中会被交给RCS。路由器仿真器在RCS OSPF处理过程的黑盒评估中读取并且重放这些记录。
 
 
 
5.2 BGP处理
 

如图8,一组路由是指接收到同样路由的路由器。RCS影子表效果很明显,例如203000前缀的时候,1组需要175MB,但是增加2组只需要21MB,因为增加的组只需要增加指针的数目。
 

图9中白盒和黑盒无队列的差别在于,处理的时间。两次黑盒的差别在于,排序的时间。
 
 
 
5.3 OSPF以及全部的过程
这部分中,我们首先评估了RCP中的OSPF处理过程,通过考虑OSPF观察器的行为和RCS在处理OSPF相关信息时的行为。接下来我们评估了RCP的全部行为,结合BGP和OSPF相关的过程。

OSPF:LSA有三种类型,如表2,99.9%都是刷新,刷新需要OSPF观察器做的事情是最少的,而且OSPF观察器不让刷新LSAs传到RCS。

表3展示了白盒、黑盒无队列、黑盒实时对OSPF观察器的测量。还展示了白盒的计算步骤。
结果显示:
1.最重要的一点,OSPF观察器可以在合理的时间内处理所有LSA的改变。
2.SPF计算和路径开销改变步骤占了绝大部分的时间
3.0区域的改变LSA比非0区域的用的时间多很多,因为0区域的改变需要重新计算到每个路由器的路径开销;幸运的是延迟在0.8秒以内,而且如表2所示,区域0的改变在改变LSA中占很小的比例。
 
全部的:
以上评估显示OSPF路径开销变化占用了大部分处理时间,如图显示达到90%,192秒。

 
 
5.4 将BGP从IGP去耦合
BGP处理的很快,但是对内部拓扑改变的处理占用了很多时间。这个问题是因为:一个小事件(比如链路故障)使得许多对儿路由器之间的IGP路径开销的改变,这会改变对很多路由器和目标前缀的BGP路由分配。
 
一些商业路由器的厂家设计路由器的时候,在IGP事件之后不执行BGP选择过程,而是周期性地对BGP路由表进行扫描,以重新分配路由。
由于RCP为多个路由器计算BGP路由,所以比普通路由器更受影响,虽然可以通过优化软件来减少RCP对路径开销改变的响应时间,但这样不能让问题完全消失。
 
只考虑可能影响出口点可用性的OSPF路径开销变化,忽视掉所有的只造成内部拓扑改变的。实验结果如上图中过滤掉路径开销改变的线所示,减少了大部分的时间。
 
6.结论
1.面对大量的现有的路由器以及想要替换掉BGP的困难,网络研究社区一直想寻找一种有效的方式去重新设计网络路由架构。RCP有了一个发展,直接改善、逐步替换BGP,并于现有路由器兼容。
2.RCP对于处理分布在多个AS的BGP路由是个可行的选择。
3.RCP可以模拟一个全啮合的iBGP配置,并且减少了路由的开支。
4.通过向每个路由器提交自定义的路由选择,RCP避免了转发回路和协议震荡这些困扰着路由反映器配置的问题。
5.即使有多个副本分布式地工作,RCP也可以一致性的分配路由。
6.在我们最初的模型上进行的实验表明:对BGP事件的反应延迟足够小,所以可以选择RCP取代现在的iBGP架构。
7.我们也展示了减轻IGP路径开销改变和BGP选择过程的紧耦合的益处。
 

Design and Implementation of a Routing Control Platform阅读笔记的更多相关文章

  1. 《Out of control》阅读笔记(一)

    Out Of Control 说实话,当初买这本书起源于知乎诸位学问人的推荐,脑子一热就买了.为了不浪费这几十块钱,细致了看完了前三章,买来一看才发现原来这本书居然跟计算机有很深刻的关系.其实更准确地 ...

  2. UNIX Filesystems - Evolution Design and Implementation.pdf

    UNIX Filesystems - Evolution Design and Implementation.pdf

  3. Design and Implementation of Global Path Planning System for Unmanned Surface Vehicle among Multiple Task Points

    Design and Implementation of Global Path Planning System for Unmanned Surface Vehicle among Multiple ...

  4. The Implementation of Lua 5.0 阅读笔记(一)

    没想到Lua的作者理论水平这么高,这篇文章读的我顿生高屋建瓴之感.云风分享了一篇中译:http://www.codingnow.com/2000/download/The%20Implementati ...

  5. 【语音识别】Microsoft Speech Platform 自学笔记2 环境要求与安装过程

    笔记人:又吹风 时 间:2012/12/16 主要内容:Microsoft Speech Platform的环境要求与安装过程. 上次也说过了,当前Microsoft Speech Platform最 ...

  6. Central Control Over Distributed Routing阅读笔记

    Central Control Over Distributed Routing 0.ABSTRACT1.Introduction2.Flexible Fibbing3.Augmenting Topo ...

  7. Design and Implementation of the Sun Network File System

    Introduction The network file system(NFS) is a client/service application that provides shared file ...

  8. Azure Cloud Application Design and Implementation Guidance performance-optimization

    https://github.com/mspnp/azure-guidance https://github.com/mspnp/performance-optimization https://gi ...

  9. 阿里巴巴开源的Asynchronous I/O Design and Implementation

    Motivation I/O access, for the most case, is a time-consuming process, making the TPS for single ope ...

随机推荐

  1. PyQt5--QFontDiaglog

    # -*- coding:utf-8 -*- ''' Created on Sep 17, 2018 @author: SaShuangYiBing Comment: ''' import sys f ...

  2. PyQt5---ChangeIcon

    # -*- coding:utf-8 -*- ''' Created on Sep 13, 2018 @author: SaShuangYiBing ''' import sys from PyQt5 ...

  3. Oracle物化视图的创建及使用(一

    Oracle物化视图的创建及使用 http://blog.csdn.net/tegwy/article/details/8935058 先看简单创建语句: create   materialized  ...

  4. $.toJSON和eval的区别

    1.$.toJSON是jquery的方法.eval是javascript的方法 2.eval兼容的浏览器多,$.toJSON有可能解析不了的json格式的数据,eval可以.

  5. Python2.7-decimal

    decimal 模块,提供了对小数精确的计算,内置的 float 类型是以二进制的浮点数保存的,是不准确的,小数点后会有很多奇怪的数字,虽然在一般情况下计算是没问题的,因为近似相等,小数点后十几位才会 ...

  6. Android ListView自定义分割线 header 和footer设置没有页眉和页脚

    ListView.setFooterDividersEnabled(false);//设置listview无页脚 ListView.setHeaderDividersEnabled(false);// ...

  7. iOS VideoToolBox decoder解码失败(-12909和-12911)问题解决

    对于任何H.264解码器而言,都要将SPS和PPS信息传递给解码器.FFmpeg内部做了设置,所以没有显示设置.但是对于硬件解码器来讲,开发者必须手动设置.另外,使用FFmpeg解码出来的视频帧是以Y ...

  8. 大页内存(HugePages)

    原文转载自:http://blog.csdn.net/yutianzuijin/article/details/41912871 今天给大家介绍一种比较新奇的程序性能优化方法—大页内存(HugePag ...

  9. Ubuntu14.04配置gcc4.4.4+Qt4.8.4交叉编译环境

    安装32位程序运行支持 sudo apt-get install lib32stdc++6 lib32z1 lib32ncurses5 lib32bz2-1.0 可能报错: lib32stdc++6 ...

  10. AS3.0 自定义右键菜单类

    AS3.0 自定义右键菜单类: /** * 自定义右键菜单类 * 自定义菜单项不得超过15个,每个标题必须至少包含一个可见字符. * 标题字符不能超过100个,并且开头的空白字符会被忽略. * 与任何 ...