OSPF详解

2023-06-08,

OSPF 详解 (1) [此博文包含图片] (2013-02-04 18:02:33)

转载

标签: 端的 第二 以太 第一个 正在

目录

序言

初学乍练

循序渐进学习OSPF 朱皓

 入门之前

 了解OSPF

 熟悉OSPF

 掌握OSPF

 精通OSPF

OSPF基础试题 李劲松 郭逵 朱皓

 选择题

 判断题

深入探讨

OSPF FAQ 刘宇

 写在前面

 OSPF FAQ

OSPF中的最短路径算法 陈旭盛

 Dijkstra算法介绍

 Dijkstra算法的证明

 OSPF协议中对Dijkstra算法的使用

OSPF Graceful Restart 朱皓

 关于Graceful Restart

 OSPF Graceful Restart

 RFC 3623:Graceful OSPF Restart

 Cisco Nonstop Forwarding

 VRP & IOS的相关配置

 Graceful Restart两种主流实现方式的比较

OSPF多实例 李劲松 杨默寒

 前言

 OSPF多实例

 配置实例

 留给读者

 附录

OSPF附录E及相关问题与规避措施 周迪

 不支持附录E导致的组网缺陷

 OSPF附录E的解决方案

 其他相关的问题以及规避方法

 后记

OSPF DNA LSA 张宇弟

 背景知识

 DNA LSA详解

 总结

循序渐进学习OSPF

OSPF是目前使用最广泛的IGP协议,也是一个数通领域工作者的必修科目.虽然学习的人很多,但是因为OSPF协议的复杂,学习起来非常吃力.而且经常有老虎吃刺猬,无从下口的感觉.本文试图对OSPF的学习过程进行一个整理,希望能够对学习理解这一重要协议有所帮助.

RFC2328是OSPFv2最权威的资料,这篇RFC有244页之长,在IETF的几千篇文档中也是属于超长超大的,可见其复杂程序.笔者认为对于OSPF的学习还是要循序渐进,在不同的阶段选择不同的关注点.当然对于逻辑思维很强,有很深厚数理基础的同学可能直接看RFC效率更快,每个人还是要根据自己的情况选择合适的学习方法.本文是面对如笔者一般普通的学习人群.

对于大多数人而,学习OSPF总是经过这样几个过程:了解,熟悉,掌握,精通.而对于数通领域的初涉者,我认为还需要在了解OSPF之前再做一些准备.

1.入门之前

OSPF是一种动态路由协议,所以需要首先知道什么叫路由,什么叫路由协议,什么又是动态路由协议,设备是如何通过路由来执行数据转发过程的.这些东西在看OSPF之前是首先要搞清楚的问题.我个人强烈建议在学习OSPF前,首先学习RIP.通过对RIP协议的学习可以明白路由的构成要素,路由的匹配,路由如何指导转发的过程,包括路由协议的相关概念(比如路由的传递,路由计算和路由选择,路由收敛等).

RIP是最传统的IGP协议,上手比较快,也容易理解.学习了RIP后可以明白RIP的缺点在哪里,这样学习OSPF的时候就更容易理解,一些机制的提出实际是为了解决相关的一些问题,比如环路,距离的度量等等.

入门之前的准备工作很重要,否则在学习OSPF的时候,很容易在一些基本问题上耗费很多时间而不知其所以然.学习OSPF并不是一个死记硬背的过程,如果那样的话,会越学越糊涂.

学习基本技能的几种途径包括,其它同事写的理解报告,公司精品课程中的<<IP路由基础>>,当然还少不了<<TCP/IP路由:卷一>>的相关章节.公司的技术网站上你能找到从入门到精深各个方面的文档,地址是http://tech.huawei-3com.com

2.了解OSPF

做好准备就可以开始阅读一些基本的OSPF教材了.刚开始的时候会发现有大量的新概念搞得人头很大,看起来也很容易就犯困(记得我当年就是这个样子).OSPF经典的教材很多,但往往经典的东西都试图把所有的问题都讲到,其实这不一定是个好主意.对于初学OSPF的人而言,找个合适的课程听一堂课作为学习OSPF的第一步会轻松的多.好在公司里经常会有OSPF的培训课程,课前粗粗的看一遍胶片,然后就去听吧.很多同学因为这样那样的事连一堂完整的OSPF课程都没听过,这很可惜.要知道在外面想系统的听人给你讲讲OSPF是一件多么困难的事!第一次听OSPF不需要全部听懂,搞清楚一些问题就行了.什么是OSPF?和RIP有什么不同?OSPF有什么好处?OSPF的基本原理是什么?

OSPF协议并不传递路由条目,而是传递链路状态信息,并根据该信息来计算路由.这样一个最最基本的OSPF问题当年可是困扰了我很久.一第5类LSA不就是携带一条外部路由么,怎么又说LSA并不是路由呢.相信直到今天同样的问题也会困扰很多OSPF的初学者.在了解OSPF的这个阶段,不用去关心OSPF到底是如何计算出路由的,也用不着去关心OSPF都有那几类LSA,每类LSA的Link ID是什么意思.这个阶段关注的应该是OSPF大面上的东西,比如OSPF是要建邻居的,通过邻居交换链路信息达到链路信息数据库的同步,划分区域的目的,OSPF对于不同链路的开销进行比较的基准等等.

这个阶段要开始在设备上配置OSPF,OSPF的配置并不复杂,只要花几天时间做几个小衩,就能弄清楚前面所学习到的那些理论知识到底是怎么回事了.

到这里的时候一切都还是很简单的,现在可以跟那些对OSPF完全不懂的朋友们侃侃关于链路信息的概念了!不过心里要很清楚,后面的路还很远.

这个时期建议把公司里几个版本的OSPF胶片都找出来看一遍,试着跟随胶片的思路去了解OSPF吧.

3.熟悉OSPF

熟悉OSPF的过程,是需要对OSPF协议的整个过程进行细致一点的研究了.从OSPF的网络类型开始看起,网络类型的不同决定了hello发送方法和周期的不同,这些当然就影响到邻接关系的建立.邻接关系是如何建立起来的?需要去研究邻接的状态机了.邻接的建立目的是为了交换LSA,那么如何交换,如何保证交换.对于OSPF的区域问题,要知道所有类型的区域划分目的是什么,比如NSSA区域即允许区域间LSA也允许外部LSA的泛洪,那么NSSA的意义到底是什么这类的问题.既然说到区域当然要知道虚链路,搞清楚虚链路和IP隧道的区别在哪里.你需要知道OSPF的认证,OSPF的聚合,OSPF中的路由引入等等,总之操作手册中关于OSPF部分的所有命令都要去试一遍,看看到底有什么用,是干什么的.

在这个阶段,前进的每一步都需要通过做实验来加深加快理解,很多问题不是躺在订上靠脑袋想能够想明白的.做实验的时候打开debug信息是一个好主意,虽然这东西有时候看的人眼晕,不过你可在屏幕快速翻滚的时候借机喝口水啥的,也算是休息一下头脑.建议从这个时候起要养成做笔记的好习惯,笔记这个东西是可以温故而知新的,过些日子回头再看,保证能看出其中的问题来,或者看出新的疑问来;另一方面,查找笔记总是能最快的找到你要的答案.

还好你是在H3C,在这个阶段你可以再去听一堂OSPF的培训.相信这次你会听的津津有味,天啊.你终于知道那个在台上念念叨叨的家伙在说些啥了.这次培训的效果是最好的,基本上讲课全部的内容都对你有用,这时候以前积累的问题就狂问吧,即使你所有的问题都已经扔给细想导师了,还是可以再问题一遍,有的时候问东的结果会引出西来,这样也许又能多学点东西.

熟悉OSPF要花多久?因人而异,关键还看你用了多少时间,做了多少实验.保守的估计三个月怎么也够了.在这个阶段,公司里经典的胶片和讲义,都要找出来看过;Jeff Doyle的<<TCP/IP路由:卷一>>里关于OSPF的部分也起码要看过一遍,其中有些部分还是可以跳过,什么时候都别忘了你的重点在哪里.

4.掌握OSPF

掌握的意思终于可以少犯或者不犯错误了,起码说关于OSPF的话题,很少或者不会有什么太明显的错误.对于开发或者测试OSPF的技术工程师,熟悉OSPF是远远不够的,你必须要走的更远些.

是时候去看那些报文的结构了,相信这个时候再去看各种报文的结构会容易很多.随便画一个简单的拓扑,你必须要知道每个路由器会产生那些LSA,它的LSDB是怎样的.看LSA结构的时候要结合SPF路由计算的过程.这个过程是OSPF的核心问题,终于要揭开关底BOSS的神秘面纱了.当然了,前提是你要做好打BOSS的心理准备,反正我觉得这个过程虽然充满乐趣,但却很容易头晕脑涨.结合实例来看会比较好些,你可以直接用WVRP建一个简单的OSPF网络,来看看各个设备上的LSDB是否能看明白.有很多好的文档也能指导你更快的理解.对于LSA和LSDB,英文文档可以看看Cisco的OSPF atabase Explanation Guide,中文文档季刊里就有好几篇,那篇关于SPF计算的文档更是要读通读懂.

这个阶段需要去了解一些比较细节的东西了,比如各种LSA的属性及标志性字段啦,LSA的更新老化机制等等,是时候看RFC了.好好的看一遍RFC2328是必要的,而且在今后的日子里,你可能会经常的翻看这篇文档.

RFC虽然非常的,但RFC毕竟只是一个规程,在具体的实现上,各个厂商还是有很多不同的.而且很多支持的新特性,不一定会在RFC中提及,所以产品新特性的介绍是另一个最重要的文档.光知道一个厂商的实现还不行,最起码要知道主要厂商的OSPF实现.对于市场主流厂商的研究是一个慢慢积累的过程,但是作为一个研发人员,不看外面的世界显然是不可能的.新特性会牵扯到很多问题,OSPF作为一个成熟使用多年的协议,特性也非常多,要花不少时间.

什么叫做掌握OSPF,没有一个定义,在这个阶段中可能有很多人,有的人掌握的好些,有些人掌握的差些.这个阶段其实已经可以说是OSPF的一个结尾了更深层次的研究有时候需要的不单是理论上的东西,还包括经验和经常性的实践.我自己感觉也是停留在这个层面上,尤其是因为工作的关系,并不常接触到协议中的问题,对实际使用案例接触的也少了,所以经常会碰到一些OSPF的问题会很含糊.

5.精通OSPF

精通OSPF就是大牛了,我觉得起码要几个方面都做到吧.一个是对OSPF的协议非常清楚,包括几乎所有的细节.一个是在OSPF的疑难解答方面,不说来一个答一个,起码立刻能找到分析问题的方法,找到并正确定位问题.第三就是对协议的发展要心中有数.网络技术的不断发展,对路由协议也提出了各种各样新的要求,并且对协议进行着不断扩展.作为一个精通OSPF协议的人,需要关注这些新技术的发展方向这是理所当然的.

精通OSPF并没有指南,不是看过哪些书,过多少年就一定能达到了.甚至是不是精通了OSPF,只是自己给自己的一个定义.不过,我想,如果一直向精通OSPF这个目标不断迈进,永不停歇的人,一定会成为一个真正的高手.

OSPF基础笔试试题

选择题

1.对于路由表,下列说法中正确的是:

A.在缺省的情况下,如果一台路由器同时运行了RIP和OSPF两种动态路由协议,则在路由表中只会显示RIP发现的路由,因为RIP协议的优先级更高.

B.在缺省的情况下,如果一台路由器同时运行了RIP和OSPF两种动态路由协议,则在路由表中只会显示OSPF发现的路由,因为OSPF协议的优先级更高.

C.在缺省的情况下,如果一台路由器同时运行了RIP和OSPF两种动态路由协议,则在路由表中只会显示RIP发现的路由,因为RIP协议的花费值(metric)更小.

D.在缺省的情况下,如果一台路由器同时运行了RIP和OSPF两种动态路由协议,则在路由表中只会显示OSPF发现的路由,因为OSPF协议的花费值(metric)更小.

2.下列动态路由协议中,属于Cisco公司私有协议的有:

A.RIP B.IGRP C.EIGRP D.IS-IS E.OSPF F.BGP

3.OSPF协议生成的路由分为四类.按照优先级从高到低排列,正确的顺序为:

A.区域内路由,区域间路由,第一类外部路由,第二类外部路由

B.第一类外部路由,区域内路由,区域间路由,第二类外部路由

C.区域内路由,第一类外部路由,区域间路由,第二类外部路由

D.第二类外部路由,区域内路由,区域间路由,第一类外部路由

4.对于运行OSPF协议的路由器来说,Router ID是路由器的唯一标识,所以协议规定:必须保证Router ID在如下范围之内唯一:

A.网段内 B.区域内 C.自治系统内 D.整个因特网.

5.一台运行OSPF的路由器,它的两个正常工作的接口一个属于区域0,另一个属于区域9,并且引入了5条静态路由,则该路由器一定会生成哪类LSA:

A.Router LSA(Type=1) B.Network LSA(Type=2) C.Network Summary LSA(Type=3)

D.ASBR Summary LSA(Type=4) E.AS External LSA(Type=5)

6.OSPF选举DR,BDR时会使用如下的那些报文?

A.HELLO报文(Hello Packet) B.DD报文(Database Description Packet)

C.LSR报文(Link State Request Packet) D.LSU报文(Link State Update Packet)

E.LSAck报文(Link State Acknowledgmen Packet)

7.下列那些OSPF报文中会出现完整的LSA信息

A.HELLO报文(Hello Packet) B.DD报文(Database Description Packet)

C.LSR报文(Link State Request Packet) D.LSU报文(Link State Update Packet)

E.LSAck报文(Link State Acknowledgmen Packet)

8.下列那些OSPF报文中只会出现LSA的摘要(LSA HEAD)信息?

A.HELLO报文(Hello Packet) B.DD报文(Database Description Packet)

C.LSR报文(Link State Request Packet) D.LSU报文(Link State Update Packet)

E.LSAck报文(Link State Acknowledgmen Packet)

9.两台运行OSPF协议的路由器通过点对点的链路相连,在两者链路状态数据库达到同步(邻居状太机为FULL)之后的2个小时之内,在两台路由器之间的链路上,一定有下列的那些报文在传递?

A.HELLO报文(Hello Packet) B.DD报文(Database Description Packet)

C.LSR报文(Link State Request Packet) D.LSU报文(Link State Update Packet)

E.LSAck报文(Link State Acknowledgmen Packet)

10.关于OSPF协议中DR(Designated Router--指定路由器)的产生,下列说法中正确的是:

A.DR是系统管理员通过配置命令人工指定的.

B.DR是同一网段内的路由器通过一种算法选举出来的.

C.成为DR的路由器一定是网段内优先级(Priority)最高具Router ID最大的.

D.可以通过配置命令使一台路由器不可能成为DR.

11.关于OSPF协议中的DR,BDR,下列说法中正确的是:

A.在广播型的网络中,如果没有DR,则协议无法正确运行,但如果没有BDR,协议仍然可以正确运行

B.在一个广播型的网络中,即使只有一台路由器,仍旧需要选举DR.

C.DR和BDR与本网段内的所有运行OSPF协议的路由器建立邻接(adjacency)关系,但DR和BDR之间不再建立邻接关系

D.DR会生成本网段内的Network LSA(Type=2),但BDR不会.

12.根据OSPF协议规定,在下列类型的网络中需要选举DR,BDR.

A.Broadcast; B.NBMA; C.Point-to-Multipoint D.Point-to-Point

13.根据OSPF协议规定,下列哪些LSA只在区域内传播.

A.Router LSA(Type=1) B.Network LSA(Type=2) C.Network Summary LSA(Type=3)

D.ASBR Summary LSA(Type=4) E.AS External LSA(Type=5)

14.根据OSPF协议规定,对于一个运行在STUB区域的区域内路由器,它的LSDB中不会出现下列哪些LSA

A.Router LSA(Type=1) B.Network LSA(Type=2) C.Network Summary(Type=3)

D.ASBR Summary(Type=4) E.AS External LSA(Type=5)

15.关于OSPF协议的LSA,下列说法中正确的是:

A.每一条Router LSA(Type=1)中只包含该路由器一个接口的相关信息.

B.每一条Network LSA(Type=2)中只包含该路由器一个接口所属的网段中的相关信息;

C.每一条Network Summary LSA(Type=3)中只包含一条路由信息

D.每一条ASBR Summary LSA(Type=4)中只包含一个ASBR相关信息

E.每一条AS External LSA(Type=5)只包含一条AS外部路由信息

16.关于OSPF协议中的AREA(区域)的概念,下列说法中错误的是:

A.每个AREA中有自己的LSDB,不同AREA的LSDB是不相同的.

B.为了标识出自己所属的区域,Router LSA(Tyype=1)中包含了区域信息.

C.每个区域都用一个32位的整数--AREA ID来标识,且必须保证AREA ID在自治系统内唯一.

D.区域的标识--AREA ID必须向相关的国际组织申请,不可自行指定.

17.关于OSPF协议中的虚连接(Virtual Link),下列说法中正确的是:

A.虚连接不能穿过STUB区域;

B.虚连接不能穿过骨干区域;

C.虚连接不能穿过多个区域;

D.对于同一个区域来说,最多只能有一条虚连接将其作为转换区域(Transit area)

18.LSAck报文(Link State Acknowledgmen Packet)是对下列哪些OSPF报文的确认?

A.HELLO报文(Hello Packet) B.DD报文(Database Description Packet)

C.LSR报文(Link State Request Packet) D.LSU报文(Link State Update Packet)

E.LSAck报文(Link State Acknowledgmen Packet)

判断题

1.两台运行OSPF协议的路由器正在进行链路状态数据库的同步,从其中一台上查看邻居状态机,已经达到FULL状态,因此可以判断在另一台路由器查看邻居状态机,应该同样达到FULL状态.

2.OSPF协议中提出DR的概念是为了减少广播和NBMA网络中路由器之间进行链路状态数据库同步的次数,但如果网络中的路由器少于3台,这样做是没有意义的.所以如果在广播和以太网中只有两台路由器,则不选举DR.

3.根据OSPF协议规定:在一个广播类型的网络中,由于有DR的存在,两台DRother路由器之间不再进行路由信息的交换,也不再发送Hello报文.

4.两台路由器建立起邻居关系的一个前提是:两台路由器到少各有一个接口属于同一个区域.

5.虽然OSPF协议中规定了,每台路由器的Router ID必须保证在自治系统内唯一,但由于Router LSA只在本区域内传播,所以即使有两台区域内路由器(分别属于不同的区域)的Router ID相同,也不会引起路由计算的错误.

参考答案

1.B 2.BC 3.A 4.C 5.ACE 6.A 7.D 8.BCE 9.ADE 10.BD 11.ABD 12.AB 13 AB 14.DE 15.BCDE 16.BD 17.AC 18.D

判断题

1.F 2.F 3.F 4.T 5.F

OSPF FAQ

写在前面

OSPFv2(RFC 2328)算是RFC0001-3000最重要最复杂的协议之一了,其中的细节描述非常之多而细微繁杂.如果你有兴趣去对比RFC的文件大小,可能会现只有一个关于新千年的非技术文档比它要大点了.在公司经常有各部门的同事询问各种OSPF的细节的问题,很多是在网络运营和测试中的实际问题,几乎验证了再细小的细节都有可能出现网上问题的论断.

前几天有开发人员在我转发的对RFC2328 Appendix E的讨论中说,这几乎成为测试OSPF的每个员工必提(不知道是必提的问题单,还是必询问的问题)的50个问题之一,可惜没有时间来整理下.我想整理下FAQ的时间绝对是远少于公司前赴后继的开发,测试,市场,技术支援询问讨论这些FAQ的时间.正好今天下午有同事问我在MPLS/BGP VPN环境中,PE-CE运行OSPF,Multi-VRF的时候为什么收不到路由.其实仔细检查下,发现Multi-VRF用的是Frame Relay做的两个子接口,而在OSPF中没有配置neighbor造成连邻居都不能形成,何况路由.于是决定,这个事情我自己来做---至少是我自己开个头---虽然我也有很多事情要做很多东西要写,但至少不是日理万机,加一两天的班能完成的.

希望公司测试,开始OSPF的同事都能熟悉文中所有的内容,相认这对于一个精通OSPF的技术专家来说,是必须了解,阅读它能让你迅速增加对OSPF常见细节的了解.对于方中的FAQ的一些更详细的解释,请参考RFC 2328和tech.huawei-3com.com中相关的总结文档,文档URL可能会改变,按文档标题搜索.

OSPF FAQ

1.OSPF是否很难懂?

A:前面提到过,OSPFv2(RFC2328)算是RFC 0001-3000最重要最复杂的协议之一了,其中的细节描述非常之多而细微繁杂.我曾经对比过RFC的文件大小,可能只有一个关于新千年的非技术文档比它要大点了.相对起来,OSPF确定比较复杂.但绝对不是非常难以掌握.如同其它Internet核心技术一样,它是非常有趣和有挑战性的;同样,一般的了解和配置都是易于掌握的,也就是说如果你不开发或测试OSPF,那么你所需要达到的程度还是很容易实现的.但作为一个开发或测试OSPF模块的人员,你必须对其中所有的细节都非常精通,而这确定需要些时间的积累.好在目前的资料和积累都非常多了,深入了解OSPF已经是件相对5年有容易多的事情了.至少,如果你能不去参考文档能回答本文几乎所有的FAQ,那么你确实对OSPF算的上相当的精通了.

2.为什么新路由器启动后我不能配置OSPF?

A:很简单,一上来是不能配置OSPF的,因为OSPF运行是需要一个确定的Router ID作为路由器标志的,这个东西对于OSPF来说非常重要,在OSPF的各类协议报文中都要用到.所以,要么你在OSPF中明确指定Router ID,要么配置一个以上的三层接口让OSPF模块计算出一个可以供OSPF协议使用的Router ID,这样才能启动OSPF进程.

3.OSPF的Router ID如何配置,缺省是什么?

A:VRP3.0和IOS一样,如果没有显示配置OSPF Router ID(很遗憾,VRP3.0的OSPF没有命令配置,但在MPLS/BGP VPN环境下,对于OSPF多进程是起进程的时候就同时一条命令配置Router ID),简单的说我们采用如下策略:1.如果有Loopback接口配置了,就选IP地址数值最大的Loopback地址;2.如果没有配置Loopback接口地址,就选IP地址数值最大的物理接口地址.

需要注意的是,如果当前OSPF进程正在运行,Router ID即使是重新手工配置或计算都不会马上生效,而需要OSPF进程重新启动才会生效.这个要求是合理的,因为Router ID对OSPF协议来说太重要,不可能在OSPF保持邻居不断的情况下更新.

4.为什么引入的两条静态路由不能同时发布.

A:这个是VRP3.0的历史遗留问题,不支持RFC 2328 Appendix E,一直没有很好解决.实际上一般情况下静态路由都可以正确发布的,但对于类似于RFC 2328 Appendix E情况,由于OSPF type 5 LSA的ID是以这些网段的地址来标识的,每一类型的LSA是以产生该LSA的路由器ID,LSA的序列号以及所承载的网段的网络地址这三个信息的组合作为其关键值进行区分的.所以同一台路由器产生的或者引入外部路由而生成的这些LSA,对于那些网段地址一样,而掩码信息不一样的路由,将不能进行区分.例如对于静态路由20.20.0.0/16和20.20.0.0/24的引入将只会生成一个LSA,其中必有一条路由因不能引入而被丢弃.OSPF的RFC 2328附录E推荐了一种改进的方法,很可惜VRP3.0并不支持,在多个项目中也暴露出这个问题.

更详细的总结请参考测试中心周迪整理的文档:OSPF附录E及相关问题及规避措施,文档URL如下:http://tech.huawei-3com.com/article.php/1003.

5.为什么我配置两个区域,从这两个区域学到的路由总的开销相等,为什么不能形成ECMP(等价路由)?

A:按协议标准,在RFC 2328 Section 16.8. Equal-cost multi path中规定OSPF要形成等价路由必须有如下的条件:1.涉及的是同一区域;2.优先级和总的开销一致.很多情况下大家忽略了第一个条件.对于Intra或Inter Area的路由,协议并没有非常明确的规定,在多区域各种比较条件相同的情况下到底选择哪一条,VRP3.0的选择条件也并非选择后面发布的一条.但对于Type 5的外部路由,RFC 2328 Section 16.4 Calculating AS external Routes中明确规定,when there are multiple least cost routing table entries the entry whose associated area has the largest OSPF Area ID(when considered as an unsigned 32-bit integer) is chosen.也就是最终选择经过的Area ID大的那条路由作为优先.不过需要注意的是,很多实现都没有严格按照这个来做的.对于Cisco IOS来说(以IOS 12.3(10)T为例),无论是区域间路由,还是AS外部路由,都会形成等价路由,这应该是与协议不符的.

更详细的总结可以参考tech网站的相关文档:关于OSPF不同区域负载分担的问题,URL在:http://tech.huawei-3com.com/article.php/913.

6.为什么有的Stub区的ABR没有正确产生缺省路由?

A:在某些特定组网下(主要是Area 0只采用loopback接口,没有形成邻居),STUB区的ABR没有产生缺省路由,看来这样的组网方式还是有些市场,我对你发现的问题感到很遗憾,这其实是出了网上问题几方讨论后的一个妥协结果.实际上我个人认为,目前的处理并非很有道理.更详细的总结可以参考tech网站的相关文档:为什么STUB区的ABR没有产生缺省路由?URL在:http://tech.huawei-3com.com/article.php/822

7.ABR确切定义是什么?是否在路由器上配置了两个以上的区域就是ABR?

A:非常遗憾,RFC 2328给出的ABR定义如下:

Area border routers:

A router that attaches to multiple areas.Area border routers run multiple copies of the basic algorithm,one copy for each attached area.Area border routers condense the topological information of their attached areas for distribution to the backbone.The backbone in turn distributers the information to the other areas.

这里并没有给出ABR非常严格的定义.导致一些厂商的实现不一致,而ABR的功能又如此重要.但在RFC 2328中3.1.The backbone of the Autonomous System 中有描述:The OSPF backbone always contaions all area border routers.反过来,ABR必须属于骨干区.如果你一个路由器只配置了Area 2,Area 3而没有接口属于骨干区,肯定就不能算是ABR了.对于ABR的比较严格或比较有效的定义,可以参考RFC 3509:Alternative Implementations of OSPF Area Border Routers.这个文档正式了RFC2328对ABR定义不严格导致的一些问题,提出了更严格的两种定义方法.目前的VRP3.0对ABR定义如下1:配置多个区域;2:不但要求要有骨干区的接口,而且还要有邻居的骨干区域形成.

8.OSPF没有路由,甚至邻居都不能形成Full关系,最常见的原因是什么?

A:原因很多,但最常见的是如下几种情况:

1.OSPF网络类型是NBMA的,但你忘记配置邻居了;

2.OSPF网络类型是NBMA的,你配置了邻居,但在诸如Frame relay的map语句中忘记加broadcast关键字了,导致组播报文不能到达对方;

3.OSPF邻居的hello及dead interval值不一致;

4.在Stub或NSSA区域,有些路由器没有配置成Stub或NSSA;

5.OSPF验证配置错误;

6.OSPF Router ID有问题,可能和某个路由器一样了;

7.OSPF链路两端的网络类型不一致;

8.OSPF链路两端的MTU相关比较大,尤其注意和比较老的IOS实现互通时;

9.该网络根本就没有启动OSPF;

10.区域号不一致;链路的网络地址不一致,注意检查两边的mask;

11.ip unnumbered的地址借用接口一般也要注意对端也需要配置为ip unnumbered;

OSPF的排错不是几句话就能写的很全的,建议参考专门的Troub leshooting OSPF,Cisco Networket 2004的最新文档在http://tech.huawei-3com.com/article.php/162.

9.有什么好的办法知道OSPF也了什么问题

A:其实很简单,也是必须知道的,调试开关是需要打开的,其中最有效,最常用的就是debugging ospf event(IOS对应命令为debug ip ospf event)!它能让你对OSPF的大部分问题看的一目了然.当然它也不是万能的,它是在正确接收OSPF报文的基础上才能有相应的错误事件.如果没有看到任何动静,建议打开OSPF的所有报文调试开关,看看报文的收发是否正常.

10.我配置了Frame Relay或X.25,为什么OSPF不能形成邻居呀?

A:这个是大家经常犯的错误,甚至对于一些比较熟悉OSPF的工程师而言.请注意,一般来说,在跑Frame Relay,

X.25,ATM等封装类型的链路上,OSPF缺省的网络类型是NBMA的,这时候要注意两个事情:一是别忘记在OSPF配置模式下配置OSPF邻居;二是别忘记了在映射IP地址时候别忘记加入broadcast选项,以便让广播或组播报文正常收发.

11.OSPF如何自动计算接口cost的?

A:VRP和IOS一样,当链路接口没有明确配置OSPF cost的时候,cost按配置的基值除以接口带宽来计算.这个基值缺省为100M,例如10M的链路,cost缺省是100/10=10.显然当运行OSPF的路由器存在多个速率不同的1000M以上的高速接口时候,如果接口没有明确赋予OSPF cost,按缺省公式自动计算的cost将都为1,不能反映链路速率.这个时候IOS是有一个auto-cost reference-bandwidth的命令,来调节基准值的,但要注意,整个OSPF路由域都要对应调整.因此,最好的方法,还是在网络做好规划,手工对链路接口的cost赋值.

需要注意的是VRP规定,对于链路速率小于等于2K的,按2K计算;大于等于100M的,按100M计算.而对于loopback口,由于是虚拟的接口,VRP在某些版本(比如新的AR46)上cost缺省和IOS一样是1,更多的版本(比如老的NE系列)是1562,我记得很早前我就反馈过应该设置为1.而且对于100/10M自适应的以太网接口,在VRP3.3下,100M端口cost是1,但是如果将强制为10M(Speed 10),cost还是1,天啦,世界真奇妙.

12.OSPF的收敛速度到底是多少?如何能调整加快收敛?

A:大家都说OSPF快速收敛,但具体要给个数据,却一时找很多人要都没有给出,只能重新测试.按Spirent标准的OSPF Route Reconvergence测试方法,在为FT提供的数据,两个小组的测试数据比较接近.当网络拓扑规模为20个结点,100条路由的情况下,用Agilent的Router tester在spf-schedule-interval为1s时候,收敛速度为2140.9ms;spf-schedule-interval为10s时候,收敛速度为7108.4ms.这个网络规模比较小数据仅供参考.

事实上,对OSPF来说网络变化影响路由收敛主要由如下几个因素组成:1.侦测对端链路down,邻居失效;2.新的LSA产生并Flooding;3.LSDB同步更新,重新进行SPF计算新路由重新下发到FIB.个人认为在标准的OSPF Route Reconvergence测试方法中,如果STU是单个设备的话就会忽略了1,2的时间测试,收敛时间并不是非常准确.

为了加快OSPF的收敛速度,VRP3.0可调整的选项比较少:1.邻居的hello和dead间隔时间;2.spf-schedule-interval(缺省5秒),缩短两次SPF算法运行的间隔时间;3.减少接口下配置ospf trans-delay,加快LSA的flooding速度.IOS提供了相对丰富的多的微调选项,尤其是i_SPF算法,能较大的改进收敛速度.

13.OSPF的点到NBMA网络类型,一定要求是Full mesh的吗?

A:可能受一些培训资料的影响,比如广为流传的李劲松OSPF讲座,大家都认为OSPF的NBMA网络类型从L3的角度看来必须是Full Mesh直接可达的,否则就不可以配置成NBMA.事实上不是如此,只要保证你的DR,BDR和所有邻居L3直接可达就行了.虽然DR选举并不确定,但你可以通过设置其它路由器的优先级为0来取消它的选举权.但从健壮性的角度看来,我们建议,当你打算配置OSPF NBMA网络的时候,还是在Full Mesh的条件下配置.

14.OSPF的P2P网络类型,一定要求两端的IP地址在同一网段吗?

A:很多人都认为,只有地址借用的P2P是不用检查是滞在同一网段的.实际上VRP的实现中,在OSPF P2P网络类型的前提下,如果链路层协议封装为PPP,配置不同的网段地址,是可以形成Full并正确路由的;但如果链路层协议封装为HDLC或其它协议,则不能形成邻居 ,差别在于,PPP可以协商到对端的IP地址,不用额外的操作出有对端的路由.顺便说一句的是,OSPF广播网络,NBMAP2MP等其它网络类型,是要求严格检查邻居的IP地址是否和自己接收接口在同一网段的.

15.OSPF链路两端配置不同的网络类型,能否形成Full关系?

A:看起来很奇怪的问题,其实比较有意思.很多人的第一感觉就是:两端的了链路网络类型都不一样,哪能形成邻居关系呢?其实不然.OSPF协议并没有规定,要去严格检查链路的网络类型,链路的网络类型最重要的描述也是在type 1 LSA中,形成邻居的关系条件检查并没有去检查它.仔细阅读协议并做实验,你会发现不少情况下,比如两台路由器以太网连接,一端保持缺省的广播网络类型, 一端配置成OSPF P2P网络类型,肯定是可以形成邻居,并交换LSDB达到Full状态的.但很奇怪的事情是:到达Full状态了,为什么学不到路由呢?其实答案很简单,OSPF路由器需要LSDB来构建SPT(Shortest Path Tree),由于LSDB的数据库是脱节有问题的(在我的Router LSA中,我认为你是个广播邻居;而在你的ROuter LSA中认为我应该是P2P邻居),根本无法构建正确的SPT,SPF算法也无法计算出正确的路由.

16.OSPF的type 5的外部路由中的Forwarding Address有什么用?是如何填写的?

A:和RIPv2,EIGRP,BGPv4等其它比较"聪明"的路由协议一样,OSPF type 5 LSA中的Forwarding Addres(以下简称FA)的作用是通告本路由域内部路由器如何能到达Type5 LSA描述的引入的AS外部网络的更快捷的下一跳,以免内部路由器在广播网络上以自己为下一跳路由到自己,自己再转发到同一广播网络上的外部路由域的路由器上,而产生"额外"的一跳.

ASBR引入外部路由产生的Type 5 LSA中,FA可能是0,也可能是非0的.

很遗憾,RFC2328并没有明确规定FA如何填写,这个也是很多人不熟悉的地方.VRP3.0的实现是很早前在我的建议下参考Cisco IOS的实现修改大致类似的.

规则如下:

如果ASBR引入路由,但OSPF没有在这些路由的下一跳接口上启动(Enable),FA设置为0.0.0.0.

而在满足如下所有条件的情况下FA设置为非0.0.0.0:

1.OSPF在ASBR的下一跳接口被启动;

2.ASBR的下一跳接口没有被设置为被动接口(大家都知道VRP叫Silent interface,IOS就passive了)

3.ASBR的下一跳接口不是OSPF P2P或P2MP类型的;

4.ASBR的下一跳接口地址落在OSPF协议配置的network命令范围内,除此之外,其它情况FA都填为0.0.0.0

必须一提的是:在RFC 2328,section 16.4(Calculating AS external routes)中说明:"If the forwarding address is non?zero,look up the forwarding address in the routing table.The matching routing table entry must specify an intra?area or inter?area path;if no such path exists,do nothing with the LSA and consider the next in the list."

很早期的VRP是有问题的,我建议过修改.如果没有太多的改变的话,目前的实现依然没有完全检查是否有"intra?area or inter?area path",而是检查是否有OSPF路由(包括了OSPF ASE路由).

关于OSPF FA,建议阅读tech网站上提供的:The Effects of the FOrwarding Address on Type 5 LSA Path Selection 及Common ROuting Problem with OSPF Forwarding Address.

17.OSPF路由聚合是否可以跨区域聚合?

A:先看一个网上问题,简单示意的OSPF网络拓扑,area 1---area 0---area 1中三条路由:10.1.0.0/16,10.2.0.0/16,10.3.0.0/16,在area1和area0之间的ABR没有配置聚合(将上述三条聚合成10.0.0.0/8),但在area0和area2之间的ABR配置聚合却不生效.这就是跨区域的聚合问题,这个表现是否正确呢?

仔细看一下RFC 2328 12.4.3 Summary-LSAs中的描述,我们可以知道ABR产生type 3 LSA时,如果是inter-area,就直接处理,产生相应的type 3 LSA,而不需要考虑配置的range,而在考虑intra-area路由的时候,才要去考虑配置的聚合.!

所以,这个网上问题是用户的理解问题,不应该是问题.即使能这样聚合,这样做的结果是更多的LSA传到骨干区域,为网络的不稳定带来隐患.

18.为什么我的路由在cost比较小的情况下没有优先通过Backbone的?

A:一般资料上都没有提到按RFC 2328实现的OSPF必须有个"RFC1583Compatibility"的选项(不过很遗憾,VRP3.0没有这个配置选项,让人怀疑是否是按RFC 2328实现的).RFC 2328规定,如果"RFC1583Compatibility"是disable的话,路由如果可以经过普通区域和骨干区域同时学习到,而且总的开销相同,是会优先普通区域的.主要的考虑也是为了减轻骨干区的压力.这是个很细节的地方.

19.我可以在以太网上配置OSPF网络类型为P2P或NBMA等类型吗?

A:可以的.但除非你有必要并且清楚修改缺省网络类型的后果,不要轻易去改它.初学者可以会认为OSPF中的广播网络,点对点等网络类型.必须是链路层对应也是广播或点对点的.实际上那只是个参考模型而已,与物理介质和链路层协议无关.

20.OSPF网络规划时,一个区域到底最好是支持多少个路由器?

A:很多文档,包括RFC 2328作者J.moy本人在其大作<<OSPF:Anatomy of an Internet Routing Protocol>>中都建议,最好每个区域不要多于50个路由器.其实我们可以看下,那些文档和这本书是在90年代成文的.那时候路由器CPU处理速度,内存大小都与当今主流的设备能力不可同日而语.测试表明,200台路由器一个区域都可以非常快速的收敛.

个人认为,50台路由器的经验值应该修改了.否则OSPF vs. IS-IS的争论中,OSPF单区域只能支持相对少的路由器数目会成为受攻击的弱点.

21.我配置了区域需要MD5认证,是否本区域的每条链路都要配置认证?

A:很遗憾,VRP3.0目前是这么要求的,你必须保证该区域的所有链路都配置MD5认证.而IOS早在12.08就支持每接口认证了.

22.OSPF如何过滤接收的路由呀?

A:首先要清楚OSPF是基本链路状态的路由协议,与D-V算法的路由协议不一样,它为了保证拓扑关系的一致性---这也是OSPF路由无环路的重要条件,没有那么轻易能过滤路由并不扩散.不过你可以在OSPF的配置下,利用distribute-list in来过滤路由.但要注意的是:千万不要以为你的OSPF数据库中没有该路由的LSA记录,实际上OSPF进程是算出了该路由,只是路由管理未将其加入到路由表中;还有很重要的一点是该路由对应的LSA依然会扩散,也就是说它的邻居路由器还是会有这条路由的.值得注意的是distribute-list out只能在引入发布配置的外部路由时过滤用.

IOS有:neighbor database-filter的命令,它不过是在冗余连接的情况下限制从某个接口向邻居发送,过滤掉产生的重复多余的LSAs,减少协议报文流量对网络的影响和路由器对协议报文的处理.类似IS-IS的mesh-group的处理.

OSPF还有一个新的特性,OSPF ABR Type 3 LSA过滤,该特性将ABR的能力扩展,使其能在OSPF区域间发布Type 3 LSAs的时候进行过滤.本特性可以限制仅允许满足某些前缀的报文从一个区域发送到另一个区域,这种类型的区域路由过滤可以应用到某个特定区域,对入区域,出区域或两者同时都可以进行控制.可惜VRP3.0是没有实现.

23.OSPF如何将一个区域的某条路由隐藏起来,不发布到其它区域?

A:这个问题,很多人都想当然以人用过滤列表就可以解决问题.事实上,当你知道OSPF如何过滤路由的话,你就知道不可能的.一个小把戏是,你在这个区域的ABR上配置路由聚合,聚合范围不变,比如10.1.0.0/16这个网段的路由,依然聚合成10.1.0.0/16,关键的是,聚合的语句后面有个no-advertise选项,它将帮助你不发布到骨干区,更不会发布到另外的区域去了.还有一个笨方法就是,在禁止发布的区域每个路由器用过滤列表禁止该路由加入到路由表中去.

如果你关注OSPF的新发展特性的话,你可能会知道有一个OSPF ABR Type 3 LSA过滤特性将ABR的能力扩展,使其能在OSPF区域间发布Type 3LSAs的时候进行过滤.本特性可以限制仅允许满足某些前缀的报文从一个区域发送到另一个区域,这种类型的区域路由过滤可以应用到某个特定区域,对入区域,出区域或两者同时都可以进行控制.

24.我在接口上配置了主从IP地址,OSPF是否可以以从地址建立OSPF邻居关系?

A:很遗憾,由于实现复杂度的关系,OSPF不允许以从地址建立OSPF邻居关系,而只能以接口的主地址建立邻接关系.其实其它一些协议也是如此实现的.但如果你将从地址接口的网络加入到了OSPF的配置中,它肯定是可以发布相应的路由的.需要注意的是,主从地址可以是可以配置在同一网段中.

25.OSPF的Virtual link是否很有用处?

A:从协议的角度上来看,OSPF的虚连接Virtual Link非常有用,一是可以将不与骨干区域直接物理连接的区域连接起来,让它能正常路由,这在一些网络的合并中比较有用;二是可以提高网络的可靠性,让骨干区不至于轻易断开而不能正常路由(RFC 2328中的例子)

但坦白的话,实际的应用中虚连拉缺很少用到,我的记忆中华为VRP的OSPF协议在网络中大量应用,但几乎没有网络用到V-Link.原因很简单:一般来说,网络的规划比较合理,不会让一些区域与骨干区域断开物理连接,在国内网络合并而不重新全部规划的情况也非常少;二是大家也经常不会想用V-link来增加骨干区域的健壮性.

无论如何,作为OSPF的一个重要特性,对OSPF虚链路,你都应该了解.

26.为什么两个路由器背对背一条链路连接,我将接口shut down了,查看链路状态数据库,对端原来的LSA还在?

A:为什么不在呢?OSPF规定,只有LSA的始发者才能Flooding掉自己发布的LSA,唯一的通路都Down了,LSA的FLooding自然不能更新过来了,但我自己产生的Router LSA会更新描述新的链路状态,即使你这条LSA在我的数据库中,都不会参与SPF计算,会随着时候老化.

27.OSPF的Virtual Link上MD5验证的配置为什么总是不通?

A:对于VRP3.0来说,这也是一个比较常见的问题.事实上假设OSPF的V-link是在区域2,你不能只在V-link配置的时候配置MD5认证,你首先要使能区域2的MD5认证.

28.如果配置Virtual link的cost,需要注意什么?

A:需要注意,这个Cost是不能超过RFC规定的最大值65535的,否则不能建立V-link.

29.OSPF常用的LSA type怎么没有看到类型6呢?是否还有其它类型的?

A:Type 1 LSA:Router LSA; Type 2 LSA: network LSA; Type 3 summary LSA; Type 4 LSA: asbr-summary LSA; Type 5 LSA:AS external-LSA; Type 7 NSSA AS-external-LSA的定义大家可能都比较熟悉了,这里没有必要介绍.

原来的OSPF报文编码不是基于TLV的,要扩展OSPF的功能只能扩展其LSA类型了.

其实type 6 LSA为Group-membership-LSA,是在MOSPF中用于标识组播组成员用的,可惜MOSPF基本被淘汰.Type 8 LSA为external-attributes-LSA,用做将BGP路由引入到OSPF中互操作,保留BGP的AS路径等信息,遗憾的是完全实现的非常少,VRP,IOS都不支持.

值得一提的是RFC 2370中定义了重要的LSA类型:Opaque LSA,将OSPF的能力进一步提升,允许采用类似TLV的结构.OSPF流量工程等应用就是基于Oqaque LSA扩展能力的.其中 LSA Type 9为只在本链路范围扩散的Qpaque LSA;LSA Type 10为只在本区域范围扩散的Qpaque LSA;LSA Type 11为类似Type 5 LSA在本AS范围内扩散的Opaaque LSA.

30.在一个Stub区域,有两个ABR,它们产生的缺省路由,不会让它们互相指向,形成路由环路吗?

A:不会形成环路的.当一个STUB区域中的ABR接收到同一区域ABR发出的默认路由LSA的时候,它只会将其放到LSA Database里,而不会计算出路由,这样就避免了两个ABR缺省路由相互指向形成环路.这其实也是VRP OSPF一个血的教训修改的结果.

31.在一个NSSA区域,有两个ABR,它们都会将Type 7 LSA转换成Type 5 LSA吗?

A:不会的.按RFC 1587:OSPF NSSA Option的规定,在NSSA区域有多个ABR时,只有最大的Router ID的ABR将Type 7 LSA负责转换成为Type 5 LSA.

32.当一条路由既有Type 5路由又有Type 7的时候,我们优先哪个?

A:OSPF路由的优先级从高到低的次序是:Intra-Area>Inter-Area>Type 5 AS-External>Type 7 AS-External.在这种情况下,应该优先的是Type 5路由.注意,对代表同一子网的路由来说,首先比较的是路由优先级才是总的cost.

33.OSPF DD报文中的Interface MTU是否有用?两端是滞一致才能形成Full?

A:在RFC 2328中对DD报文的Interface MTU规定是要本链路的MTU大小的(V-link只好填为0),而且要求如果收到对方的DD报文中的Interface MTU大于本端的,这个DD报文就要被丢弃,那么邻居状态就会停留在"Exchange Start"下.

事实上以前的IOS实现确实检查比较严格,VRP与其互操作会遇到问题.各主要厂商也意识到这个问题,在IOS后续的版本在接口下增加了ip ospf ignor mtu的命令,忽略对Interface MTU的检查,这样并不需要两端链路配置的MTU完全一致,也可以正常达到Full状态,完成数据库同步.当然要注意,两端的MTU不能相关太悬殊.和IS-IS的hello padding要求达到链路MTU-1可以抑制样,这也是协议追求完美和现实应用的妥协.

34.OSPF LSA中的TOS字段做什么用的?

A:本来的意思是希望做Qos Routing用的,简单的说就是对于不同的IOS值,链路可以配置不同的Cost,以实现基于TOS的路由,即目的网络相同但不同TOS值的IP报文做不同的路由.但在RFC 2328中取消了这个应用,只支持TOS 0,也就是只基于目的IP地址的路由.

  但值得注意的是,从Cisco Networker 2003开始,到Networker 2004出现专门的MultiToploogy Routing专题.很明显的,由于Qos这几年的兴起,Cisco IOS也再考虑重新利用TOS字段,来做Qos Routing.感兴趣的同事可以看下该文档.

35.是否有什么比较好的OSPF模拟程序可以用于OSPF的测试和细节学习?

A:你可能会想到测试仪器,比如Spirent的SmartBits,AX4000;Agilent的Router Tester不错,它们确实都有OSPF的模拟程序,但我想他们不是设计用来细致的测试和学习OSPF的,做性能测试的模拟比较好用,而且设备昂贵,不是随手可得到.我认为在华为,最好还是几年前我让宋新娟写的OSPF Tester程序(集成在某个版本的测试平台VTP中).它可以非常细致的模拟OSPF的所有的状态,协议报文中的字段可以任意填写,几乎可以用来测试OSPF的每个细节.虽然程序有些瑕疵,我还是诚意推荐.有人抱怨OSPF Tester比较难用,其实可能是对OSPF的细节并不非常精通,也并没有足够的诚意和好奇心来深入了解OSPF.在我看来,深入测试和了解OSPF,这个测试程序基本没有什么多余的.

此外,较常见的也有OSPF RFC 2328作者J.moy写的OSPFD程序,但我没用过.大家可以试下.Linux下也有一些OSPF的模拟程序可以使用.

36.在MPLS/BGP VPN环境中,PE-CE之间路由协议用OSPF,站点的区域号编码有什么限制吗?

A:如果按IOS的实现方式,一个起码的要求是,如果某个站点(site)的OSPF有区域0骨干区)的话,必须保证PE-CE之间的链路也属于区域0.这是由于在MPLS/BGP VPN环境中,实际上OSPF将MPLS区域当作了一个super backbone来处理.VRP也是如此.

37.什么是OSPF sham-link,有什么用?

A:在MPLS PN配置的时候,OSPF经常用来作为PE-CE中间的路由协议,以通过MPLS骨干网络连接VPN内的各站点.虽然OSPF PE-CE之间的连接保证了VPN站点间的连通性,但VPN站点间的Backdoor后门链路也应该考虑.如果两个站点属于同一个site,那么经过后门链路的路径总是会被优先选择,因为按OSPF协议规定,Intra-Area的路径是优于Inter-area路径.因此,必须考虑存在后门链路时,能通过策略来控制路由.

如果后门链路只是用来作为备份使用而不参与VPN业务提供服务,缺省的处理流程将不可接受.为了重新通过MPLS VPN骨干区建立站点间的连接,必须在相关PE路由器的入口和出口VRF间建立逻辑的Intra-area链路.本特性提供一种解决方案,在两个站点间建立一个假OSPF链路:Sham-Link,作为Intra-area通道,以使得两个站点间的之间的通讯通过MPLS骨干区域,而后门链路作为备份使用.如果两个站点间不存在后门链路,没有必要使用Sham-Link.

38.OSPF有什么非常好的书和文档可以深入学习?

A:我认为入门的话,听一次精彩的OSPF培训是个很好的方法,对于小文档,最精彩的应该是Cisco的OSPF Database Explanation Guide,再深入点的入门,也就是Jeff Doyle先生大作Routing TCP/IP Volume 1中的OSPF部分了.但如果你要测试或开发OSPF,很好的参考书有如下:

1.RFC 2328:OSPF v2

当然,你希望自己是个专业的一流的工程师,作为OSPF v2标准的RFC 2328是必须打印下来仔细读几遍,然后放在案头,随时备查的.

2.OSPF协议剖析(OSPF:Anotomy of an internet Routing Protocol)John T. Moy

本书是OSPF协议RFC的作者John T. Moy的力作,包括了OSPF的起源,现状以及未来发展,对OSPF协议的来龙去脉和原理有一个很清晰的阐述.如果想了解OSPF的一种实现和使用OSPF的仿真程序.请看本书的姊妹篇<<OSPF协议完全实现>>.本书2002年8月由电力出版社出中文版.我记得我拿到本书的时候,是晚上10点看到凌晨4,5点看完的.

3.OSPF网络设计解决方案(第二版)

本书全面讲述OSPF网络的设计,配置,管理和疑难解析.全书分为三个部分:第一部分讲述OSPF基本原理,内容包括网络和路由选择基本原理,OSPF简介,OSPF通信:第二部分讲述OSPF路由选择和网络设计,内容包括设计基本原理,路由选择的概念和配置,重发布,汇总;第三部分讲述OSPF的实现,疑难解析及管理,内容包括管理和保护OSPF网络,OSPF疑难解析,OSPF网络中的BGP和MPLS.本书最后的附录部分还提供了关于OSPF的RFC文档资料.

4.Cisco OSPF命令与配置手册

本书是一本简洁而完整的OSPF命令手册.书中提供了很多示例场景,演示了可在由最少数量的路由器组成的网络环境中实施的每条OSPF命令的正确用法.我一直认为并强调,在华为你所接触到的Internet核心协议技术,Cisco IOS对应的配置手册和命令行手册,你必须精读.以上基本是按RFC228 OSPF v2的介绍,如果你想了解OSPF的诸多新的进展的话,请阅读<<OSPF新特性指南 v1.1>>,文档URL在:http://tech.huawei-3com.com/article.php/838.

不要指望很短的时间内,就真的精通OSPF,在平时的工作中多磨练,多利用前人的经验和总结,你会发现:

OSPF is like a box of chocolate,you'd never know what you are going to get......

39.i-SPF是个什么东西,有什么用?

A:所谓的i-SPF就是Incremental-SPF,增量SPF算法,是在原来的普通SPF算法改进以空间换时间,以达到加快SPF的计算速度,提高OSPF及IS-IS的收敛速度的目的.核心思想在于当路由变化时判断其对SPF树的影响,对于不涉及SPF树的变化则不需要计算,对于叶结点的增加和删除也可以实现增量计算但有时如一个down掉的链路并不在SPT上时,并不需要重新计算SPF.可以通过在SPT上保存更多的信息如:父亲列表,邻居列表来实现,基于这些增强的信息和变化,SPF再来计算反映变化.VRP3.0未实现,V5和IOS较新的版本都支持.

40.OSPF从1998年发布新的v2标准RFC 2328以来,有哪些新特性和发展?

A:其实OSPF不是没有发展变化.从基本的RFC 2328到现在,IOS针对网络应用发布了很多新的特性,我认为,如果你希望自己是个OSPF真正的专家,这些都是应该了解的.很幸运的是我曾经整理了<<OSPF新特性指南v1.1>>,文档URL在:http://tech.huawei-3com.com/article.php/838.

文档分析了Cisco IOS最新版本IOS 12.3T和12.0S(截止2004-10-28为IOS 12.3(11)T,12.0(29)S)版本做的一些OSPF的新特性,尤其侧重于目前VRP3.0没有实现的特性,可以作为公司同事与时倶进了解OSPF新进展和模块发展规划的参考.其中的某些特性应该在VRP5上已经实现.大家可以继续关注OSPF更多的新的应用和发展,比如OSPF对MTR的支持等(可以参考Cisco Networket 2004中的相关文档).

41.OSPF vs. IS-IS到底谁更好?

A:两年前IS-IS开始在中国大行其道时候很多人问的一个问题.中国电信的技术总结中也多次提到过它.事实上,专门讨论这个问题的文档不少的,最好的可能算Dave Katz,Juniper Networks 写的IS-IS and OSPF:A Compara-vive anatomy了.不过最后的结论是:They' reboth good protocols.Use the one that makes the most sense to you.

用句很俗的话,OSPF和IS-IS各有优缺点,而且非常近似,如何选择可能确实是个人喜好了.IS-IS的配置不容易出错,比较少耗资源,能支撑更大的网络应该是不争的事实了.

42.是否还有其它比较好的OSPF FAQ?

A:当然.本文确切的说应该是OSPF FAQ for Huawei,列出在华为的工程师经常询问的OSPF问题,解答出带有较强的个人观点.

Cisco的文档一向写的很好很全.我做新员工的时候就看过Cisco OSPF FAQ,现在已经上载到我们的内部技术网站,但要注意Cisco可能会更新这个文档.URL在:http://tech.huawei-3com.com/article.php/1053.文章中大致有23个FAQ.不过相信本文不逊色Cisco对应的这个文档的.建议大家都阅读下.

不得不提的是,受人尊敬的J. Moy先生在他的大作OSPF Anatomy of an Internet Routing Protocol(中文版本 OSPF协议剖析)中,Chapter 8 OSPF FAQ中也总结了早期IETF OSPF mail-list中常见的一些问题.

此外,对于MPLS/BGP VPN环境下,PE-CE用OSPF做路由协议,VRP团队也有一个案例集OSPF VPN配置异常案例集可以当做FAQ.URL在:http://tech.huawei-3com.com/article.php/861.

OSPF中的最短路径算法

Dijkstra算法介绍

在数学上,以某个节点为起点,计算到其他节点的最短路径的算法.称为"单源最短路径"算法.求"单源最短路径"的问题在数学上可以精确描述如下:

"单源最短路径"问题:已知一个有n个节点(V0..n)构成的有向连通图G=(V,E),以及图中边的权函数C(E),其中V代表节点集合,E表示所有边的集合,并假设所有权非负,求由G中指定节点V0到其他各个节点的最短路径.

Dijkstra算法是很经典的求解上述问题的算法,其基本想法是设计一种最短路径树的构造方法,按非降次序逐条构造从V0到各个节点的最短路径,第一步找到和V0相距最短的节点以及到这个节点的路径,第二步找到和V0相距次短的节点以及到这个节点的路径,如此反复,最后找到V0到所有节点的最短路径,构造出整棵最短路径树.

对上述构造方法的一个考虑是:和V0相距最短的节点应该在和V0直接相邻的节点中,和V0相距次短的节点要么在和V0直接相邻的节点中,要么在和这些相信节点相邻的节点中,如此逐步扩散考虑,应该就可以找到和V0相距最短,次短,......第n短的节点以及对应的路径,而且因为是连通图,最后肯定所有节点都能全部考虑到,也就能完成整棵最短路径树的构造.

事实上,上述考虑是对的,Dijkstra算法是对上述过程的一个提炼和优化;和V0相距最短的节点是和V0直接相连的节点没错;相距次短的节点范围可以缩小为.和V0直接相邻的节点,加上跟刚选中的最短节点直接相邻的节点;相距第三短的节点的范围可以类推得到,即在上一步考察的节点的基础上,加上和次短节点直接相邻的节点.如此逐步构造,可以按非降次序找到到所有节点的最短路径.

为了从数学上精确描述上述构造过程,引入了集合的概念对节点和路径进行分类.

我们把节点分成两个集合:

A:已经选入最短路径树的节点的集合.

B:剩余的其他节点的信息.

对于路径,我们分成三个集合:

I:已经迁入最短路径树的路径的集合.

II:候选路径集合:下一条加入最短路径树的路径将从这个集合中选入.

III:剩余的其他路径的集合(被废弃的路径或者还未考虑的路径).

为了更好的理解,有必要对这里的路径定义进行一下强调:路径是指以V0为起点,其他节点为终点的由一条或多条边组成的一个有序集.边,可以理解为路径中的一段,只有到和V0直接相邻的节点的路径才直接对应一条边.从V0到所有节点,都可能存在一条或多条路径,非最短路径在计算过程中将会被废弃,放入集合III.

从前面的描述中可以明显看出,Dijkstra算法是一个递归构造过程,因为任何递归都必须有明确的初始状态,所以我们有必要先得到上述Dijkstra算法中定义的集合的初始值:

以V0为起点计算最短路径的话,初始状态时显然有且只有V0在集合A中,所以集合A的初始值为V0.集合B的初始值为剩余节点.

前面提到过,下一个加入集合A的节点,一定是和V0直接有边相连的节点,因此,加入最短路径树的第一条路径也必然在这些和V0直接相连的边所代表的路径中产生,所以集合II的初始值就是和V0直接相连的边构成的路径.另外,初始状态最短路径树为空,所以集合I的初始值为空.集合I,II明确了的话,集合III自然明确.

下面我们开始展开递归构造最短路径树的过程:

第一步:从集合II中选择一条最短的路径,放入最短路径树,相应的,这条路径的终点对应的节点(这里记为X)应该人集合B移入集合A.

第二步:考察所有从X出发的边的终点,考虑其中不属于集合A的节点,这里记为Y,计算从V0出发经X到达Y的路径值,计算方法为:最短路径树中V0到节点X的路径值加上(X,Y)这条边的值.为了描述方便,我们把从V0出发经X到达Y的路径记为(V0X)Y.接着考察集合II中的候选路径,如果其中没有到节点Y的路径,则直接把路径(VOX)Y作为候选路径加入集合II;如果集合II中已经有到节点Y的路径,则进行比较,如果这条路径值小于或等于路径(VOX)Y的路径值,那么路径(V0X)Y作为被废弃的路径放入集合III,否则原集合II中到Y的路径被废弃放入集合II,(VOX)Y作为候选路径放入集合II.对于Y节点有多个的情况,按第二步的方法一个一个的计算和比较.

重复第一步和第二步,直到集合II和集合B为空.第二步事实上是对候选路径的一个重新计算过程,因为在集合A中引入了新的节点后,考察的范围变大了,很可能在原来节点范围内认为到某个节点的最短路径已经不再是最短路径了,这时候,需要根据第二步的方法进行调整.

为了让大家更好的理解这一构造过程,这里举一个较为典型的例子,如下是一个有向图:

OSPF 详解 (1)

计算这个有向连通图的最短路径树的过程如下:

OSPF 详解 (1)

OSPF 详解 (1)

Dijkstra算法的证明

对Dijkstra算法进行证明,实际上就是要证明其构造过程构造的树一定是最短路径树.为了给出证明,我们先分析一下构造过程.分析构造过程的第二步,可以得出结论一.

结论一:对一个还没有选入集合A的节点Y,其候选路径是所有从V0出发,中途只经过集合A听节点到达Y的路径中路径值最小的.

这个结论根据第二步候选路径的构造过程,很容易得出:因为在第一次构造到Y的候选路径时,从V0出发经刚加入集合A的节点到Y的路径,是被直接放入候选路径集合中的,这说明第一次构造的到Y的候选路径满足条件"从V0出发,中途只经过集合A中的节点".另外,集合A中每加入一个新节点,都会考虑从V0出发经过这个新节点到达Y的路径,并和原候选路径比较,选择两者中较小的那个,这种过程一直持续到Y被选入集合A中为止.这个过程显然保证了Y的候选路径一直保持了特性"从V0出发,中途只经过集合A中的节点",而且因为遍历了所有A中的节点,所以是所有这种特性路径中最短的.

有了结论一,证明Dijkstra算法可以弱化为证明结论二.

结论二:假设构造过程中下一步将选择的是节点Y,那么这时到达Y的最短路径必然是从V0出发,中途只经过集合A中的节点到达Y的路径.

如果"结论二"成立的话,结合"结论一",说明Y的最短路径和候选路径相同的属性"从V0出发,只经过集合A中的节点",而"结论一"中明确说明,候选路径是这种属性的路径中的最小者,所以对于下一步即将选入集合A中的节点Y,其最短路径值就是候选路径,也即证明了算法中构造最短路径树过程的正确性.

下面我们证明"结论二".

证明很简单,使用反证法:假设到达Y的最短路径中途不只经过集合A,那么必然经过一个不在集合A中的节点W,于是这条路径中肯定包含一条从V0到W的路径,这条路径显然比从V0出发经过W到Y的路径更短,而Y是下一步要放入集合A中的节点,根据我们按非降次序构造最短路径树的过程(第一条最短,第二条次短...),从V0出发到W的这条路径应该已经在最短路径树中了,也即节点W应该已经在集合A中,矛盾,得证.

OSPF协议中对Dijkstra算法的使用

从理论上来说,只要描述清楚了节点之间的连接和边的属性,就描述清楚了有向图,也就可以使用Dijkstra算法计算出最短路径树.

对于使用基于Dijkstra算法的路由协议来说,如果能描述清楚整个网络拓扑(对应有向图),并让区域内的每台路由器都清楚的知道整个区域的网络拓扑,则每台路由器都可以独立的计算出最短路径树.从这个意义上说,对于一个使用Dijkstra算法的路由协议来说,需要解决以下问题:

网络拓扑的描述问题.

网络拓扑描述信息的传播问题.

效率问题:路由协议的目的是在耗费最少资源的情况下,在最短时间内动态发现到其他网段的最优路径.

另外,还需要考虑路由协议的网络应用位置(IGP或者EGP,适合于多大网络等)以及和其他路由协议的互操作等问题.

以上几个问题有一定的关联性,互相影响.例如,网络拓扑描述的优化可以减少描述信息,从而减轻传播和计算过程的消耗,提高了效率.本文的着力点是Dijkstra算法及其在OSPF中的应用,所以这里说明与之相关的网络拓扑的描述和最短路径计算两个内容,网络拓扑的描述也只涉及的几类基本LSA.

OSPF对网络拓扑的描述

OSPF中使用链路状态通过(LSA)来描述网络拓扑(即有向图)

OSPF中,Router LSA被用来描述路由器(节点)之间的连接和链路(边)的属性,具备了理论上计算最短路径的可能.但是仅仅是理论而已,从实践的角度,针对特殊的网络情况和应用场景,需要作一些优化工作.

先考虑一个有n个节点的广播网,如果使用Router LSA来描述的话,需要描述n个节点两两相连的n(n-1)/2条链路,而且n个节点间需要建立n(n-1)/2个邻接关系,描述信息需要在这些建立了邻接关系的节点间传播.如果换一种思路,我们把这个广播网虚构成一个伪节点,其他n个节点均和伪节点相连,那么就只要描述n条链路,n个节点只需要和伪节点建立总共n个邻接关系即可,能大大减少了信息描述量和信息传播量.依据这种想法,OSPF中针对广播网的描述进行了优化,使用指定路由器DR来承担这个伪节点的角色,并使用Network LSA来描述广播网DR和各个路由器的连接情况.

对于NBMA网络的描述,处理方式和广播网基本相同.

其次,OSPF的设计目标是为一个较大的内部网络提供动态路由能力.如果内部网络较大的话,需要描述的链路会很多,存储,传播和计算这些链路信息将耗费大量内存和CPU资源.OSPF解决这个问题的办法是把较大的网络划分成多个Area,每个Area内部使用Router LSA和Network LSA把Area内部网络拓扑描述清楚,并据此使用Dijkstra算法计算出来Area内的最短路径树和路由.至于Area外的网络拓扑,区域边界路由器ABR并不把相邻Area的Router LSA和Network LSA传入本Area,而是把自己在Area范围内计算得到的该Area内各个网段的路由进行汇总,把这些网段当做直接连接在自己上面,并生成Network Summary LSA来对这些网段进行描述,传入本Area.这样,对于一个有n个网段和多台路由器的相邻Area,ABR只需要生成n条网络描述信息并传入本Area即可.大大减少了进入本Area的链路描述信息,减少了存储,传播和计算消耗.需要注意的是,划分area的做法导致了Area内部路由器中的链路状态数据库的Area外部分并不是真实的网络拓扑,从而计算时可能出现环路,为了避免环路出现,要求所有的Area之间的相连必须经过Backbone区域即Area 0.

另外,OSPF被设计为一个IGP,所以除了处理本自治系统内的路由外,还需要处理自治系统外的路由,这类路由在ASBR处引入,可以看做是直接连接在ASBR上,OSPF引入AS External LSA来描述这类自治系统外路由.另外,因为AS External LSA在传入其他Area时并不在ABR上重新生成,所以从计算的角度看,其他Area还必须知道自治系统外路由从哪个节点引入,所以需要引入ASBR Summary LSA来描述外部路由从哪个节点引入,ASBR Summary LSA在ABR上生成,从其他Area看,可以认为于ASBR直接连在ABR上,自治系统外部路由对应的网段又直接连在ASBR上.

OSPF中最短路径的计算

下面简单介绍一下OSPF的最短路径计算过程,具体的细节处理请参考RFC2328:

首先,计算Area内部路由.因为Router LSA和Network LSA精确的描述出了整个Area内部的网络拓扑,所以根据Dijkstra算法,可以计算出到各个节点(路由器)的最短路径.然后根据Router LSA描述与路由器相连的网段情况,就得到了到各个网段的最短路径.注意,计算过程中,如果有多条代价相同的最短路径,都保留.

其次,计算跨Area的路由.因为从一个Area内部看,相邻Area的路由对应的网段就好像是直接连在ABR上,而到ABR的最短路径已经在上一步算出,所以直接检查Nerwork Summary LSA,就可以很容易得到这些网段的最短路径值.另外,ASBR也被看作是直接连接在ABR上,所以到ASBR的最短路径也可在这一步计算出来.注意:在这一步,如果发起计算的路由器是ABR,那么很自然,应该只考虑骨干区域的Network Summary LSA;但是对于启用了Virtual Link的拓扑来说,跨Area的路由只是逻辑上通过骨干区域,而实际是通过Transit Area到达的,因为逻辑链路可能并不是物理上最优的,所以在连接到Transit Area的ABR上,考察骨干区域的Network Summary LSA得到的跨Area路由的路径可能不最优,还需要考察Transit Area的Network Summary LSA,以得到最短路径.

最后,计算AS外部路由,因为AS外部路由可以看做是直接连接在ASBR上,而到ASBR的最短路径在上一步已经计算出来,的以逐条检查AS External LSA就可以得到到各个外部网络的最短路径.

下一跳和出接口

路由表中还有两个重要元素:下一跳和出接口.因为确定这两个元素和计算过程有一定关系,这里也提一下.

其实,一个简单事实是,对于任何一条路径来说,其下一跳和出接口,必然和他的父路径的下一跳和出接口相同.因此,求所有路径的下一跳和出接口,最后可以归结为求到"和V0直接相连的节点"的下一跳和出接口.对于OSPF来说,因为使用DR模拟伪节点,所以"和V0直接相连的节点"是一台路由器或者是一个伪节点(即广播网,NBMA网络).

前面Dijkstra算法已经提到,求到各个节点或网段的最短路径的过程,是一个候选路径的构造和调整过程,在这个过程中,候选路径的父路径会进行多次调整,但其根都跳不出和"V0直接相连的节点"这一范围,因此其下一跳和出接口也在"和V0直接相连的节点"的下一跳和出接口范围内,在计算过程中继承即可.

确定"和V0直接相连的节点"的下一跳和出接口比较简单,这里不再赘述,想了解的话可以参考RFC2328的16.1.1节.

还有一类特殊的网段是发起OSPF计算的节点的直连网段,其下一跳和出接口的确定就更简单了,而且不会被其他路径继承.

OSPF Graceful Restart

关于Graceful Restart

简介

Graceful Restart简称GR,字面意义是平滑重起,主要实现的能力是在路由协议重起的时候保证数据转发的正常,以保证关键不中断.

GR技术是属于高可靠性(HA,High Availability)技术的一种.HA是一整套综合技术,主要包括冗余容错,链路保证,节点故障修复及流量工程.GR是一种冗余容错技术,目前已经被广泛的使用在主备切换和系统升级方面,以保证关键业务的不间断转发.目前VRP3.x并不支持GR,在VRP5.x中会提供支持.

GR的实现前提

随着网络设备普通采用了控制和转发分离的技术,GR技术就成为可能,在传统的路由器中控制和转发是由同一个处理器(RP Route Processor)完成的,这个处理器既通过路由协议发现并维护路由,同时也维护着路由表和转发表.为了提高设备的转发性能和可靠性,中高端设备普通采用了多RP的结构.负责路由协议等控制模块的处理器一般位于主控板,而负责数据转发的处理器则位于线卡上.这样在主处理器重起的时候才有可能不影响线卡上的数据转发.

基于上面的原因,目前实现GR的设备都需要有以下特征:双主控结构,并且线卡具有自己独立的处理器和内存等.

传统技术和GR技术的比较

在没有使用GR的时候,因为各种原因出现的主备切换,都会造成短时间的转发中断,并且在全网造成路由振荡.通过图1可以看到问题所在.

无GR能力的网络情况:切换阶段

OSPF 详解 (1)

如果R1是自治系统的ASBR,那么会通过BGP引入大量外部路由,当R1发生主备切换时,会造成下面的影响:

所有外部路由丢失,当R1恢复时,再次学到路由,造成网络路由振荡.

在R1的备份主控单元完成路由计算和发布之前,所有通过R1的数据转发中断.

R1的所有邻居需要重新进行路由计算,并改写转发表.

当R1恢复正常时,R1的所有邻居需要重新进行邻居协商和交互,并计算路由,改写转发表.

对于一个大型网络,尤其是运营商网络,对于这些路由振荡和业务中断是不可容忍的.

而使用GR技术则可以解决全部的问题.在R1与其它邻居建立邻接关系的时候,就会进行能力的协商.这样在R1进行切换的时候,它的邻居会维护邻接关系不变,并保持路由的稳定和正常的转发.除了R1的邻居,网络中的其它设备并不知道R1进行了协议的重起.

OSPF 详解 (1)

当然,如果R1在GR的过程中,网络拓扑发生了变化,那么可能会导致短暂的路由环路或路由黑洞.对于这个问题的处理方法,目前不同厂商的实现略有不同.与业务中断的危害相比较,是否可以忍受可能出现的,短暂的路由环路和路由黑洞,对这个问题的不同观点决定了在具体实现上的不同.

小节

实现GR的前提

GR特性仅适用于带双主控,线卡具有独立处理器的硬件平台

GR用于软件或硬件错误导致Active RP重起或Active RP失效;或者管理员的主备切换命令

GR解决的问题

减少单点故障,提高整网可靠性.

减少对重要业务的影响.

减少RP切换时路由震荡对全网的影响.

减少丢包:基本可以达到丢包率0%.无丢包.

OSPF Graceful Restart

GR对路由协议的要求

本文主要讨论OSPF中的GR技术.众所周知,OSPF是链路状态协议,邻居间需要维护链路状态信息库LSDB的同步,并根据LSDB计算路由.因此为了完成GR,对OSPF有下面的要求:

在GR的过程中,邻接状态不能改变,必须维护在FULL的状态.

GR的周期是可选的,默认情况下使用RouterDeadInterval.

在GR过程中,必须保持转发表FIB不变,可以做相关标记.

当某些原因导致GR中断时,需要进行标准的协议重起过程,重新进行邻接的建立.

需要对OSPF做相应的扩展以支持GR特性.

GR中的角色

从前面的介绍中可以看出,对于OSPF而言,一个完整的GR过程,需要至少2个设备完成,而这两个设备可以具有相同或者不同的能力.因此,根据能力划分:

GR Capable路由器

有GR功能的路由器:通常配备双RP,能在RP切换的时候,通告周边邻居,保持自己的转发表,切换后重建路由表.

GR Aware路由器

GR感知路由器:能懂得GR路由器的信令,配合在GR路由器重起期间保持邻接关系和通过GR路由器的转发表项.GR Aware设备只需要识别GR信令,因此可能不具备有双RP,不能进行GR.但它可以配合有GR能力的设备来完成GR过程.毫无疑问,有GR能力的设备当然是GR感知的设备.

GR Unaware路由器

不能感知GR的路由器:不懂GR信令,不能协助GR路由器在RP切换时不间断转发,更不能执行GR.一般来说是系统软件没有GR特性或者GR特性关闭.

从GR中完成的任务来看,分为GR Restarter(就是协议重起的设备)和GR Helper(就是协助完成协议重起的设备)两个角色.

OSPF 详解 (1)

OPSF GR的实现标准

目前有两种方流的实现标准:

RFC3623:Graceful OSPF Restart

Juniper,Redback,Nexthop,Procket等厂商采用的实现方法.

Cisco IOS,IETF草案包括

drft-nguyen-ospf-lls-05.txt

draft-nguyen-ospf-oob-resync-05.txt

draft-nguyen-ospf-restart-05.txt

下面我们对这两种实现分别进行介绍

RFC3623: Graceful OSPF Restart

RFC3623中定义的GR有两个重要的原则:1.网络拓扑要保持稳定;2.重起协议的路由器可以在重起过程中保持转发表.否则需要终止GR过程,进行标准的OSPF协议重起.

在GR的过程中,定义了GR Restarter和GR Helper的行为.GR过程是通过GR Restarter发出一个Grace-LSA的通告开始的.

GR对OSPF的扩展

RFC3623定义了发起GR的信号,Grace-LSA,该LSA是一个Opaque LSA,所以需要对OSPF进行扩展,以支持Opaque LSA.Opaque LSA是通过RFC2370进行定义的,这里我们稍做一下回顾.

RFC 2370:The OSPF Opaque LSA Option定义了新的Opaque LSA类型,以提供扩展OSPF能力的通用机制,共定义了3种类型,包括:Link State Type 9,10,11.

Type 9:Link-local scope, 只在本地链路(子网)传播;

Type 10:area-local scope,在本区域内传播;

Type 11:AS scope,在OSPF进程运行的路由域内传播.

原Link State ID分为Opaque Type(1个字节)和Opaque ID(3个字节)两部分.

承载信息部分:由TLVs结构组成,没有特别定义LSA内容 以提供通用机制.

根据各种类型OLSA的使用范围可以看出,GR技术中的Grace-LSA应该是使用类型9,是一个本地链路的LSA.对于Grace-LSA,Opaque Type字段为3,Opaque ID字段为0.在Grace-LSA的TLVs中,主要包括GR周期,发生GR的原因和GR Restarter的接口IP地址.

对于GR Restarter行为的约定

GR Restarter设备进入GR前的准备工作

1.保证转发表的准确,并在重起过程中被保护(不能修改).

2.可能需要保存OSPF接口的密码序列

MD5认证的时候使用密码序列以避免重复攻击

可选项,如果不保存的话,切换后第一个报文的密码序列为0.Helper在RouterDeadinterval时间之内不会处理restarter的报文,这样就会导致GR的时间过长.

3.产生Grace-LSA,age=0,并给出GR周期(grace period).必须采用某种机制来确认邻居已经收到了Grace-LSA(采用OSPF同步LSDB的机制).并将Grace-LSA中相关的参数保护起来,比如GR周期.需要注意的是,邻居确认收到Grace-LSA并不代表它一定具有帮助者的能力或者会帮助完成GR过程.即使一个不支持GR特性的设备,也会发出收到LSA的确认信号 ,但它不能帮助完成GR过程.

GR Restarter设备在GR期间(备主控RP工作时,接口也可以接收):

1.设备不会产生LSA;当收到源于自己的LSA时,不做处理,并认为有效.

在标准的OSPF过程中,当设备收到一个源于自己的LSA,会认为是上次重起前遗留的LSA.这个时候设备会生成一个序列号更大的LSA并泛洪或者提前老化该LSA.但是在GR过程中,设备通过从邻居获取LSA来得到重起前的网络拓扑,因此这时候只是接受,并认为有效.

2.不能下发路由项到转发表.

3.GR设备通过侦听接口上的HELLO知道自己是否为DR,如果是DR,还会保持.

设备收到从邻居发来的Hello报文,如果其中DR为自己,那么会保持在自己的Hello中宣告自己为DR.

GR Restarter退出GR的条件

1.已经重建了所有邻居关系(可以通过从邻居那里获得的1,2类LSA中知道所有的邻接关系)

2.GR设备收到一个不合逻辑的LSA.比如收到的LSA中不包括自己,或者自己的LSA中不包括这个邻居.这说明网络拓扑发生了变化.(收到一个主备切换前后不一致的router-LSA,如收到邻居生成的router-LSA,其中不包含和Restarter相连的链路的描述)

3.GR周期超时.

GR Restarter退出GR后的过程:

无论GR过程是否完成,都会进行标准的OSPF重新泛洪和路由计算,按照当前的链路状态产生LSA并泛洪,根据LSDB计算路由并下发到转发表.必须要完成的下面这些工作:

  重新在所有关联区域泛洪1类LSA.

  如果是DR,重新泛洪2类LSA.

  重新计算路由并下发到转发表,产生必要的3,5,7类LSA.

  删除残存在转发表中不再有效的路由.

  向区域内刷新那些源于自己的LSA.

  刷新(老化)Grace-LSA.

对于GR Helper行为的预定

GR Helper进入GR前的检查

1.收到Grace-LSA

2.目前与GR Restarter设备在进入帮助状态的接口上是FULL的状态.

3.网络拓扑没有变化.检查的方法是查看与GR Restarter设备连接的重传列表(如果存在除了周期性更新的LSA之外,还有type 1-5,7的LSA,就意味着网络拓扑发生变化).如果有网络变化,那么拒绝进入帮助模式. 

4.GR周期没有超时(根据Grace-LSA的age字段来判断).

5.本地策略允许成为GR Helper.

6.本身不在GR过程中.(当前自身没有执行GR重启)

例外是,如果已经是某个GR Restarter设备的帮助模式,那么收到新的Grace-LSA必须接受并且因此更新GR周期.

GR Helper可能与GR Restarter设备有多个邻接关系,如果在其中的一个连接上拒绝进入帮助模式,会导致问题.因为不进入帮助模式将宣告一个邻接结束.而这样会导致LSA的更新,并被理解为网络拓扑发生了变化.

GR Helper在GR期间的任务

1.监视网络变化,如果没有变化,就保持宣告与GR Restarter的邻接状态不变.

2.在Restarter提出请求时,将完整的LSDB泛洪给GR Restarter

GR Helper退出帮助模式的条件

1.Grace-LSA被刷新了(说明GR Restarter设备已经完成GR).

2.GR周期过期

3.网络拓扑发生变化 判断的原则:LSA的内容发生变化(遵循RFC 1793的3.3小节)并且变化的LSA是会泛洪给Restarter的.

对于LSA变化的定义如下

    Options字段发生了改变.

    LSA的age被设为了最大

    LSA头部的长度字段发生了变化

    除头部以外的内容发生了变化(除去头部目的是为了不考虑校验和及序列号)

LSDB显示网络发生了变化,也就是LSA变化了.并且要满足这样的条件,如果FULL的关系还存在,那么该FSA是会被泛洪给GR设备的.也就是说这个网络拓扑的变化会影响到GR Restarter对网络设备拓扑的理解.举个例子(图3):如果Y是一个ABR,并且是GR Helper的角色.X属于一个STUB区域,是GR Restarter的角色.如果Y收到一个新的5类LSA,那么并不会终止GR过程,因为这个LSA任何时候都不会泛洪给X.

GR Helper退出帮助模式后的动作

1.重新计算DR.

2.重新泛洪1类LSA.

3.如果是DR,重新泛洪2类LSA

4.如果连接了VLINK,在传输区域产生1类LSA.

OSPF 详解 (1)

具体的GR过程

OSPF 详解 (1)

1.R1和R2建立邻居关系.

2.R2的OSPF进程因某种故障发生重起.此外,R2已经保存了FIB表项,OSPF接口的密码序列以及GR的周期.通过对FIB表的保存,R2可以保持数据报文的转发.

3.OSPF软件重启之后,R2将先前保存的FIB标记为陈旧的状态.此时,R2继续使用先前保存FIB信息进行转发.在发送Hello报文之前,R2首先为每一个OSPF接口生成一个Grace-LSA,其中重启的原因设置为0(未知)或者3(切换到冗余的控制处理器).为了确保GR helper能够收到Grace-LSA.Grace-LSAs可能会被不停发送在一定的周期内,直至收到确认(我司的实现是不管是否收到,一直发送5个).为了避免重启路由器的LSAs被老化,Grace的周期必须小于LSRefreshTime(默认是1800秒).推荐使用一个默认的120s(2分钟)作为GR的周期.

4.收到grace LSA,R1进行helper模式,并且在GR的周期内维持和R2的邻居关系.因为R1和R2此时仍然处于full的邻居关系,R1仍然像正常行为一样宣告R2,对其他路由器屏蔽了R2的重启.

5.和标准的OSPF处理一样,R2和R1进行LSDB库的同步.然后在GR周期,R2并不会去修改或者刷新它自己重启前生成的LSAs.相反的,R2认为他们是合法的.接着R2运行OSPF运算,但是不会去更新FIB表

5.R1和R2在GR的周期内完成了LSDB库的同步.R2从它的邻居同步了所有的LSDB(本例中只有R1),R2老化grace-LSA通知邻居GR过程已经结束.同时R2重启生成router LSAs和network LSAs(如果它是DR),并且重新计算路由和更新FIB表.此外,R2会重新生成3,5,7类所有它自身先前生成的LSA.

7.当R1收到grace-LSAs老化的消息后,退出GR进程,重启执行标准的OSPF行为.

关于非计划性重起的GR

通过前面的介绍.我们发现,一个GR过程似乎是有计划进行的,那么很多时候是因为主控板出现意外故障导致了主备切换,这时候的GR过程会有所不同.

GR技术的起源是用于有计划的重起,对于无计划的重起而言,要考虑到是否转发表能有效的得到保护.另一方面非计划的重起,并没有进行应做的准备,那么在控制软件可用时需要立刻发出一个Grace-LSA并要遵守下面的原则.

1.Grace-LSA必须在发送任何HELLO之前产生并发送出去.在广播网络中,这个LSA必须向所有路由器的组播地址发送,因为重起的设备并不知道它之前的DR状态.

2.Grace-LSA是封装在LSU报文中并送到所有的接口,不管是否存在邻接关系或者以前的邻接关系是如何的.

3.为了提高Grace-LSA被交付的概率,具体实现中可以进行多次的发送.

4.在Grace-LSA中重起原因中要设置为0(不可知)或者3(切换到备份控制器).这样邻居就可以决定是否他们需要帮助路由器完成这个意外的重起.

Grace-LSA的报文格式

OSPF 详解 (1)

OSPF 详解 (1)

GR导致的安全问题

一个虚假的Grace-LSA会导致设备进入GR Helper的角色,并孤立起来.

解决的方法是对OSPF的邻居交互做认证.

Cisco Nonstop Forwarding

标准及相关特性

Cisco IOS,IETF草案包括

draft-nguyen-ospf-lls-05.txt

draft-nguyen-ospf-oob-resync-05.txt

draft-nguyen-ospf-restart-05.txt

Restart Signaling面临的挑战

在Graceful Restart过程中保持邻居关系和避免不必要的LSA的泛洪

当主备切换时,Restarte试图通过Hello报文来重建邻居关系.但是其Hello报文的邻居列表中并不包含原有的任何邻居信息.在这种情况下,Helper收到之后进行Two way检查,就会重置邻居关系.同时更新LSA并泛洪.

在Graceful Restart过程中进行LSDB库的同步

在RFC 2328f规定除了在初始化和路由更新时才重传LSDB,其他任何时候都不会重传LSDB.

两个主要概念:

LLS(Link-local signaling):Cisco触发NSF的信令使用了LLS来进行

Out-of-band LSDB resynchronization(OOB):Cisco定义的无状态变迁的LSDB重新同步

相关特性:

OSPF NSF(Nonstop Forwarding)目前在Cisco 7200 7500 10000,12000系列路由器支持.因为7200系列路由器是单主控结构,因此只能做为了一个NSF-aware.OSPF NSF目前不支持Virtual Links.

OSPF NSF awareness(12.2提供),通过支持LLS特性,将NSF-aware的能力扩展到中低端路由器,包括26系列路由器都可以通过支持该特性成为一个NSF Helper.

LLS(Link-local signaling)介绍

LLS是Cisco对标准OSPF报文做的扩展,LLS Data部分加在OSPF报文的尾部(或者认证数据后).在OSPF头部的OSPF报文长度不计算这部分数据(包含在IP报文的长度内),这样不兼容LLS能力的设备可以忽略该部分数据的存在.LLS特性在目前IOS版本中是缺省使能的,可以通过关闭该能力禁止NSF.

LLS只增加在hello和DD报文中,这两个报文就可以完成能力的协商过程.其中hello是不保证交付的,而DD则可以保证交付.

LLS的类型:

Type1:在OSPF的Hello报文后,主要应用于传递动态的信息,因为Hello报文是周期性地发送,但是该LLS的安全不能保证

Type2:在OSPF的DD报文后

对hello和DD报文的optioon字段做了扩展,以表明是否携带了LLS Data.原option字段如下:

OSPF 详解 (1)

将其中的EA位作为LLS能力位L-bit.当该位置位时表示携带了LLS Data.

OSPF 详解 (1)

LLS Data部分结构如下:

OSPF 详解 (1)

Checksksum:整个LLS数据块的校验和

LLS Data Length:整个LLS数据块的长度,单位是4字节

如果OSPF报文是带认证的,LLS数据块也必须是带认证的,在这种情况下,checksum失效.LLS数据块将包含一个认证TLV

LLS TLVs:Type-Length-Value的形式,至少32位,不足的以0填充(但是0计算在LLS data length长度范围内)

LLS TLVs:

OSPF 详解 (1)

Type:类型值,唯一标识该TLVs

Length:Value域的长度,单位是字节,根据type不同可变化,可使TLVs随意携带各种数据,体现了TLVs的灵活性

Value:值域,以32位单位,不足的以0填充,但是字节不包含在TLVs的Length长度范围内,但是包含在LLS Data length长度范围内

Extended Optioin TLV:OSPF 详解 (1)

Type:1

Length:4

Value:值域,应用见后面的RS和LR位

EO-TLV在LLS data Block只能出现一次

Cryptographic Authentication TLV:

OSPF 详解 (1)

Type:2

AuthLen:20,认证数据的长度,即Sequence Number+AuthData的长度

Sequence number:4字节长度的认证序列号,同ospf

AuthData:值域

CA-TLV在LLS data Block最多只能出现一次,并且只能放在LLS的最后

其中通过不同的TLVs可以进行不同的OSPF扩展(从这里可以看出Cisco的这种实现方式可以用于多种OSPF扩展,而不仅仅是NSF).在NSF中使用了一个叫做Extended Options TLV(E0-TVL),它的类型为1(IANA规定1为Extended Options),该类型是临时使用的.如果LLS的草案被通过,可能会有正式的类型.

E0-TVL的Value字段标明了设备是否支持OOB(后面介绍),或者是否是一个触发NSF的信令.Value字段的定义如下.:

OSPF 详解 (1)

倒数第一个比特叫做LR-bit,当该位置位时,表示设备支持OOB能力.解决GR过程中helper将LSDB库传给Restarter的问题

倒数第二个比特叫做RS-bit,当该位置位时,表示设备要进行一个NSF过程.Cisco规定在同一时间,同一个网段中不能有多个设备同时将RS-bit置位.也就是在同一个网段内,同时只能进行一个NSF过程.(通过Hello报文的LLS的EO_TLV中引入RS位置来达到通知Helper当前正在进行GR,请维持邻居关系的目的.)

OOB-resync(Out-of-band LSDB resynchronization)介绍

与传统的LSDB同步过程不同的是,NSF需要在邻接状态不变化的情况下进行LSDB的重新同步.Cisco将这种无状态迁移的LSDB重新同步过程取名为OOB-resync,这里简称OOB.OOB的能力协商是通过LLS扩展实现的,在LLS的E0-TVL中LR-bit置位说明支持OOB.LR位在Hello和DD报文中携带

OSPF 详解 (1)

OOB LSDB Resynchronize能力解决GR过程中helper将LSDB库传给Restarter的问题(RFC 2328的规定)

Hello报文的修改:具有OOB LSDB Resync能力的路由器在hello报文中要将LR置位

DD报文的修改:具有OOB LSDB Resync能力的路由器在DD报文中要将LR置位.由于初始化的DD报文的Optioins选项将存储在相应的邻居的数据结构中,LR位可以为以后检查邻居是否具有OOB LSDB Resync能力

当设备进行一个OOB过程时,需要发出一个信号,是通过对DD报文的扩展完成的.标准的DD报文如下:

OSPF 详解 (1)

Cisco的扩展是使用了Options字段后面8个bit的第5位,将该位定义为R-bit,扩展后的报文如下:

OSPF 详解 (1)

当设备收到R-bit置位的DD报文,说明邻居要进行一个OOB的过程,这时候设备会保持其邻接关系不变化,并且做一个标志RestartState flag,同时开始一个ResyncTimeout记时器.实际上这就是NSF周期,默认定义为RouterDeadInterval.如果在这个OOB的过程中从邻居收到R位清除的DD报文,那么就退出OOB过程,取消RestartState flag标志并且忽略ResyncTimeout记时器.

Cisco Nonstop Forwarding过程

1.首先通过在Hello中将L-bit置位,协商LLS能力,并且通告对方自己的LLS数据.

2.在LLS的E0-TLV中将LR-bit置位,协商OOB能力.

3.在hello中的LLS数据部分,将E0-TLV的RS-bit置位,通告对方自己要进行协议重起.(表明Restarter开始进行GR重启,希望邻居不要重置OSPF会话)

OSPF 详解 (1)

4.将DD报文中的R-bit置位,表明这是一个OOB的过程.

5.邻居保持邻接状态不变并对邻接关系做标志RestartState flag,同时启动ResyncTimeout记时器.

6.在数据同步完成后取消R-bit置位,执行标准的OSPF操作.

OSPF 详解 (1)

1.R1的OSPF进程因某种故障发生重启,开户启动NSF restart timer

2.R1发送LR和RS置位的Fast-hello报文,通知R2要进行NSF重启.

3.R2收到RS置位的Fast-hello报文,知道R1在进行NSF重启,忽略2-way检查.保持邻居的状态机为Full,同时启动Resync-timeout计时器(从收到第一个Fast-hello到OOB-resync的初始化,为防止R1出现故障启动不了OOB-resync的同步,导致Restart Signaling无限期的延迟.长度等于RouterDeadInterval)

4.同时R2立刻回复一个单播的RS不置位的Fast-hello

5.R1收到R2的Fast-hello报文后,将邻接关系置为2-way的状态,但是从NSF的角度来看,就好像是一个Full的状态.

6.R1等待NSF restart timer超时后,开始进行DR/BDR的选举和OOB LSDB的同步.之所以等待restart timer的时间,是为了让R1知道所有邻居的状态.完成DR选举之后,R1将邻居关系置为Exstart.

7.R1发送R位置位的DD报文

8.R2收到R置位的DD报文后,强制将邻居状态机从Full切换为Exstart,并开始进行LSDB的同步.同时取消Resync-Timeout计算器

9.R1和R2进行OOB LSDB同步

10.OOB LSDB同步完成后,R1重新生成各种LSA,仅把变化的LSA泛洪给R2.同时更新转发表项.

11.NSF完成

VRP & IOS的相关配置

VRP 5.x的配置

对于GR特性,在VRP5.x提供支持.如下(配置命令修改中,可能最终不同):

ospf 1

  enable link-local-sigaling

  enable out-of-band-resynchronization

  graceful-restart

另外一种配置(作用一样,2012-01-06以后)

OSPF 详解 (1)

Restarter的配置 Helper的配置

ospf 1 router-id 1.1.1.1             ospf 1 router-id 2.2.2.2

opaque-capability enable             opaque-capability enable

graceful-restart ietf                graceful-restart ietf

area 0.0.0.0                         area 0.0.0.0

network 10.0.0.0 0.0.0.255           network 10.0.0.0 0.0.0.0.255

IOS配置命令

IOS默认使能了LLS和OOB的能力.

router ospf 1

  nsf

OSPF 详解 (1)

Restarter的配置 Helper的配置

 ospf 1 router-id 1.1.1.1                 ospf 1 router-id 2.2.2.2

 enable link-local-signaling              enable link-local-signaling

 enable out-of-band-resynchronization     enable out-of-band-resynchronization

 graceful-restart nonstandard             graceful-restart nonstandard

 area 0.0.0.0                             area 0.0.0.0

 authentication-mode md5                  authentication-mode md5

 network 10.0.0.0 0.0.0.255               network 10.0.0.0 0.0.0.255

如果要关闭NSF,只需要关闭LLS能力即可

router ospf 1

  no capability lls

对于NSF-aware设备,通过定义OOB定时器来定义可容忍的NSF周期.

interface fa1/0/0

ip ospf resync-timeout 60(缺省为40s)

Graceful Restart两种主流实现方式的比较

Cisco对于NSF的实现是依靠3个方面的过程来实现的,LLS,OOB和对NSF过程的定义,并不需要支持Opaque LSA,而且LLS和OOB可以在其它的OSPF扩展中得到应用,但是技术相对复杂.对于NSF周期的定义,Cisco是由NSF Helper来决定的,虽然时间可配置,但是有可能造成NSF过程的提前终止.RFC3623的定义只是使用了9类的Opaque LSA.GR周期是由GR Restarter决定的,这样可以避免GR过程的意外中断,但同时也可能导致欺骗攻击造成孤岛.

OSPF多实例

前言

本文是根据李劲松--李大师的PPT<>改编而成.

预备知识

阅读本文之前,请先熟悉一些MPLS-L3VPN的基础支持,包括:

PE和CE的概念.

OSPF协议

MPLS-L3VPN的基本原理.

VPN site(其实就是相当于一个多实例)

MBGP (BGP进化后的结果--多协议BGP)

典型的MPLS-L3VPN拓扑:

OSPF 详解 (1)

路由协议的<<进化论>>

达尔文的<<进化论>>告诉我们一个原理--适者生存.当MPLS-L3VPN技术日渐成熟的时候,各个路由协议为之也要做出相应的进化或者改变(不变会被淘汰的).

我司设备目前支持的主要路由协议为:静态路由,RIP,OSPF,BGP.(IS-IS本文不涉及所以暂不介绍),这里我们先简单说一下各个路由协议的进化情况:

静态路由,RIP都是标准的协议,但是每个VRF运行不同的实例.相互之间没有干扰.与PE的MP-iBGP之间只是简单的IMPORT操作.

EBGP也是普通的EBGP,而不是MP-EBPG,只交换经过PE过滤后的本VPN路由.

OSPF则做了很多修改,可以将本site的LSA放在bgp的扩展community属性中携带,与远端VPN中的ospf之间交换LSA.每个site中的OSPF都可以存在area 0.而骨干网则可以看作是super area 0.此时的OSPF由两极拓扑(骨干区域+非骨干区域)变为3级拓扑(超级骨干区域+骨干区域+非骨干区域).

从上面我们可以看出静态路由,RIP,BGP这些实现相对简单的路由协议变化并不是很大(当然BGP的一个新功能:用MBGP传递VPN路由也算变化不小吧,这里我们就不讨论了先).OSPF由于自身算法的太过于精妙,所以它的变化也是比较大的,不过最根本的原因还是适应网络的需求,毕竟科技以人为本啊.

OSPF多实例

OSPF多实例相关名词介绍

进程(Process)

OSPF运行是依靠运行自身的SPF算法,从而形成一个本地的链路状态数据库.不同的接口可以运行多个SPF算法从而形成多个链路状态数据库,我们把每个链路状态数据库里所涉及的接口,LSA等叫做在一个OSPF进程里面.不同的进程的链路状态数据库是完全隔离的,但是可以共同拥有一个路由表(可以通过再发布引入).

多实例(Instance)

传统路由器只有一张路由表,但是为了适应MPLS VPN,路由器不得不在自身上再模拟一个或者多个虚拟路由器,每个虚拟路由器有独立的路由表(没有特殊处理是不可以互访问的).每个虚拟路由器和它自己相关的路由表,接口等是存在于一个多实例的.

多实例这个概念可以说基本上是为了MPLS VPN而创造出来的,但是现在它也有别的特殊的应用,比如多实例的L2TP,或者多实例组播应用(我们不必用IGMP V3也可以把不同的源但是相同组的组播流分开)等.只要你肯想肯定还有许多未被挖掘的宝藏.

域(Domain)

域这个概念和WINDOWS2000里的域的概念比较象,或者说可以和AS的概念比较,在一个域内的OSPF可以交互LSA的详细信息,不同域的OSPF只可以交互外部LSA.

BGP和OSPF

普通服务

MPLS L3VPN网络的路由传递全是依靠BGP的扩展属性传递的,对于一般的路由协议来说(比如静态,RIP等)BGP所需要做的只是简单的再发布工作,没有什么技术含量.

VIP服务

OSPF是BGP的VIP客户,当OSPF需要通过扩展BGP在MPLS L3VPN网络中传递路由的时候,BGP除了会把OSPF的路由发布出去,同时会利用自己的扩展团体属性记录OSPF路由的一些信息.(这么做的原因也是由于OSPF本身设计的思想所导致,这个协议需要每条路由的尽量详细信息.)

BGP是如何提供VIP服务给OSPF的呢?这个还要从RT说起,RT表示路由器接受路由的喜好,当然发送路由更新的时候可以设置这个"喜好"了.现在RT除了加上了这个"喜好",而且还对OSPF有特殊的服务,RT后面加了一些OSPF路由信息,在RT的字段有一部分是这样的:

OSPF 详解 (1)

如图2是BGP扩展团体属性与OSPF相关的部分,其中类型编码为0306(长度16bit),接下来是OSPF的区域号(32 bit),然后是OSPF路由类型(8bit),最后一部分是选项字段(一般用来表示外部路由的度量类型).

我们现在具体解释一下路由类型这个字段:

第1类LSA与第2类LSA的路由类型为1或者2

第3类LSA的路由类型为3

第5类LSA的路由类型为5

第7类LSA的路由类型为7

Sham-link端点地址路由类型为129

这里Sham-link后面会介绍到的,由于MPLS L3VPN的路由是通过BGP发布出去的那么最起码的要求是这条路由要在路由表里,当PE要发布这条路由的时候它会根据产生这条路由的LSA类型来填充路由类型这个字段,当另外一个PE的接收到某条被发布的OSPF路由后,如果它的下游也是同一个DOMAIN内的OSPF区域的话那么通过再发布把路由传播下去.(但是路由类型1,2的会被转化成LSA 3,其它路由类型到LSA之间的转换不会变的)

我们可以发现常见的LSA变少了,类型4的LSA没了,为什么呢?(欢迎大家讨论,以下是我的看法:由于BGP的任务是发布路由给PE,而且这条被发布的路由是要在路由表里的,但是OSPF的LSA 4只是通告一下ASBR的位置,并不会产生路由,所以发布它有点难啊...)但是没有类型的LSA路由器对于类型5和类型7的外部路由如何正确的算出树呢?请看下图:

OSPF 详解 (1)

如图3所示,假如与CE-B连接的区域1里某个路由器发布了一条外部路由(LSA 5)那么PE-C发布的时候只会发布这条LSA 5产生的路由,相关的LSA 4是被忽略的,但是这条路由到了PE-D的时候,PE-D如果需要把它再发布到OSPF域的时候它会把产生者的地址写成自己,然后再发布相关的LSA 5出去,同时CE-E会产生一个相应的的LSA 4(认为PE-D是ASBR),这样一切就圆满了.

存在的问题

路由协议最怕的就是产生路由环路,OSPF区域里传递路由为了保证不产生环路规定:1.所有区域必须和区域0相连;2.本身用SPF算法.但是MPLS L3VPN网络中改变了这种拓扑结构,而且在跨越MPLS骨干网后一般都是类型3,5,7的LSA,这三种LSA实际上在OSPF运算产生路由的时候和DV(距离矢量)算法很接近,所以很有可能产生路由环路,比如下图:

OSPF 详解 (1)

如图4(一个典型的CE双归的模型)当PE-A分别与PE-B,PE-C建立MBGP邻居后,当PE-A传递了一个类型3或者5的路由给PE-B与PE-C,PE-B与PE-C都会根据相应的LSA产生路由,但是同时就有可能PE-B产生的LSA通过CE-A传递了给PE-C然后由于路由优先级与再发布的问题,导致PE-B的路由表错误或者把这条路由又发给了PE-A,这样环路就形成了.

解决办法:首先我们先介绍一下如何避免类型3的LSA产生环路,在OSPF头部的选项字段中有一个DN位,当PE收到某条LSA 3的并且发现DN位有置位的时候,这个PE在运行SPF算法的时候会忽略这个LSA(Cisco书上说会忽略此LSA,同时不能发布到BGP中,可是SPF算法已经忽略它了,根本就产生不了路由,怎么会发布到BGP中呢??欲知答案,请参看附录)

接下来说一下关于类型5,7是如何避免环路的.方法和类型3用的方法类似,也是在某个地方做个标志,类型5,7的LSA都有TAG选项,当PE发布一条OSPF外部路由到VPN网络中,PE会根据这条外部路由的信息(AS号等)算出一个唯一的VPN-TAG值并加到类型5,7的LSA里面去,当PE收到一条类型5或者7的LSA的时候如果发现有一样的VPN-TAG值的话,那么该LSA也会被忽略的.

OSPF的后门链路---Sham-Link

Sham-Link的作用

好的网络规划设计者都会考虑到网络的冗余,备份问题,一般情况下MPLS-L3VPN网络中PE之间存在备份链路,同时相同的VPN组之间可能也有备份链路的存在,比如下图:

OSPF 详解 (1)

如上图5 CE-A与CE-B之间还有一个备份链路相连,问题也就来了,由于域内路由的优先级大于域间路由的优先级,所以CE-A会通过它与CE-B直接相连的链路到达另外一个VPN,而且PE也会忽略自己的BGP邻居发布过来的VPN路由.

一般情况下为了网络管理与排错我们尽量会把CE-A与CE-B之间的备份链路作为"后门"链路,只有当MPLS骨干网络出现了问题数据才会通过"后门"链路转发,为了适应这种要求Sham-link产生了.通过Sham-link MPLS L3VPN骨干网的PE之间可以扩散LSA 1或者LSA 2.

Sham-link的配置注意事项与具体实现

首先我们看一个Sham-link的配置简例:

{ bgp 100

undo synchronization

group 1 internal

peer 1 connect-interface loopback0

peer 104.0.0.3 group 1

ipv4-family vpn-instance vpna

  network 192.200.3.0

  network 200.1.1.1 255.255.255.255

  import-route ospf 100

  undo synchronization

ospf 100 vpn-instance vpna

import-route bgp

  area 0.0.0.2

  network 192.200.3.0 0.0.0.255

  sham-link 200.1.1.1 104.0.0.3 (用LOOPBACK地址) }

配置Sham-link一般有3条注意事项:

Sham-link的端点地址(32位)属于某个特定的多实例

将该端点地址在BGP的多实例下通告

该端点地址不可以在相应的OSPF实例中发布

我们先来讲解一下具体实现,然后在对每个注意事项进行解释.

Sham-link与虚链路实现的手段基本一致,Sham-link在两个端点可达后,然后建立OSPF邻居,通过邻居关系把相应的LSA发送过来.现在我们来回忆一下虚链路的实现,我们在配置虚链路的时候,一般都会用到命令"vlink x.x.x.x",这里的x.x.x.x是一个RID,也就是一个路由器的名字,也就是说在路由表里可以没有这个地址.那么Sham-link的端点地址可以不通过BGP发布吗?(答案是否定的,虚链路的虽然可以只配置对端的RID,但是这是因为本地的路由器对该区域的LAS1,LSA2都了如指掌,它完全有能力叠代的正确的出口.而Sham-link这个功能本身就是为了传递LSA1与LSA2如果不在BGP中发布端点地址,那么就好比OSPF-NBMA网络不配PEER一样)

最后我们说一下注释事项的第三点,因为一般情况下我们建立Sham-link是通过虚接口LOOKBACK建立的,而草案上说Sham-link实际上一种地址借用的特殊情况,所以一旦把端点地址发布到OSPF里,这个时候我们的LOOPBACK接口就变成了一个启动的OSPF的接口,物理接口收到的HELLO数据会送到这个LOOKBACK接口,这样就破坏了草案上说的地址借用的情况.路由器对HELLO数据包的识别也会有错误.

Sham-link与虚链路

Sham-link与虚链路有很多表面的类似的地方,都是为了连接2个隔离的区域并且提供该区域的详细路由信息,同时也都是利用单播来建立邻居关系.但是我们在实际中应用它们的地方并不是很多,或者希望最好不要用到它们.

配置案例

以下是一个简单的配置例子(这里只介绍PE上的配置,P设备和CE的配置就不介绍了)

首先配置一个多实例:

ip vpn-instance vpna

route-distinguisher 100:1

vpn-target 100:1 export-extcommunity

vpn-target 100:1 import-extcommunity

然后配置BGP

bgp 65001(别忘了添加邻居)

ipv4-family vpn-instance vpna

import-route direct

import-route ospf 1

接着配置OSPF多实现

ospf 1 vpn-instance vpna

import-route bgp

import-route bgp

area 0.0.0.1

network 201.1.1.2 0.0.0.0

sham-link 1.1.1.1 2.2.2.2

留给读者

请问下面这个拓扑哪里不合理,为什么?如何修改?

OSPF 详解 (1)

附录

答案:Cisco与我司的再发布的实现是不同的,我司的实现方法是只有IP路由表里有具体的OSPF路由,那么它才可以被发布到其它的协议当中去.而Cisco的实现是把整个可用LSA都发布到其它协议当中.

这两种实现方法各有什么好处?各有什么缺点?请大家思考

OSPF附录E及相关问题与规避措施

不支持附录E导致的缺陷

我司VRP平台V3及以前的版本都不支持OSPF协议的附录E,由此导致在实际开局与网络改造过程中个别组网存在一定的缺陷,同时也隐藏着与此相牵连的一些问题.我们以下图为例来具体阐述这类情形.

OSPF 详解 (1)

如图1,路由器Rtr A,Rtr B都运行OSPF协议,且所有接口都在区域0.对于上图所示的网络,一种惯常的配置步骤可能是:

1.在路由器Rtr A上配置OSPF协议引入静态路由,以通过OSPF协议将路由信息传递给路由器Rtr B.

2.路由器Rtr A上配置静态路由20.20.0.0/24,下一跳指向该网络的出口路由器Rtr C;

3.路由器Rtr A上配置静态路由20.20.0.0/16,下一跳指向该网络的出口路由器Rtr D;

这样的配置看起来十分完美,会不会隐藏着什么隐患呢?

实际的效果是:通过路由器Rtr B转发的去往目的地为20.20.1.0/24--20.20.4.0/24四个网段的流量将在Rtr B上全部被丢弃!

我们知道,OSPF协议是一种基于链路状态的路由协议,其路由计算是基于链路状态LSA的.当路由器引入静态路由时,通过生成相应的第5类LSA进行洪泛,以此向其他路由器传递拓扑信息.第5类LSA是以对应网络的IP地址来标识的,并协同产生该LSA的路由器ID,LSA的序列号第三个信息的组合作为其关键值进行唯一性标识,也就是说:不关心路由的掩码信息!

上述组网中,在路由器Rtr A上配置第一条静态路由20.20.0.0/24时,生成了一条第5类LSA往Rtr B洪泛;当再配置第二条静态路由20.20.0.0/16时,由于网段IP地址相同,不再生成重复的LSA.于是导致了路由器Rtr B只知道20.20.0.0/24的网段信息,而不知道Rtr D所在网络的网段信息.

上述情形不只针对OSPF的第5类LSA,其第3,7类LSA由于对网络信息描述的关键值不包含网段的掩码信息,也存在相同的缺陷.于是RFC2328的附录E推荐了一种改进的方法.

OSPF附录E的解决方案

在OSPF协议中,关于其他区域网段和外部引入网段的计算主要依靠第3类LSA和第5,7类LSA来实现;这三类LSA分别承载OSPF区域间路由,OSPF外部路由以及OSPF的NSSA区域外部路由的信息.

由于OSPF的这三类LSA的ID是以这些网段的IP地址来标识的,每一类型的LSA是以产生该LSA的路由器ID,LSA的序列号以及被描述网段的IP地址这三个信息的组合作为关键值进行区分的.所以,同一台路由器产生的或者引入外部路由而生成的这些LSA,对于那些网段地址一样,而掩码信息不同的路由,将不能进行区分.例如,上面例子中的路由器Rtr A对于静态路由20.20.0.0/16和20.20.0.0/24的引入将只会生成一个LSA,其中必有一条路由因无法描述而被丢弃.

在讲述附录E前,我们先来深入分析下此类组网,收集下解决这类问题的一些相关要点.首先.OSPF路由器本地必须能够区分对相同网段IP,不同掩码的多条路由的描述,这是保证解决办法有效的基础条件.

其次,对于需要的路由信息的描述必须使用网络地址,这是OSPF协议路由计算方法的根本,不应该改变,否则会涉及协议的大修改.

再次,当存在相同网段IP,不同掩码的路由时,只要保证最短掩码的那条路由传播出去,就可以解决问题.所以,合适的解决方案必须保证最短掩码的路由能够被其他路由器学习到.

最后,这类情形的发生是由于路由器本地无法对网段IP相同而掩码不同的多条路由进行描述而导致的,不涉及与其他OSPF路由器的互操作问题.所以,每台OSPF路由器可以自己选择实施合适的解决方案.

OSPF的FC2328附录E推荐的一种改进的方法,就是本着上面四个原则进行处理的.下面以第5类外部LSA的处理为例进行介绍,相同的处理方法也同样适用于其他两类LSA.

OSPF路由器欲引入一个外部路由,网段IP地址为NA,掩码为NM_new,我们以[NA,NM_new]进行标记.该路由器的处理过程如下:

1.查找链路状态数据库,判断是否已经存在对应IP地址为NA的路由的第5类LSA,如果没有,就产生一个第5类LSA,其ID为NA,处理结束.

2.如果已经存在,则从已有的第5类LSA中提取该网段的掩码NM-old,分两种情况进行处理:

如果NM-new的长度大于MN_old,也就是说,将要引入的路由的掩码比原先的那条更长,这时只需要再产生一条新的第5类LSA即可:将新的外部路由网段的主机位全部置1,子网广播地址作为新的第5类LSA的ID.例如,原先的外部路由网段是10.10.0.0/16,其LSA的ID是10.10.0.0,新的将要引入的网段是10.10.0.0/24,产生的LSA的ID就是10.10.0.255.

如果NM_new的长度小于NM_old,则需要立即替除原来的第5类LSA,并产生两条新的第5类LSA.一条LSA的ID为NA,其序列号为原来被替掉的LSA的序列号加1,花费值对应新路由的花费值;对于另一条LSA,将原路由[NA,NM_old]的主机位全部置1,用子网广播地址作为其LSA的ID.例如,原先的路由10.10.0.0/24以花费值10引入,序列号为100;新的路由10.10.0.0/16以花费值20引入.于是按上面的处理,OSPF路由器先替掉原来的LSA,并生成两条新的LSA,一个LSA的ID为10.10.0.0,花费值为20,序列号为101;另一条LSA的ID为10.10.0.255,花费值为10,序列号为1.

附录E所推荐的方法也有一定的局限性,其实施的前提是:

所有的掩码都是连续的;

不存在一条外部路由的网络IP刚好与上述处理后的子网广播地址相同.

只有基于上述两个前提,这种解决方法才能保证每次产生的LSA的ID都是唯一的.

其他相关的问题以及规避方法

我司路由交换产品中,OSPF协议除了不支持RFC2328附录E这个本身的缺陷之外,由此而引起的由于处理不完善而导致的相关问题也不少,如果在开局和网络改造过程中不加以注意,其后果也是很严重的.不过幸运的是,其规避的措施到是十分简单.

这些问题主要涉及刷新机制,所有涉及IP地址相同掩码不同的情形都可能隐藏着问题.下面以一个已经转换缺陷而不作修改的问题单为例,看看这类问题是怎样由于配置的更改而引发的.

操作过程:先配置一条静态路由,目的网段为20.20.0.0/24,这时OSPF链路数据库中生成一条ID为20.20.0.0的ASE-LSA;再配置一条目的网段为20.20.0.0/16的静态路由,由于即将要生成的LSA的ID与已存在的一条一样,OSPF模块就不再生成新的ASE_LSA.此时,删除原来的目的网段为20.20.0.0/24的静态路由,OSPF模块由于不重新为后来的静态路由生成ASE_LSA,而导致路由无法传播!

与引相关的问题还有几个,未提单的也有不少,问题类型都涉及外部路由引入过程中的增加删除操作,路由聚合过程中的删除增加操作,路由聚合过程中的指定发布与不指定发布操作等等.总之,对于所有涉及到IP地址相同而掩码不同的配置情况,都可能存在问题.

在此,建议兄弟们在开局时,在OSPF协议的配置完成以后,再作一下重起OSPF协议的操作:Clear ip ospf process,这类问题都可以规避.

后记

新的V5平台即将推出,OSPF协议的附录E也将支持,不过V3平台会在将来很长一段时间内使用,大家还是需要注意下这些问题.

此文最初写于2002年,初涉数据通信不久就舞文弄墨,沉寂两年后蒙刘宇大侠的赏识,重新修改了一下,希望大家多多批评.

参考资料

www.ieft.com RFC2328

OSPF DNA LSA

背景知识

LSA Age相关知识

LSA Age定义

在OSPF中,LSA的LSA Header的第一个字段为LSA Age字段,该字段占16bit.系统产生一个LSA时,LSA Age置0.在LSA泛洪过程中,每一跳LSA Age都会递增InfTransDelay.LSA Age主要负责LSDB的LSA老化以及LSA新旧判断.

时间值定义

在LSA Age的工作需要明确几个概念:

MaxAge:取60min.当LSA Age递增到MaxAge,该LSA将在Routing Domain中被清除.MaxAgeDiff:当具有相同的序列号和校验和的两个LSA的LSA Age之间的差值超过MaxAgeDiff时,则可以认为这两个LSA是同一个LSA的两个实例.

InfTransDelay:从一个接口发送一个携带LSA的LSU,LSA需要估计一个在发送前的损耗延迟InfTransDelay,在LSA Age加上InfTransDelay.

LSRefreshTime:周期发送LSA用于LSDB同步.当LSA Age递增了LSRefreshTime时会产生原本系统产生的LSA发送出去.

MinSinterval:该值定义了产生不同LSA实例的最小时间间隔.

MinLSArrival:收到同一个LSA的不同的LSA实例的最小时间间隔,若在小于该时间间隔收到一个新的LSA实例,将直接丢弃.

CheckAge:LSA需要定期进行校验,校验的周期是CheckAge的倍数.

LSA Age工作机制

关于LSA Age我们主要从三方面进行描述:

LSA周期更新:在LSRefreshTime的概念介绍时,我们说了,通过LSA Age递增LSRefreshTime进行周期LSA的产生和泛洪达到LSDB同步的作用.

LSA老化:LSA Age会在LSDB中递增老化LSA,当LSA Age递增到MaxAge时,将该LSA从LSDB中清除,并将LSA Age置为MaxAge的LSA在路由域泛洪,在路由域内清除该LSA,这叫做自然老化.注意在清除LSA的操作还要做如下条件的判断:1.Link State retransmission lists列表为空;

2.本系统的邻居没有处于Exchange或Loading状态的;

在LSA清除中还有一种所谓的"Premature aging"--提前老化,提前老化就是将LSA的LSA Age设置成MaxAge,然后同自然老化一样在路由域中清除.提前老化一般在如下几个情况下发生:

1.本系统产生的LSA的序列号已增至MaxSequenceNumber,此时需要在路由域中清除原LSA,生成序列号为InitialSequenceNumber的新LSA.

2.本系统产生的AS-external-LSA携带的外部路由已不可达;

3.收到不期望的自己产生的LSA,参见RFC2328 13.4;

提前泛洪只对本系统产生的LSA有效,一台路由器不能去提前老化其他设备泛洪来的LSA.参见RFC2328 14.1

LSA新旧判断

对于一条LSA,判断其新旧的有三个要素:Sequence number,checksum,LSA Age.对于同一个LSA的不同LSA实例,当Sequence number和checksum都相等的情况下,就通过LSA Age进行新旧判断.

1.一般会将LSA Age为MaxAge的LSA实例做为最新实例,这样将清除LSA;

2.若两个LSA实例的LSA Age都没有等于MaxAge的,则判断两个实例的LSA Age的差值是否大于MaxAgeDiff.是则取LSA Age小的做为最新的LSA实例接收.当差值小于MaxAgeDiff时认为两个实例为同一实例.参见RFC2328 13.1

按需线路

在实际组网中,有一些链路是按时或按流量收费的,例如X.25 SVC,ISDN和拨号电路等即用即边的电路.按需线路的特点决定了哪怕是最小的协议通信量,按需线路也不希望有.

OSPF对于按需线路的支持称为OSPF对按需线路的扩展,这种扩展特性虽然是为了即用即连的链路设计的,但是在任何带宽有限的链路上也是有用的.

DNA LSA详解

DNA LSA的由来

按需线路就是要求在没有数据传输任务时,链路层是DOWN的.当在按需线路上跑OSPF协议,我们知道OSPF邻居之间会周期发送hello报文以保持邻接关系,周期发送LSA更新同步LSDB.根据按需线路的特点,可想而知需要对周期发送hello报文和LSA更新报文进行抑制.换句话说,OSPF协议报文只在OSPF邻接关系初始建立阶段进行交互.

对于按需线路来说,需要抑制的是周期的hello报文和LSA更新.抑制hello报文,OSPF协议会有一个可达性的假定,即OSPF协议必须假定在按需线路连接的时候这条线路可用并有效.

LSA的抑制将导致LSDB中的LSA无法得到更新,在前面我们学习过,LSA会通过LSA Age进行老化.LSA的老化会最终导致LSDB的不同步.那么如何解决这个问题呢?在邻接关系建立过程中,LSDB会完成同步过程.此后,可以不对LSA进行老化工作.这就是DNA LSA(DoNotAge LSA)提出的原因.

DNA LSA的工作机制

DAN LSA关键字段

首先我们还是再回顾一下LSA Header的格式:

OSPF 详解 (1)

在LSA Header的第一个16bit字段是LSA Age字段,该字段的最高位为DoNotAge位,该位置位的LSA为DNA LSA

紧接着是选项字段Options字段.Options字段包含在Hello报文,DD报文以及所有的LSA报文中,用于协商可选能力参数.对于DNA LSA需要关注的是Options字段中的DC位:

OSPF 详解 (1)

DC位DemandCircuit位,路由器在发送的LSA中将该位置1表示其能够支持OSPF对按需线路的扩展特性.置位DC位的路由器并不意味着该设备一定就是按需线路的端设备,只是表明本设备能够正常处理DNA LSA

DC扩展能力的协商

在讲述DNA LSA处理机制之前,我们先讲述一下DC扩展能力的协商以及hello报文抑制情况.在hello报文和DD报文的Option字段中通过设置DC位标志支持DC扩展.对于DC的扩展需要通过配置命令启动,具体命令在后文详述.在此需要明确的是,链路的两端只需要一端配置该命令启动DC扩展即可.在邻接协议的初期,未配置的一端会收到启动DC扩展一端的hello报文,该报文中携带了DC位信息.若本端支持DC扩展,则在后续的hello报文和DD报文中置位DC位.若不支持DC扩展,对于收到的hello报文中的DC位忽略,通过发送DC位为0的DD报文指示对端,本端不支持DC扩展.收到该DD报文后,配置启动DC扩展命令的一端不再抑制hello报文的周期发送.

对于hello报文,我们需要注意一点,OSPF在Broadcast和NBMA网络上需要通过hello报文选举DR/BDR,因此在network type为Broadcast和NBMA的链路上不可以抑制hello报文周期发送.所以对于周期hello报文的抑制只在network type为P2P和P2MP有效,因此在配置按需线路的时候要注意将network type设置为P2P或P2MP.同时对于P2MP网络,是按照多个P2P链路处理的,也就是说DC扩展能力也可以在每个虚拟的P2P之间独自协商.

DNA LSA处理机制

DNA LSA在LSDB中与普通LSA的区别在于DNA LSA不会周期产生LSA更新,并且不会老化.对于DNA LSA的Age采用DoNotAge+X的形式.在比较两个LSA实例的时候,DoNotAge+X和X被认为等值的.即比较不同LSA实例的LSA Age的时候,DoNotAge将被忽略.

因此,LSA Age的取值有两个范围:0--MaxAge和0--DoNotAge+MaxAge.对于不在该范围的LSA Age取值处理为MaxAge.

注意LSA Age是不在checksum校验范围内的,路由器的出错有时可能会导致DoNotAge的误置位.因此需要强调的是,路由器对于本系统产生的LSA不会将本系统LSDB的LSA的DoNotAge置位.这样就能通过泛洪将路由域中误置位DoNot

Age的LSA更新.

LSDB的资源是有限的,为了保证这种资源的合理有效使用,必须将过期的,废弃的LSA进行清除.那么难到DNA-LSA就特殊,将永远保留在LSDB中吗?这样当然是不合理的,那就牵涉到对于废弃的DNA LSA进行清除的处理,注意DNA LSA的清除是OSPF LSA清除的特例,在OSPF中常规LSA清除是由该LSA的始发者完成,但是DNA LSA的清除无法按照正常LSA泛洪来完成,所以对于DNA LSA的清除可以由任一满足下面清除条件的路由器完成.我们知道DNA LSA的LSA Age在递增至DoNotAge+MaxAge是不会清除的,但是满足如下条件就可以清除该DNA LSA:

1.DNA LSA Age等于MaxAge的整数倍;

2.产生DNA LSA的源设备变得不可达已超过MaxAge时长.

DNA LSA的后向兼容

并不是所有的路由器都支持OSPF按需线路的扩展特性.如图1,路由器C不支持DC扩展,那么会出现DNA LSA的反复重传.路由器D学习到DNA LSA,发往路由器C.路由器C不支持DC扩展,不识别DNS LSA,将该LSA认为是MaxAgeLSA.那么根据LSA的处理原则,会发送该MaxAge LSA的响应给路由器D.路由器D会认为MaxAge LSA不是先前发送的DNA LSA,因此会重传DNA LSA.

OSPF 详解 (1)

对于这种情况的处理方法是,当支持DC扩展的路由器的LSDB中发现LSA的DC清零.则将本LSDB中所有DNA LSA清除,重新学习正常的LSA,即DoNotAge清零的LSA.

同时做为ABR的路由器D还要产生一个"Indication-LSA"告知路由域,有不支持DC扩展的路由器存在,请不要继续DNA LSA的产生.如图1,路由器D向Area0发送Indication-LSA,告知不要向自己发送DNA LSA.路由器A收到Indication-LSA之后,向Area2发送Indication-LSA,通知该区域不产生DNS LSA.并且周期更新的LSA会经过路由器A,B之间的按需线路,导致按需线路UP.这样就违反了按需线路的初衷,如何解决呢?按需线路理想的状态是,路由域中的所有设备都支持OSPF对DC的扩展特性,但是当存在不支持扩展特性的路由器时,难到按需线路就无法正常工作吗?

我们先对Indication-LSA进行一下介绍.Indication-LSA是由ABR产生的,该LSA是4类LSA-ASBR-summary-LSAs.其特殊性在于,link-state ID取ABR的Router ID,LSA的metric设置为LSInfinity,并且DC为清零.图1中,将Area2设置为STUB或NSSA区域,这样路由器A对收到的Indication-LSA,因为是ASBR-summary-LSAs,所以不会发布到Area2中去.这样问题就迎刃而解了.

因此,建立对于按需线路的区域中所有的路由器均为支持DC扩展的路由器,并将该区域设置为STUB或NSSA.

ABR负责产生Indication-LSA,对于Indication-LSA的产生也做一定的限制:

1.当本区域已经包含DC为清零的LSA时,不会产生Indication-LSA;

2.当一个区域有多个ABR,并且这些都有产生Indication-LSA的可能性,那么本区域的Indication-LSA由ROUTER ID大的路由器优先产生.即,当路由器X,Y都连接在Area0时,并各自连接Area1,Area2.Area1,Area2都包含不支持DC扩展的路由器,那么X,Y都会向Area0产生Indication-LSA.若X的ROUTER ID大于Y的ROUTER ID,则由X产生Indication-LSA就可以了.

Flooding Reduction应用

Flooding Reduction特性是对DC扩展特性的改动,区别在于配置Flooding Reduction的链路,只抑制周期LSA更新,而不抑制周期hello报文的发送.其工作机制同DC扩展是一样的,同样使用DNA LSA进行LSA抑制.

虚链路的DC处理

按照RFC规定,虚链路是按照DC扩展处理的.也就是说,虚链路的处理基本是和按需线路的处理机制一致的.

不同之外在于,按需线路的接口在邻接关系形成后是保持在down状态的.而虚链路不同.虚链路上是通过是否有Intra-area path来判断邻居是否可达的.

配置和示例

配置需求

在Cisco上,DC扩展和Flooding Reduction的配置是非常简单的.

DC扩展的配置只需要在链路的一端配置即可.因为一端一旦配置了DC扩展,则在建立连接关系时发送hello报文双方就是否支持此特性进行协商.只需在接口模式下配置命令就完成了DC扩展或Flooding Reduction的配置:

ip ospf demand-circuit / ip ospf flood-reduction

同时根据前文的描述,需要遵循如下规则:

1.将配置DC扩展的接口网络类型强制为P2P或P2MP.

2.将DC链路的两个接口所在的区域设置为STUB或NSSA区域,并保证该区域中其他的设备也支持DC扩展:

示例

OSPF 详解 (1)

Cisco1与Cisco3通过demand circuit相连,接口启动OSPF,下面我们看看Cisco1的链路状态数据库:

OSPF 详解 (1)

总结:

本文主要是对LSA Age的工作机制以及在按需线路上OSPF的DNA LSA的工作原理进行了介绍.对于按需线路的深入学习可参见RFC1793

附录

参考资料:

J.Moy,Extending OSPF to Support Demand Circuits RFC1793

Syed Faraz Shamim,OSPF Demand Circuit Feature

Syed Faraz Shamim,Why OSPF Demand Circuit Deeps Bringing Up the Link

转:http://www.doc88.com/p-704872388524.html

OSPF详解的相关教程结束。

《OSPF详解.doc》

下载本文的Word格式文档,以方便收藏与打印。