高性能路由器bgp路由协议分布并行实现方法

文档序号:7954362阅读:263来源:国知局
专利名称:高性能路由器bgp路由协议分布并行实现方法
技术领域
本发明涉及高性能路由器路由协议的并行实现方法,尤其是域间路由协议BGP(边界网关协议)的分布并行实现方法。
背景技术
随着Internet规模的快速扩展和用户流量的激增,对核心网络高性能路由器的转发要求越来越高。由于单个机柜容纳的网络接口数量有限,具有多机柜体系结构的新型高性能路由器应运而生。这种新型高性能路由器将大量各种类型的网络接口分布在多个机柜上,根据业务发展需要可增加新的机柜,实现路由器结构的高度可扩展性。例如,Juniper公司的TX Matrix路由器,Alcatel公司的RCP 7770路由器,Cisco公司的CRS-1路由器,Avici公司的TSR路由器等。
也可以将多个廉价的中低性能的路由器互联起来,构成单个高性能路由器,从而简化网络管理。组成高性能路由器的一个机柜或者一个中低端路由器称为路由节点。分布在多个路由节点上的数目众多的转发引擎同时接收和转发用户数据,从而实现高性能的数据转发。这种具有多个路由节点的高性能路由器采用专用高速互联网络连接多个机柜或者多个中低端路由器,路由协议在CPU上运行,数据报文由各个路由节点的网络接口板的转发引擎查找IP转发表进行转发,路由报文由转发引擎送CPU路由协议软件处理。整个高性能路由器具有统一的管理软件和配置界面,设备管理员使用起来是一台完整的高性能路由器,而不是一个个独立的路由节点。
高性能路由器由数据平面负责报文的转发,由控制平面负责路由协议的处理。在数据平面转发性能提高的同时,控制平面路由协议的处理成为了瓶颈。主要由于网络规模的扩展和各种新型网络应用的不断涌现,使路由器存储和计算的路由信息数量快速增长,路由器软件系统的功能变得更加复杂。BGP(边界网关协议)是域间路由协议的事实标准,是ISP(互联网服务提供商)互连的基本手段和唯一在用的域间路由协议,是高性能路由器最重要路由协议。目前核心路由器BGP路由表的数目达到688000条,并仍然呈现指数增长的趋势;要求支持的BGP邻居会话数目增加到数百个;组播支持、MPLS(多协议标记交换)扩展、IPv6扩展等新增属性使路由计算的过程更加复杂;BGP路由前缀的猝发更新,持续的路由抖动等问题使每秒钟需要处理的BGP路由更新报文显著增加。上述问题对BGP协议的扩展性提出了挑战,恶化了控制平面BGP协议的性能,如何提高BGP处理性能和存储效率对提高高性能路由器控制平面的效能至关重要。
目前多机柜高性能路由器的软件体系结构大都采用主从控制模式,指定一个路由节点作为主控节点,只有主控路由节点和备份控制路由节点可以运行路由协议。正常情况下,主控路由节点运行BGP路由协议,生成BGP路由表后,写入IP路由表和IP转发表,通过内部互联网络发布到所有路由节点的所有转发引擎的转发表中。其他路由节点只是根据转发引擎中的转发表转发数据报文。主控路由节点发生故障后,由备份控制路由节点运行BGP路由协议,接替主控路由节点工作。有的产品虽然支持多个路由处理器并行工作,但各个处理器只是用来独立维护BGP邻居关系,全局最佳路由的计算仍然是由专门的处理器集中计算和集中存储。
按照BGP协议规范RFC(Request For Comment)1771,传统BGP路由协议软件的实现结构包括邻居会话维护模块、路由计算模块、路由信息库和管理控制模块。各个模块的功能如下●邻居会话维护模块建立、维护或拆除BGP会话关系,收发邻居关系维护报文。
●路由计算模块接收路由更新消息,计算到达目的网络的最佳路由,相应地更新IP转发表中对应的转发项,将最新路由信息发布给邻居。
●路由信息库存储邻居发送的所有路由信息,标记路由计算模块计算出的最佳路由。路由器所有的BGP路由信息都集中保存在一个路由信息库中,要求路由信息库的容量非常大。
●管理控制模块利用配置策略库对路由协议进行配置和管理。
尽管可以在主控节点上通过优化软件系统来提高协议的处理速度或减少存储开销,但是优化的潜力毕竟有限,且这种方法不具备扩展性。在主控节点上采用多个CPU具有一定的扩展性,但这种方法没有充分利用高性能路由器分布式的计算资源和存储资源,而且一旦主控节点的软件系统发生故障,由于向备份控制节点的切换有一定时延,整个高性能路由器的路由和转发都要受到影响;采用这种1∶1的备份,系统的可靠性不高,如果备份控制节点也出现故障,整个高性能路由器的软件系统就要瘫痪。而基于多个路由节点的分布式并行实现方法不但具有性能的高度扩展性、更好的可靠性,而且可以充分利用高性能路由器分布式的计算资源和存储资源。
在网络协议并行实现方法的研究方面,针对BGP协议开展的工作较少。针对网络传输协议TCP的并行实现,Mats Bjorkman等提出X-Kernel体系结构;针对OSPF路由协议,Michigan州立大学的Xipeng Xiao提出将OSPF区域划分为多个不相交的“区域内路由范围”,把对整个路由表的计算划分为多个独立的部分,由不同的路由节点来并行完成。Sharad收集来自于Spring Network的196个Cisco路由器长达3年的运行数据,分析表明绝大多数骨干网络路由器的BGP协议进程消耗了60%以上的控制平面计算资源。BGP协议的实现已经成为高性能路由器控制平面的性能瓶颈,但目前还没有公开的技术资料提出实用的BGP路由协议分布并行实现方法。针对具有多个路由节点的高性能路由器,研发有效的BGP协议分布并行实现方法成为人们关注的重要问题。

发明内容
本发明要解决的技术问题是基于具有多个路由节点的高性能路由器,构建BGP分布并行实现系统,提供域间路由协议BGP的分布并行实现方法。
技术方案是每个路由节点独立运行BGP协议以构建基于BGP-Node的BGP分布并行实现系统,将整个高性能路由器BGP协议的邻居会话维护、路由计算和路由存储三种任务分解到各个BGP-Node,采用X-BGP协议进行BGP-Node之间的会话关系维护和路由同步,并修改路由计算模块实现高性能路由器全局最佳路由的计算。
本发明新定义的术语有路由节点、BGP-Node、BGP-Node聚集、X-BGP和路由同步报文。组成高性能路由器的一个机柜或者一个中低端路由器称为路由节点。分布在各个路由节点上独立运行的BGP实体(包括BGP协议软件以及存储的路由信息等)称为BGP-Node。同一高性能路由器的所有BGP-Node的集合称为一个BGP-Node聚集。X-BGP是本发明设计的同一台高性能路由器内部各BGP-Node之间的同步与通讯协议,BGP-Node之间建立的是X-BGP类型的邻居关系。路由同步报文(SYNCHRON)是用于BGP-Node之间路由同步信息传输的专用报文。另外,将未采用本发明进行并行实现的RFC 1771等规范定义的BGP协议称为传统BGP。交换路由信息的BGP实体互称BGP邻居,交换路由信息时要建立的连接称为BGP会话。BGP路由表又称路由信息库(RIB),存储的是BGP协议的路由信息;IP路由表存储的是包括BGP路由协议在内的高性能路由器上运行的所有路由协议的基本路由信息,IP路由表不保存BGP路由表中的具体协议相关的属性信息,如果BGP路由表中有多条到目标网络的路由,则只是把最佳路由写入IP路由表;IP转发表是直接用于数据转发的简化的IP路由表,如果IP路由表中有多个路由协议学到的到目标网络的多条路由,则只是把其中一条最佳路由写入IP转发表。高性能路由器的内部路由节点之间采用专用高速网络互连,路由节点之间通信使用的接口称为内部网络接口或内部接口;高性能路由器用于和其他网络设备或者用户主机互连的接口,称为外部网络接口或外部接口。没有特殊说明时网络接口指的是路由器的外部网络接口。
高性能路由器如果有N个路由节点,分别编号0...N-1;每个路由节点可有多个接口板,每个接口板上有多个网络接口;路由器的网络接口以层次命名的方式来编号,即“路由节点号/板卡号/接口号”;每个路由节点运行一个BGP-Node,所以BGP-Node的编号和路由节点号一致。
本发明BGP路由协议分布并行实现方法包括以下步骤第一步,构建基于BGP-Node的BGP分布并行实现系统,方法是多个路由节点通过高速互联网络连接,每个路由节点进行数据转发并运行BGP(可能同时运行其他路由协议),每个路由节点实现传统BGP协议的全部功能,即每个路由节点包含一个功能相同的BGP-Node。这样,整个BGP协议不再作为一个独立的进程运行在主控节点上,而是作为多个独立的BGP实体运行于每个路由节点上。各个BGP-Node通过内部网络接口通信。每个BGP-Node生成BGP路由表,并写入本路由节点的IP路由表和IP转发表,并将IP转发表中的信息下载到本路由节点的各个转发引擎的转发表中。
第二步,将整个高性能路由器BGP协议的邻居会话维护、路由计算和路由存储三种任务分解到各个BGP-Node,方法是先分解BGP邻居会话,再进行路由计算和路由存储功能的分解,使得每个BGP-Node只负责本路由节点的BGP邻居会话维护,接收、处理和存储本节点邻居送来的路由信息2.1BGP邻居会话的分解方法是修改传统BGP协议的管理控制模块,在该模块中增加邻居会话维护任务分解子模块,将整个高性能路由器维护的所有BGP邻居会话以不相交的方式分解到各个BGP-Node。邻居会话维护任务分解子模块的流程是①对配置策略库中的每个BGP邻居关系,以BGP邻居的IP地址为关键字查找IP路由表,得到到达该地址需要经过的高性能路由器的网络接口编号,网络接口编号中的路由节点号即是负责维护该BGP邻居关系的路由节点号和BGP-Node编号,这样选择处理BGP邻居关系的BGP-Node能够通过所在路由节点的外部接口直接到达对应的邻居路由器,不需要再次穿越内部交换网络。
②如果负责维护该BGP邻居关系的BGP-Node发生故障,则选择负载最小的BGP-Node(例如维护的邻居关系数目最少的节点)负责维护该邻居关系。
③生成BGP邻居路由器和BGP-Node对应关系表(说明某个BGP路由器的邻居会话由哪个BGP-Node维护),下发到各个路由节点的所有转发引擎。
④路由节点和BGP-Node的状态发生严重变化(例如出现故障)时,则对受影响的邻居会话重新进行分派。
2.2路由计算任务的分解由各个路由节点的转发引擎进行,方法是各个路由节点通过外部网络接口从其他路由器收到BGP路由更新报文时,转发引擎以报文的源地址为关键字查找BGP邻居路由器和BGP-Node对应关系表,得到目标BGP-Node编号,将该路由报文送给目标BGP-Node,由目标BGP-Node处理该路由更新报文,进行路由计算。
2.3路由信息存储功能的分解由各个BGP-Node进行,方法是每个BGP-Node都有路由信息库,分别保存所在BGP-Node收到的由转发引擎送来的路由更新报文中的完整的路由信息,从而实现了路由信息的分布式存储。
第三步,采用X-BGP协议进行BGP-Node之间的会话关系维护和路由同步以及高性能路由器最佳路由的计算,BGP-Node聚集在外部行为上与传统BGP协议一致,确保整个高性能路由器路由与转发功能的正确性,方法是3.1设计X-BGP协议的报文,将X-BGP协议的报文分为邻居关系维护报文和路由同步报文二大类
X-BGP邻居关系维护报文有OPEN、KEEPALIVE和NOTIFICATION三种类型,这三种报文的语法、语义、时序关系与传统BGP相同,但是要求邻居地址是同一高性能路由器的其他BGP-Node,由X-BGP邻居关系维护报文传递BGP-Node之间的控制信息和状态信息;X-BGP路由同步报文是SYNCHRON,SYNCHRON报文格式比传统BGP协议的UPDATE报文简单,与传统BGP协议的UPDATE报文在协议状态机中具有相同的时序关系,具体格式是路由同步报文由报文头和报文体组成。报文头包括“报文类型”“报文长度”“来源邻居标识”三个字段,其中“报文类型”字段说明是update(路由更新)类型还是withdraw(路由撤销)类型;“报文长度”字段说明路由同步报文的字节数;“来源邻居标识”字段说明引发本次路由变化事件的外部BGP路由器的IP地址。报文体分为update类型的同步报文的报文体和withdraw类型的同步报文的报文体二种类型。update类型的同步报文的报文体包括本地偏好度、Origin(路由来源类型)、AS路径长度、下一跳AS、下一跳地址、MED(多出口鉴别字)以及多个“网络前缀地址”和“网络地址掩码”。withdraw类型的同步报文的报文体携带一个或多个要撤销的“网络前缀地址”“网络地址掩码”信息。由SYNCHRON传递BGP-Node之间的路由同步信息。
3.2对传统BGP协议邻居会话维护模块进行修改,以维护高性能路由器内部各个BGP-Node之间的邻居会话关系每个BGP-Node代表整个高性能路由器与外部运行BGP协议的路由器通过传统BGP协议建立邻居关系,如果高性能路由器与外部路由器属于相同自治系统,建立的是内部BGP邻居关系(I-BGP);如果属于不同的自治系统,建立的是外部BGP邻居关系(E-BGP)。BGP-Node的邻居会话维护模块可使用原有的代码实现I-BGP和E-BGP二种传统的邻居关系维护功能,但是需要修改邻居会话维护模块以处理同一高性能路由器内部BGP-Node之间建立的X-BGP类型的邻居关系。邻居会话维护模块的修改方法是在邻居关系类型相关的数据结构中新增“X-BGP”类型;邻居关系维护报文在BGP-Node之间采用内部网络接口传递控制信息和状态信息,而不是I-BGP和E-BGP采用的外部网络接口。
3.3对传统BGP协议路由计算模块进行修改,将该模块变为路由计算与同步模块,以处理BGP-Node之间的路由同步和整个高性能路由器全局最佳路由的计算,方法是每个BGP-Node只负责计算和存储本地BGP邻居会话上接收的路由更新报文,只能看到通过本地邻居会话获得的路由可达信息,其他邻居会话通告的路由可达信息是不可见的。每个BGP-Node如果基于本地路由可达信息进行BGP最佳路由的选择,则无法保证各个BGP-Node间BGP最佳路由视图的一致性,这样整个高性能路由器的行为和并行实现之前就不一致,就说明高性能路由器没有正确实现数据转发功能。另外,一个BGP-Node从自己的邻居路由器学到的路由可能需要转送到其他BGP路由器,这其中会有一些与其他BGP路由器的会话关系是由别的BGP-Node维护的。因此必须进行BGP-Node间的路由信息的传递和路由同步。
将传统BGP协议的路由计算模块进行修改后更名为路由计算与同步模块,负责路由更新报文、路由同步报文的处理,进行路由计算和不同BGP-Node之间的路由同步。每个BGP-Node基于本地路由可达信息进行BGP最佳路由的选择之后,通过路由同步报文在各个BGP-Node间传递选择结果,在各个局部最佳路由的基础上选择出全局最佳路由。
路由计算与同步模块由路由更新报文处理和路由同步报文处理二个子模块组成。路由更新报文处理子模块从其他路由器接收路由更新报文,更新本地BGP路由信息库(RIB),向其他BGP-Node发送路由同步报文;路由同步报文处理子模块从其他BGP-Node接收路由同步报文,更新BGP路由信息库(RIB)。
下面各子模块功能的描述中,“所有合适的邻居”包括I-BGP,E-BGP和X-BGP各种类型的邻居。向I-BGP和E-BGP邻居发布路由信息或进行路由宣告使用的是传统BGP的路由更新报文,向X-BGP邻居发布路由信息使用的是X-BGP路由同步报文。判断邻居是否“合适”依据的是配置策略库中的路由策略是否允许向该邻居输出本路由。
路由更新报文处理子模块通过所在路由节点的外部网络接口从其他路由器接收来自BGP邻居的路由更新报文,完成报文解析和输入策略处理后,进行路由计算并更新路由信息库;将计算出的局部最佳路由信息封装成路由同步报文,发送给所有其他BGP-Node,将计算出的全局最佳路由封装为路由更新报文,传递给其他的BGP路由器。其工作流程是
(1)接收其他路由器送来的路由更新报文,报文携带的主要参数有type,routeattrib,rt,p。其中type表示路由更新操作的类型,可以是update(增加新路由项),或者withdraw(撤销已有的路由项);routeattrib在增加新路由项时,代表路由更新报文中携带的路由属性信息;rt为待处理的路由信息,包括目的网络前缀,AS-Path、Next-Hop等路由属性,以及宣告该路由的BGP邻居等;p为该路由更新报文的来源邻居标识,是外部路由器的标识。
(2)设置变量oldbest初始值为空,用该变量存储旧的最佳路由;(3)查找路由信息库,得到与rt具有相同网络前缀的叶节点,记为routenode。
(4)如果更新报文的类型是withdraw,则进行下面的操作(4-1)如果routenode为空,即步骤(3)没有找到满足条件的叶节点,则结束处理;(4-2)使用变量oldbest保存routenode的最佳路由,即oldbest=routenode.bestroute;(4-3)从routenode的前缀列表中删除rt;(4-4)如果rt和routenode.bestroute相等,则进行(4-5)~(4-7),否则返回;(4-5)从routenode的前缀列表中选择最佳路由,用得到的值来更新routenode.bestroute;(4-6)如果新的routenode.bestroute为空,则将routenode节点从路由信息库中删除,然后向所有合适的邻居发布关于rt的路由撤销报文;(4-7)如果新的routenode.bestroute不为空,并且宣告该路由的BGP邻居是本BGP-Node的活跃邻居,则把它作为新的最佳路由向所有合适的邻居宣告。
(5)如果更新报文的类型是update,则进行下面的操作(5-1)如果routenode为空,则为routenode分配新的空间,将rt插入到routenode的前缀列表,将rt作为routenode的最佳路由,然后把routenode插入到路由信息库中,并把rt向所有合适的邻居宣告。跳转到步骤(6)执行;
(5-2)如果routenode不为空,则使用oldbest保存routenode的最佳路由;(5-3)如果在routenode的前缀列表中存在一条路由是由邻居p宣告过来的,则把它的路由属性使用新学到的路由的attrinfo更新;否则,把rt插入到routenode的前缀列表。
(5-4)从routenode的前缀列表中再选择最佳路由,记为routenode.bestroute,如果和原来的oldbest不同,并且宣告该路由的BGP邻居是本BGP-Node的活跃邻居,则把这一新选出的最佳路由向所有合适的邻居宣告。
(6)如果oldbest和routenode.bestroute不同,则更新IP路由表和IP转发表(6-1)如果routenode.bestroute为空,则从IP路由表和转发表中删除oldbest;(6-2)如果routenode.bestroute不为空,则将routenode.bestroute加入到IP路由表和IP转发表中。
路由同步报文处理子模块通过高性能路由器内部网络接口接收到其他BGP-Node的同步报文,完成报文解析后进行路由计算,并更新本地路由信息库;如果新选出来的高性能路由器的最佳路由保存在本BGP-Node且来源邻居会话驻留在本地,则向其他BGP路由器传递路由更新,或者向其他BGP-Node再次传递路由同步报文。其工作流程是(1)接收其他BGP-Node送来的路由同步报文,报文携带的主要参数有type,routeattrib,rt,p。其中type表示路由同步操作的类型,可以是update(增加新路由项),或者withdraw(撤销已有的路由项);routeattrib在增加新路由项时,代表同步报文中携带的路由属性信息;rt为待处理的路由信息;p为该路由的来源邻居标识,即宣告该路由的其他路由器;(2)设置变量oldbest初始值为空,用该变量存储旧的最佳路由;(3)查找路由信息库,得到与rt具有相同网络前缀的叶节点,记为routenode。
(4)如果同步报文的类型是withdraw,则进行下面的操作(4-1)如果routenode为空,即步骤(3)没有找到满足条件的节点,则返回;(4-2)使用变量oldbest保存routenode的最佳路由,即oldbest=routenode.bestroute;
(4-3)从routenode的前缀列表中删除rt;(4-4)如果rt和routenode.bestroute相等,则进行(4-5)~(4-7)步操作,否则返回;(4-5)从routenode的前缀列表中选择最佳路由,用得到的值来更新routenode.bestroute;(4-6)如果新的routenode.bestroute为空,则将routenode节点从路由信息库中删除;(4-7)如果新的routenode.bestroute不为空,并且宣告该路由的BGP邻居是本BGP-Node的活跃邻居,则把它作为新的最佳路由向所有合适的邻居宣告(这时的最佳路由是本节点原来保存的非最佳路由)。
(5)如果同步报文的类型是update,则进行下面的操作(5-1)如果routenode为空,则为routenode分配新的空间,将rt插入到routenode的前缀列表,将rt作为routenode的最佳路由,然后把routenode插入到路由信息库中。跳转到步骤(6)执行;(5-2)如果routenode不为空,则使用oldbest保存routenode的最佳路由;(5-3)如果在routenode的前缀列表中存在一条路由是由邻居p宣告过来的,则把它的路由属性使用新学到的路由的attrinfo更新;否则,把rt插入到routenode的前缀列表;(5-4)从routenode的前缀列表中再选择最佳路由,记为routenode.bestroute,如果和原来的oldbest不同,并且宣告该路由的BGP邻居是本BGP-Node的活跃邻居,则把新选出的最佳路由向所有合适的邻居宣告。
(6)如果oldbest和routenode.bestroute不同,则更新IP路由表和IP转发表(6-1)如果routenode.bestroute为空,则从IP路由表和转发表中删除oldbest;(6-2)如果routenode.bestroute不为空,则将routenode.bestroute加入到IP路由表和IP转发表中。
路由同步报文处理模块与路由更新报文处理模块在处理过程上的不同之处主要表现在
(1)(4-6)步,去掉“然后向所有其他合适的BGP邻居发布关于rt的路由撤销报文”,路由撤销时,如果被撤销的路由是当前最佳路由,并且routenode的前缀列表中不包含其他冗余路由,则仅将routenode从路由信息库中删除,不需要向邻接路由器发送路由撤销通告,撤销通告的发布由路由同步报文的发送者负责完成;(2)(5-1)步,去掉“并把rt向所有其他合适的邻居宣告”,在增加新路由项时,如果该路由项被选为最佳路由,由于该路由项的来源邻居会话不在本地BGP-Node上,因此只更新IP路由表和转发表,不需要向邻接路由器发送路由更新通告;(3)(5-4)步,路由同步报文如果使本路由节点最佳路由的属性发生变化,从原有的最佳路由降为备份路由,并且新选出的最佳路由是本节点原来保存的非最佳路由,其来源邻居会话驻留在本地,则由本地BGP-Node向邻接路由器发送路由变更通告。
经过对传统BGP协议软件进行修改,BGP-Node由邻居会话维护模块、路由计算与同步模块、路由信息库与管理控制模块组成。邻居会话维护模块负责BGP协议状态机的维护,具有与传统BGP协议相同的协议状态机,但是处理的邻居关系增加了X-BGP类型;路由计算与同步模块定义了路由同步报文,分为路由更新报文处理子模块和路由同步报文处理子模块,所有BGP-Node的路由计算与同步模块协同进行整个高性能路由器全局最佳路由的计算;路由信息库保存本BGP-Node收到的路由信息,路由更新报文处理子模块和路由同步报文处理子模块都要查询和更新路由信息库;管理控制模块配置路由策略,进行邻居会话的分解。
BGP分布并行实现之后的高性能路由器要保证数据转发功能的正确性,每个路由节点必须具有一致的转发行为,即无论采用哪个路由节点转发数据,整个高性能路由器所表现出来的转发操作必须相同。本发明各个BGP-Node通过路由计算与同步模块的路由同步过程实现了最佳路由视图的一致性。因为按照协议规范要求,BGP路由协议只把最佳路由写入本路由节点的IP路由表,所以各个路由节点的IP路由表是一致的;IP转发表由IP路由表去掉某些属性生成,是简化的IP路由表,因此各个路由节点的IP转发表是一致的;IP转发表向各个转发引擎下载,这样各个转发引擎具有完全相同的转发表映像。因此,尽管各个报文转发引擎按照本地转发表映像的内容独立工作,但是整个高性能路由器每个路由节点对到达相同地址的IP报文按照相同的路由策略进行转发,这样并行实现后的整个高性能路由器在数据转发时与传统路由器看不出发生变化,从而保证了数据转发功能的正确性。
采用本发明可以达到如下技术效果本发明实现了BGP邻居会话维护、路由计算任务的并行处理和路由信息的分布存储,实现了性能的扩展性和可靠性的提高,同时又通过有效的同步机制实现了各个路由节点控制平面的一致性和数据平面的一致性,将BGP-Node聚集对外虚拟成一个完整的BGP路由器。具体效果有(1)计算性能邻居维护和路由计算任务划分到不同的路由节点上并行处理,有助于降低路由策略计算对每个节点计算能力的消耗,提高整个路由器的吞吐量。
(2)存储性能属于不同BGP邻居集合的路由信息分别存储在各个BGP-Node上,提高了路由存储能力上的扩展性。
(3)可靠性BGP路由协议分布在多个路由节点上并行运行,个别路由节点发生故障并不会造成整个路由器路由协议运行的中断,提高了路由协议和路由器控制平面的可靠性。
(4)控制平面的一致性各个路由节点通过路由同步和计算模块实现了一致的最佳路由视图,由于BGP路由器只是将学到的最佳路由传递给其他路由器,每个路由节点代表整个高性能路由器向外传递的路由信息一致,这样高性能路由器与其他路由器的BGP协议交互行为在并行实现前后没有发生变化,确保了路由协议功能的正确性。
(5)数据平面的一致性各个路由节点的BGP-Node具有相同的全局最佳路由,BGP-Node只将最佳路由写入IP路由表和IP转发表,这样各个路由节点的转发引擎具有相同的转发表,具有一致的转发行为,这样整个高性能路由器的数据转发行为在并行实现前后没有发生变化,确保了数据转发功能的正确性。


图1传统高性能路由器采用的BGP路由协议主备模式实现结构;图2本发明采用的BGP路由协议分布并行实现结构;图3是本发明高性能路由器BGP邻居关系示意图;
图4是传统BGP协议软件的实现结构;图5是本发明BGP-Node的实现结构;图6是本发明X-BGP协议路由同步报文的结构;图7是采用本发明进行BGP协议分布并行实现后与采用传统BGP协议在更新报文吞吐量和CPU利用率等方面的性能比较曲线。
具体实施例方式
图1是传统高性能路由器采用的BGP路由协议主备模式实现结构。图2是本发明采用的BGP路由协议分布并行实现结构。在图1和图2中,路由节点可以是一个机柜或者是一个中低端路由器。每个路由节点具有多个网络接口与其他路由器互连,各个路由节点之间通过内部高速交换网络互连。高性能路由器用于核心网络,BGP是最重要的必备的路由协议。
在图1的主备结构中,只有主控路由节点和备份控制路由节点可以运行BGP路由协议。正常情况下,主控节点运行BGP路由协议,生成BGP路由表后,写入IP路由表和IP转发表,通过内部互联网络发布到所有路由节点的所有转发引擎的转发表中。其他路由节点只是根据IP转发表转发数据报文。主控路由节点发生故障后,由备份控制路由节点接替工作,如图1中二个路由节点之间的单向箭头所示。
在图2的全分布并行实现结构中,各个路由节点的功能是相同的,每个路由节点包含一个BGP-Node,运行BGP协议。各个BGP-Node通过内部互连网络通信。每个BGP-Node生成BGP路由表,写入IP路由表和IP转发表,并直接写入本节点各个转发引擎的转发表。各个BGP-Node之间通过内部交换网络交互信息,实现路由的同步。
图3是采用了本发明的高性能路由器的BGP邻居关系示意图(以4个路由节点的高性能路由器为例)。高性能路由器的每个路由节点和多个其他路由器相连,每个BGP-Node也和多个运行BGP的其他路由器建立邻居关系。高性能路由器与其他路由器使用传统的BGP协议进行通信,根据是否属于相同的自治系统,建立内部BGP邻居关系(I-BGP)或者外部BGP邻居关系(E-BGP)。各个BGP-Node之间采用X-BGP协议,建立全互联的X-BGP邻居关系。
I-BGP和E-BGP交互使用传统BGP协议,分为OPEN、KEEPALIVE、NOTIFICATION和UPDATE四种类型的报文;X-BGP协议具有OPEN、KEEPALIVE、NOTIFICATION和SYNCHRON四种类型的报文。传统BGP协议采用单播IP地址,基于TCP传输;X-BGP协议的OPEN、KEEPALIVE、NOTIFICATION等三种邻居关系维护报文采用单播IP地址,基于TCP传输,而SYNCHRON报文基于代表整个BGP-Node聚集的组播IP地址,基于UDP协议传输。
通过BGP-Node的路由计算与同步模块,将BGP-Node聚集对外虚拟成一个BGP路由器。每个路由节点与其他路由器交换信息时,使用相同的代表整个高性能路由器的路由器标识(RouterID),传递的最佳路由信息不是某个BGP-Node局部最佳路由,而是整个高性能路由器的全局最佳路由。
图4是传统BGP协议软件的实现结构。按照BGP协议规范RFC 1771,BGP协议软件包括以下功能部件邻居会话维护模块、路由计算模块、路由信息库和管理控制模块。邻居会话维护模块建立、维护或拆除BGP会话关系,收发邻居关系维护报文。路由计算模块接收路由更新消息,执行输入路由策略过滤操作;计算到达目的网络的最佳路由,相应地更新IP转发表中对应的转发项;根据邻居会话的输出路由策略,将最新路由信息发布给邻居。路由信息库保存由邻居路由器送来的所有路由信息,并标记路由计算模块计算出的最佳路由。管理控制模块对路由协议进行配置和管理,由配置策略库记录配置的策略,实现对不同BGP邻居的路由信息传播控制和流量工程目标。
图4邻居会话维护模块左侧双向箭头表示与其他路由器交互OPEN、KEEPALIVE和NOTIFICATION等邻居关系维护报文;路由计算模块左侧的单向箭头表示与其他路由器交互路由更新报文(UPDATE)。
图5是本发明BGP-Node的实现结构。与传统BGP协议的实现类似,BGP-Node由邻居会话维护模块、路由计算与同步模块、路由信息库与管理控制模块组成,但各部分的功能都有变化。邻居会话维护模块负责BGP协议状态机的维护,具有与传统BGP协议相同的协议状态机,但是处理的邻居关系增加了X-BGP类型;路由计算与同步模块定义了路由同步报文,分为路由更新报文处理子模块和路由同步报文处理子模块,新增路由同步报文处理子模块,路由更新报文处理子模块也要参与路由同步过程,所有BGP-Node的路由计算与同步模块协同进行整个高性能路由器全局最佳路由的计算;路由信息库保存BGP-Node学到的路由信息,路由更新报文处理子模块和路由同步报文处理子模块都要查询和更新路由信息库;管理控制模块配置路由策略,进行邻居会话的分解。
图5邻居会话维护模块左侧双向箭头表示该BGP-Node与其他路由器或者其他BGP-Node交互OPEN、KEEPALIVE和NOTIFICATION等邻居关系维护报文;路由计算与同步模块左侧的单向箭头表示与其他路由器交互路由更新报文(UPDATE),或者与其他BGP-Node在内部互连网络中交互路由同步报文(SYNCHRON)。
路由更新报文处理子模块通过所在路由节点的外部网络接口从其他路由器接收来自BGP邻居的路由更新报文,完成报文解析和输入策略处理后,进行路由计算并更新路由信息库;将计算出的局部最佳路由信息封装成路由同步报文,发送给所有其他BGP-Node,将计算出的全局最佳路由封装为路由更新报文,传递给其他的BGP路由器。
路由同步报文处理子模块通过高性能路由器内部互连网络接收到其他BGP-Node的同步报文,完成报文解析后进行路由计算,并更新本地路由信息库;如果新选出来的高性能路由器的最佳路由保存在本BGP-Node且来源邻居会话驻留在本地,则向其他BGP路由器传递路由更新,或者向其他BGP-Node再次传递路由同步报文。
图6是X-BGP路由同步报文的结构。BGP协议的最佳路由选择不需要全部的BGP路由属性信息,只需要路由属性中固定长度的关键字段。为此将BGP-Node间交互的路由信息简化,X-BGP路由同步报文由报文头和报文体组成。报文头包括“报文类型”“报文长度”“来源邻居标识”三个字段,其中“报文类型”字段说明是update(路由更新)类型还是withdraw(路由撤销)类型;“报文长度”字段说明路由同步报文的字节数;“来源邻居标识”字段说明引发本次路由变化事件的外部BGP路由器的IP地址。报文体分为update类型的同步报文的报文体和withdraw类型的同步报文的报文体二种类型。update类型的同步报文的报文体包括本地偏好度、Origin(路由来源类型)、AS路径长度、下一跳AS、下一跳地址、MED(多出口鉴别字)以及多个“网络前缀地址”和“网络地址掩码”。withdraw类型的同步报文的报文体携带一个或多个要撤销的“网络前缀地址”“网络地址掩码”信息。
图7是有18个路由节点的高性能路由器采用本发明进行BGP分布并行实现后与采用传统BGP协议软件在更新报文吞吐量和CPU利用率等方面的性能比较曲线。每个路由节点的基准性能相同,每个BGP-Node负责1个邻居会话的执行。每个邻居每秒注入100条路由更新报文,邻居会话数量从2个增长到18个的配置情况下,图7(a)和图7(b)对每个邻居的吞吐量和每个节点的CPU利用率进行比较。
由图7(a)看出,随着邻居规模的增大,传统BGP的更新报文吞吐量迅速下降,有18个邻居时每个邻居的吞吐量平均只有37个报文;但是采用本发明后18个BGP-Node并行处理时,每个邻居路由更新报文的吞吐量基本保持不变。
由图7(b)看出,各个BGP-Node并行处理时CPU利用率增长很慢,而传统BGP协议CPU利用率快速增长,在邻居会话数量为18个时,二者在CPU利用率上的差距约60%。
随着邻居数的增多,并行实现时每个邻居的更新报文吞吐量有所下降,各个BGP-Node的CPU利用率有所上升,主要是由于BGP-Node之间路由同步计算过程和内部通讯报文的开销,例如BGP-Node需要处理来自于其他BGP-Node的路由同步报文或者转发路由更新报文。
下面是对本发明路由协议全分布并行实现系统存储性能收益的分析设高性能路由器有N个路由节点,每个路由节点1个BGP-Node。整个路由器共有P个网络前缀,到每个网络前缀平均每个BGP-Node从外部路由器学到K条路由,对每个网络前缀平均有K*N条路由。在传统路由器中,BGP路由信息库总共要保存N*K*P条路由。而在本发明中,对每个网络前缀,每个BGP-Node只需要保存K条从本地邻居学到的路由,以及最多(N-1)条从其他BGP-Node收到的由其他BGP-Node断定的最佳路由。每个BGP-Node共保存(K+(N-1))*P条路由。
设保存外部路由器学到的路由更新的存储代价为M1,保存从其他BGP-Node收到的同步路由信息的代价为M2。由于每个路由项完整的路由属性信息只保存在其来源邻居会话所在的BGP-Node上,因此M1>M2。由此得到每个BGP-Node和传统路由器路由存储容量需求之比SS=(M1*K+M2*(N-1))*PM1*(K*N)*P<K+N-1K*N.]]>例如K=2,N=18,每个节点相对于传统路由器的存储开销减少约50%,并且随着K和N的变大,每个节点的存储开销会变得更小。
下面是对本发明路由协议全分布并行实现系统的可靠性收益的分析设高性能路由器有N个路由节点和N个BGP-Node。从基本路由功能上看,传统路由器的BGP路由协议出现故障,所有的BGP邻居关系都要断链,而在本发明中某个BGP-Node出现故障,其他BGP-Node仍然可以正常工作,受影响的外部BGP邻居也只有原来的1/N,因此BGP协议的可靠性提高到原来的N倍。
如果整个路由器网络前缀数为P,并且每个BGP-Node对每个前缀从其他路由器学到K条路由,那么发生故障后,传统路由器所有K*N*P条路由都被清除,而在本发明中只会撤销K*P条路由,受影响的路由只有原来的1/N,每个网络前缀仍然存在K*(N-1)条路由,仍然可达。
根据欧洲网络信息中心(RIPE)对大量核心网络路由表的统计和分析的具体数据(Routing Information Service.http://www.ripe.net/ris/),在核心路由器中绝大多数网络前缀都有多条路由,被统计路由器不具有冗余路由的网络前缀都低于5%,最少的只有0.4%。这说明在实际网络中,即使在最坏的情况下,即不具有冗余路由的网络前缀全部驻留在发生故障的BGP-Node上,造成不可达的网络前缀最多也不会超过5%。
权利要求
1.一种高性能路由器BGP路由协议分布并行实现方法,其特征在于它包括以下步骤第一步,构建基于BGP-Node的BGP分布并行实现系统,方法是多个路由节点通过高速互联网络连接,每个路由节点进行数据转发并运行BGP,每个路由节点实现传统BGP协议的全部功能,即每个路由节点包含一个功能相同的BGP-Node;整个BGP协议不再作为一个独立的进程运行在主控节点上,而是作为多个独立的BGP实体运行于每个路由节点上;各个BGP-Node通过内部网络接口通信,每个BGP-Node生成BGP路由表,并写入本路由节点的IP路由表和IP转发表,并将IP转发表中的信息下载到本路由节点的各个转发引擎的转发表中;第二步,将整个高性能路由器BGP协议的邻居会话维护、路由计算和路由存储三种任务分解到各个BGP-Node,方法是先分解BGP邻居会话,再进行路由计算和路由存储功能的分解,使得每个BGP-Node只负责本路由节点的BGP邻居会话维护,接收、处理和存储本节点邻居送来的路由信息;第三步,采用X-BGP协议进行BGP-Node之间的会话关系维护和路由同步以及高性能路由器最佳路由的计算,方法是设计X-BGP协议的报文,将X-BGP协议的报文分为邻居关系维护报文和路由同步报文二大类,由邻居关系维护报文负责BGP-Node之间的控制信息和状态信息的传递,由路由同步报文传递BGP-Node之间的路由同步信息;对传统BGP协议邻居会话维护模块进行修改,以维护高性能路由器内部各个BGP-Node之间的邻居会话关系;对传统BGP协议路由计算模块进行修改,将该模块变为路由计算与同步模块,以处理BGP-Node之间的路由同步和整个高性能路由器全局最佳路由的计算。
2.如权利要求1所述的高性能路由器BGP路由协议分布并行实现方法,其特征在于分解BGP邻居会话的方法是修改传统BGP协议的管理控制模块,在该模块中增加邻居会话维护任务分解子模块,邻居会话维护任务分解子模块的流程是2.1对配置策略库中的每个BGP邻居关系,以BGP邻居的IP地址为关键字查找IP路由表,得到到达该地址需要经过的高性能路由器的网络接口编号,网络接口编号中的路由节点号即是负责维护该BGP邻居关系的路由节点号和BGP-Node编号;2.2如果负责维护该BGP邻居关系的BGP-Node发生故障,则选择负载最小的BGP-Node负责维护该邻居关系;2.3生成BGP邻居路由器和BGP-Node对应关系表,下发到各个路由节点的所有转发引擎;2.4路由节点和BGP-Node的状态发生严重变化时,则对受影响的邻居会话重新进行分派。
3.如权利要求1所述的高性能路由器BGP路由协议分布并行实现方法,其特征在于所述路由计算任务的分解由各个路由节点的转发引擎进行,方法是各个路由节点通过外部网络接口从其他路由器收到BGP路由更新报文时,转发引擎以报文的源地址为关键字查找BGP邻居路由器和BGP-Node对应关系表,得到目标BGP-Node编号,将该路由报文送给目标BGP-Node,由目标BGP-Node处理该路由更新报文,进行路由计算。
4.如权利要求1所述的高性能路由器BGP路由协议分布并行实现方法,其特征在于所述路由信息存储功能的分解由各个BGP-Node进行,方法是每个BGP-Node都有路由信息库,分别保存所在BGP-Node收到的由转发引擎送来的路由更新报文中的完整的路由信息,从而实现路由信息的分布式存储。
5.如权利要求1所述的高性能路由器BGP路由协议分布并行实现方法,其特征在于所述X-BGP邻居关系维护报文有OPEN、KEEPALIVE和NOTIFICATION三种类型,这三种报文的语法、语义、时序关系与传统BGP相同,但是要求邻居地址是同一高性能路由器的其他BGP-Node,由X-BGP邻居关系维护报文传递BGP-Node之间的控制信息和状态信息;所述X-BGP路由同步报文SYNCHRON与传统BGP协议的UPDATE报文在协议状态机中具有相同的时序关系,由报文头和报文体组成报文头包括“报文类型”、“报文长度”、“来源邻居标识”三个字段,其中“报文类型”字段说明是update即路由更新类型还是withdraw即路由撤销类型;“报文长度”字段说明路由同步报文的字节数;“来源邻居标识”字段说明引发本次路由变化事件的外部BGP路由器的IP地址;报文体分为update类型的同步报文的报文体和withdraw类型的同步报文的报文体二种,update类型的同步报文的报文体包括本地偏好度、Origin即路由来源类型、AS路径长度、下一跳AS、下一跳地址、MED即多出口鉴别字以及多个“网络前缀地址”和“网络地址掩码”;withdraw类型的同步报文的报文体携带一个或多个要撤销的“网络前缀地址”“网络地址掩码”信息。
6.如权利要求1所述的高性能路由器BGP路由协议分布并行实现方法,其特征在于所述对传统BGP协议邻居会话维护模块进行修改的方法是在邻居关系类型相关的数据结构中新增“X-BGP”类型,邻居关系维护报文在BGP-Node之间采用内部网络接口传递控制信息和状态信息。
7.如权利要求1所述的高性能路由器BGP路由协议分布并行实现方法,其特征在于将传统BGP协议的路由计算模块进行修改的方法是将传统BGP协议的路由计算模块进行修改后更名为路由计算与同步模块,它由路由更新报文处理和路由同步报文处理二个子模块组成7.1路由更新报文处理子模块通过所在路由节点的外部网络接口从其他路由器接收来自BGP邻居的路由更新报文,完成报文解析和输入策略处理后,进行路由计算并更新路由信息库;将计算出的局部最佳路由信息封装成路由同步报文,发送给所有其他BGP-Node,将计算出的全局最佳路由封装为路由更新报文,传递给其他的BGP路由器,其工作流程是(1)接收其他路由器送来的路由更新报文,报文携带的主要参数有type,routeattrib,rt,p,其中type表示路由更新操作的类型,可以是update,或者withdraw;routeattrib在增加新路由项时,代表路由更新报文中携带的路由属性信息;rt为待处理的路由信息,包括目的网络前缀,AS-Path、Next-Hop等路由属性,以及宣告该路由的BGP邻居等;p为该路由更新报文的来源邻居标识,是外部路由器的标识;(2)设置变量oldbest初始值为空,用该变量存储旧的最佳路由;(3)查找路由信息库,得到与rt具有相同网络前缀的叶节点,记为routenode;(4)如果更新报文的类型是withdraw,则进行下面的操作(4-1)如果routenode为空,即步骤(3)没有找到满足条件的叶节点,则结束处理;(4-2)使用变量oldbest保存routenode的最佳路由,即oldbest=routenode.bestroute;(4-3)从routenode的前缀列表中删除rt;(4-4)如果rt和routenode.bestroute相等,则进行(4-5)~(4-7),否则返回;(4-5)从routenode的前缀列表中选择最佳路由,用得到的值来更新routenode.bestroute;(4-6)如果新的routenode.bestroute为空,则将routenode节点从路由信息库中删除,然后向所有合适的邻居发布关于rt的路由撤销报文;(4-7)如果新的routenode.bestroute不为空,并且宣告该路由的BGP邻居是本BGP-Node的活跃邻居,则把它作为新的最佳路由向所有合适的邻居宣告;(5)如果更新报文的类型是update,则进行下面的操作(5-1)如果routenode为空,则为routenode分配新的空间,将rt插入到routenode的前缀列表,将rt作为routenode的最佳路由,然后把routenode插入到路由信息库中,并把rt向所有合适的邻居宣告;跳转到步骤(6)执行;(5-2)如果routenode不为空,则使用oldbest保存routenode的最佳路由;(5-3)如果在routenode的前缀列表中存在一条路由是由邻居p宣告过来的,则把它的路由属性使用新学到的路由的attrinfo更新;否则,把rt插入到routenode的前缀列表;(5-4)从routenode的前缀列表中再选择最佳路由,记为routenode.bestroute,如果和原来的oldbest不同,并且宣告该路由的BGP邻居是本BGP-Node的活跃邻居,则把这一新选出的最佳路由向所有合适的邻居宣告;(6)如果oldbest和routenode.bestroute不同,则更新IP路由表和IP转发表(6-1)如果routenode.bestroute为空,则从IP路由表和转发表中删除oldbest;(6-2)如果routenode.bestroute不为空,则将routenode.bestroute加入到IP路由表和IP转发表中;7.2路由同步报文处理子模块通过高性能路由器内部网络接口接收到其他BGP-Node的同步报文,完成报文解析后进行路由计算,并更新本地路由信息库RIB;如果新选出来的高性能路由器的最佳路由保存在本BGP-Node且来源邻居会话驻留在本地,则向其他BGP路由器传递路由更新,或者向其他BGP-Node再次传递路由同步报文,其工作流程是(1)接收其他BGP-Node送来的路由同步报文,报文携带的主要参数有type,routeattrib,rt,p,其中type表示路由同步操作的类型,可以是update,或者withdraw;routeattrib在增加新路由项时,代表同步报文中携带的路由属性信息;rt为待处理的路由信息;p为该路由的来源邻居标识,即宣告该路由的其他路由器;(2)设置变量oldbest初始值为空,用该变量存储旧的最佳路由;(3)查找路由信息库,得到与rt具有相同网络前缀的叶节点,记为routenode;(4)如果同步报文的类型是withdraw,则进行下面的操作(4-1)如果routenode为空,即步骤(3)没有找到满足条件的节点,则返回;(4-2)使用变量oldbest保存routenode的最佳路由,即oldbest=routenode.bestroute;(4-3)从routenode的前缀列表中删除rt;(4-4)如果rt和routenode.bestroute相等,则进行(4-5)~(4-7)步操作,否则返回;(4-5)从routenode的前缀列表中选择最佳路由,用得到的值来更新routenode.bestroute;(4-6)如果新的routenode.bestroute为空,则将routenode节点从路由信息库中删除;(4-7)如果新的routenode.bestroute不为空,并且宣告该路由的BGP邻居是本BGP-Node的活跃邻居,则把它作为新的最佳路由向所有合适的邻居宣告,这时的最佳路由是本节点原来保存的非最佳路由;(5)如果同步报文的类型是update,则进行下面的操作(5-1)如果routenode为空,则为routenode分配新的空间,将rt插入到routenode的前缀列表,将rt作为routenode的最佳路由,然后把routenode插入到路由信息库中;跳转到步骤(6)执行;(5-2)如果routenode不为空,则使用oldbest保存routenode的最佳路由;(5-3)如果在routenode的前缀列表中存在一条路由是由邻居p宣告过来的,则把它的路由属性使用新学到的路由的attrinfo更新;否则,把rt插入到routenode的前缀列表;(5-4)从routenode的前缀列表中再选择最佳路由,记为routenode.bestroute,如果和原来的oldbest不同,并且宣告该路由的BGP邻居是本BGP-Node的活跃邻居,则把新选出的最佳路由向所有合适的邻居宣告;(6)如果oldbest和routenode.bestroute不同,则更新IP路由表和IP转发表(6-1)如果routenode.bestroute为空,则从IP路由表和转发表中删除oldbest;(6-2)如果routenode.bestroute不为空,则将routenode.bestroute加入到IP路由表和IP转发表中。
8.如权利要求1或7所述的高性能路由器BGP路由协议分布并行实现方法,其特征在于所述“所有合适的邻居”包括I-BGP,E-BGP和X-BGP各种类型的邻居,向I-BGP和E-BGP邻居发布路由信息或进行路由宣告使用的是传统BGP的路由更新报文,向X-BGP邻居发布路由信息使用的是X-BGP路由同步报文;判断邻居是否“合适”依据的是配置策略库中的路由策略是否允许向该邻居输出本路由。
全文摘要
本发明公开了一种高性能路由器BGP路由协议分布并行实现方法,目的是为具有多个路由节点的高性能路由器提供域间路由协议的分布并行实现方法。技术方案是每个路由节点独立运行BGP协议以构建基于BGP-Node的BGP分布并行实现系统,将整个高性能路由器BGP协议的邻居会话维护、路由计算和路由存储三种任务分解到各个BGP-Node,采用X-BGP协议进行BGP-Node之间的会话关系维护和路由同步,并修改路由计算模块实现高性能路由器全局最佳路由的计算。采用本发明可将BGP-Node聚集对外虚拟成一个完整的BGP路由器,提高计算性能、存储性能和可靠性,且实现了各个路由节点控制平面的一致性和数据平面的一致性。
文档编号H04L29/06GK1976313SQ20061003227
公开日2007年6月6日 申请日期2006年9月19日 优先权日2006年9月19日
发明者朱培栋, 宁洪, 张晓哲, 杜秀春, 刘功杰, 蔡开裕 申请人:中国人民解放军国防科学技术大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1