1 写在前面
OSPFv2(RFC 2328)算是RFC中最重要最复杂的协议之一了,其中的细节描述非常之多而细微繁杂。经常有人询问各种OSPF的细节的问题,很多是在网络运营和测试中的实际问题,几乎验证了再细小的细节都有可能出现网上问题的论断。
希望所有的网络爱好者都能熟悉本文中所有的内容,相信这对于一个精通OSPF的技术专家来说,是必须了解的,阅读它能让你迅速增加对OSPF常见细节的了解。对于文中的FAQ的一些更详细的解释,请参考RFC 2328和其它相关的总结文档。
2 OSPF FAQ
2.1 OSPF是否很难懂?
A:前面提到过,OSPFv2(RFC 2328)算是RFC
2.2 OSPF的Router ID如何配置,缺省是什么?
A:如果没有显示配置OSPF Router ID(简单的说我们采用如下策略:1.如果有loopback接口配置了,就选IP地址数值最大的loopback地址;2.如果没有配置loopback接口地址,就选IP地址数值最大的物理接口地址。3.选择完成后不可抢占。
Comware软件在全局模式下通过配置
ospf 100 router-id 1.1.1.1
需要注意的是,如果当前OSPF进程正在运行,Router ID即使是重新手工配置或计算都不会马上生效,而需要OSPF进程重新启动才会生效。这个要求是合理的,因为Router ID对OSPF协议来说太重要,不可能在OSPF保持邻居不断的情况下更新。
2.3 为什么引入的两条静态路由不能同时发布?
A:Comware早期版本不支持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推荐了一种改进的方法,目前ComwareV5已全面支持RFC 2328 Appendix E。
2.4 为什么我配置两个区域,从这两个区域学到的路由总的开销相等,为什么不能形成ECMP(等价路由)?
A:按协议标准,在RFC 2328 Section 16.8.
2.5 为什么有的Stub区的ABR没有正确产生缺省路由?
A:在某些特定组网下(主要是Area 0只采用loopback接口,没有形成邻居),STUB区的ABR没有产生缺省路由,但看来这样的组网方式还是有些市场。
2.6 ABR确切定义是什么?是否在路由器上配置了两个以上的区域就是ABR?
A:非常遗憾,RFC 2328给出的ABR定义如下:
Area border routers:
A router that attaches to multiple areas.
这里并没有给出ABR非常严格的定义。导致一些厂商的实现不一致,而ABR的功能又如此重要。但在RFC 2328中
2.7 OSPF没有路由,甚至邻居都不能形成Full关系,最常见的原因是什么?
A:原因很多。但最常见的是如下几种情况:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
2.8 有什么好的办法知道OSPF出了什么问题?
A:其实很简单,也是必须知道的。调试开关是需要打开的,其中最有效,最常用的就是debugging ospf event!它能让你对OSPF的大部分问题看的一目了然。当然它也不是万能的,它是在正确接收OSPF报文的基础上才能有相应的错误事件。如果没有看到任何动静,建议打开OSPF的所有报文调试开关,看看报文的收发是否正常。
2.9 我配置了Frame Relay或X.25,为什么OSPF不能形成邻居呀?
A:这个是大家经常犯的错误,甚至对于一些比较熟悉OSPF的工程师而言。请注意,一般来说,在跑Frame Relay,X.25,ATM等封装类型的链路上,OSPF缺省的网络类型是NBMA的,这时候要注意两个事情:一是别忘记在OSPF配置模式下配置OSPF邻居;二是别忘记了在映射IP地址的时候别忘记加入broadcast选项,以便让广播或组播报文正常收发。
2.10 OSPF如何自动计算接口cost的?
A:当链路接口没有明确配置OSPF cost的时候,cost按配置的基值除以接口带宽来计算。这个基值缺省为100M,例如10M的链路,cost缺省是100/10=10。显然当运行OSPF的路由器存在多个速率不同的1000M以上的高速接口时候,如果接口没有明确赋予OSPF cost,按缺省公式自动计算的cost将都为1,不能反映链路速率。这个时候Comware是有一个bandwidth-reference的命令,来调节基准值的,但要注意,整个OSPF路由域都要对应调整。因此,最好的方法,还是在网络做好规划,手工对链路接口的cost赋值。
2.11 OSPF的P2P网络类型,一定要求两端的IP地址在同一网段吗?
A: 很多人都认为,只有地址借用的P2P链路是不用检查是否在同一网段的。实际上Comware的实现中,在OSPF P2P网络类型的前提下,如果链路层协议封装为PPP,配置不同的网段地址,是可以形成Full并正确路由的;但如果链路层协议封装为HDLC或其它协议,则不能形成邻居。差别在于,PPP可以协商到对端的IP地址,不用额外的操作也有对端的路由。顺便说一句的是,OSPF广播网络,NBMA,P2MP等其它网络类型,是要求严格检查邻居的IP地址是否和自己接收接口在同一网段的。
进一步的了解是,事实上在较老的OSPF标准RFC 1583 OSPFv2中,从Point-to-point的接口描述中(老的实现方式成了OSPF 2328 Section 12.4.1.1 Describing point-to-point interfaces中的Option 1了)是可以看出,其设计的初衷就是为了支持P2P链路上不管其链路层封装类型,都可以支持两端链路不在同一子网中。
2.12 RFC 2328中规定在Router LSA中描述P2P接口时,我们采用的是哪个Option?
A: 对于Router LSA描述P2P网络产生的Stub network时,Comware采用的是Option 2。Option 1描述的是对端的IP地址加32bit的掩码(延续RFC 1583);Option 2描述的是本端的子网网段加上其掩码。
需要注意的是,这样如果P2P接口两端不在同一网络上,学习到对端P2P接口路由的总的cost计算是本接口的cost加上了对端接口的cost了,看起来有些怪异。
2.13 OSPF的NBMA网络类型,一定要求是Full mesh的吗?
A:可能受一些培训资料的影响,大家都认为OSPF的NBMA网络类型从L3的角度看来必须是Full Mesh直接可达的,否则就不可以配置成NBMA。事实上不是如此,只要保证你的DR,BDR和所有的邻居L3直接可达就行了。虽然DR选举并不确定,但你可以通过设置其它路由器的优先级为0来取消它的选举权。这时候路由信息的交换表面上是正确的,但下一跳可能被直接设置成了非DR,除非特别配置如FR在同一DLCI的映射,路由依然不通;而且从健壮性的角度看来,我们建议,当你打算配置OSPF NBMA网络的时候,还是在Full Mesh也就是所有参与的路由器都直接可达的条件下配置。
2.14 我在配置OSPF的P2MP网络类型时,怎么学到了对方的接口IP地址的32bit掩码的路由?
A: 你比较细心,注意到配置P2MP网络类型和其它网络类型,路由表的不同之处。RFC 2328关于Router LSA产生描述P2MP接口时候规定:产生一个type 3的link(stub网络),Link ID是路由器自己的接口IP地址;Link Data设置为:0xffffffff(全1的mask,表示主机路由),cost设置为0。于是在形成Full的邻居关系后,对方将利用此Router LSA,计算出一条代表连入P2MP网络的接口的IP地址的主机路由。
进一步,如果你熟悉较老的OSPF标准RFC 1583的话,这实际上是保持了它在Router LSA中对Point-to-point的接口描述。
2.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,
2.16 OSPF的type 5的外部路由中的Forwarding Address有什么用?是如何填写的?
A:和RIPv2,
ASBR引入外部路由产生的Type 5 LSA中,FA可能是0,也可能是非0的。
很遗憾,RFC 2328并没有明确规定FA如何填写,这个也是很多人不熟悉的地方。
规则如下:
如果ASBR引入路由,但OSPF没有在这些路由的下一跳接口上启动(enable),FA设置为0.0.0.0。
而在满足如下所有条件的情况下FA设置为非0.0.0.0:
1.
2.
3.
4.
除此之外,其它情况FA都填为0.0.0.0。
必须一提的是:在RFC 2328
"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."
目前ComwareV5的实现检查是否有“intra−area or inter−area path”,如果没有则不能计算出路由。
2.17 OSPF路由聚合是否可以跨区域聚合?
A:先看一个问题,简单示意的OSPF网络拓扑,area 1——area0-area2,area1中三条路由: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路由的时候,才要去考虑配置的聚合!
所以,上述描述的结果是正常的现象。区域间路由的聚合是在连接产生该路由的区域的ABR上处理的,而不能跨区域聚合。
2.18 为什么我的路由在cost比较小的情况下没有优选通过Backbone的?
A:一般资料上都没有提到按RFC 2328实现的OSPF必须有个“RFC1583Compatibility”的选项(ComwareV5命令为rfc1583 compatible)。RFC 2328对从同一个ASBR学到的多条外部路由的选择规则规定,如果“RFC1583Compatibility”是disable的话,路由如果可以经过普通区域和骨干区域同时学习到,而且总的开销相同,是会优选普通区域的。主要的考虑也是为了减轻骨干区的压力。这是个很细节的地方。
2.19 我可以在以太网上配置OSPF网络类型为P2P或NBMA等类型吗?
A:可以的。但除非你有必要并且清楚修改缺省网络类型的后果,不要轻易去改它。初学者可能会认为OSPF中的广播网络,点对点等网络类型,必须是链路层对应也是广播或点对点的。实际上那只是个参考模型而已,与物理介质和链路层协议无关。
2.20 OSPF网络规划时,一个区域到底最好是支持多少个路由器?
A:很多文档,包括RFC 2328作者J. Moy本人在其大作《OSPF:Anatomy of an Internet Routing Protocol》中都建议,最好每个区域不要多于50个路由器。其实我们可以看下,那些文档和这本书是在90s年代成文的。那时候路由器CPU处理速度,内存大小都与当今主流的设备能力不可同日而语。测试表明,200台路由器一个区域都可以非常快速的收敛。
个人认为,50台路由器的经验值应该修改了。否则OSPF vs. IS-IS的争论中,OSPF单区域只能支持相对少的多的路由器数目会成为受攻击的弱点。
2.21 我配置了区域需要MD5认证,是否本区域的每条链路都要配置认证?
A:很遗憾,Comware目前是这么要求的,你必须保证该区域的所有链路都要配置MD5认证。
2.22 OSPF如何过滤接收的路由呀?
A:首先要清楚OSPF是基于链路状态的路由协议,与D-V算法的路由协议不一样,它为了保证拓扑关系的一致性——这也是OSPF路由无环路的重要条件,没有那么轻易能过滤路由并不扩散。不过你可以在OSPF的配置下,利用filter-policy import来过滤路由。但要注意的是:千万不要以为你的OSPF数据库中没有该路由的LSA记录,实际上OSPF进程是算出了该路由,只是路由管理未将其加入到路由表中;还有很重要的一点是该路由对应的LSA依然会扩散,也就是说它的邻居路由器还是会有这条路由的。值得注意的是filter-policy export只能在引入发布配置的外部路由时过滤用。
ComareV5的OSPF还支持一个新的特性,OSPF ABR Type 3 LSA过滤。该特性将ABR的能力扩展,使其能在OSPF区域间发布Type 3 LSAs的时候进行过滤。本特性可以限制仅允许满足某些前缀的报文从一个区域发送到另一个区域,这种类型的区域路由过滤可以应用到某个特定区域,对入区域、出区域或两者同时都可以进行控制。
2.23 OSPF如何将一个区域的某条路由隐藏起来,不发布到其它区域?
A:这个问题,很多人都想当然以为用过滤列表就可以解决问题。事实上,当你知道OSPF如何过滤路由的话,你就知道不可能的。一个小把戏是,你在这个区域的ABR上配置路由聚合,聚合范围不变,比如10.1.0.0/16这个网段的路由,依然聚合成10.1.0.0/16,关键的是,聚合的语句后面有个no-advertise选项,它将帮助你不发布到骨干区,更不会发布到另外的区域去了。还有一个笨方法就是,在禁止发布的区域每个路由器用过滤列表禁止该路由加入到路由表中去。
如果你关注OSPF的新发展特性的话,你可能会知道有一个OSPF ABR Type 3 LSA
2.24 我在接口上配置了主从IP地址,OSPF是否可以以从地址建立OSPF邻居关系?
A:很遗憾,由于实现复杂度的关系,OSPF不允许以从地址建立OSPF邻居关系,而只能以接口的主地址建立邻接关系。其实其它一些协议也是如此实现的。但如果你将从地址接口的网络加入到了OSPF的配置中,它肯定是可以发布相应的路由的。需要注意的是,主从地址可以配置在同一网段中。
2.25 OSPF的virtual link是否很有用处?
A:从协议的角度上来看,OSPF的虚连接Virtual Link非常有用,一是可以将不与骨干区域直接物理连接的区域连接起来,让它能正常路由,这在一些网络的合并中比较有用;二是可以提高网络的可靠性,让骨干区不至于轻易断开而不能正常路由(RFC 2328中的例子)。
但坦白的说,实际的应用中虚连接却很少用到,我的记忆中Comware的OSPF协议在网络中大量应用,但几乎没有网络用到v-link。原因很简单:一般来说,网络的规划比较合理,不会让一些区域与骨干区断开物理连接,在国内网络合并而不重新全部规划的情况也非常少;二是大家也经常不会想用v-link来增加骨干区域的健壮性。
无论如何,作为OSPF的一个重要特性,对OSPF虚链路,你都应该了解。
2.26 为什么两个路由器背对背一条链路连接,我将接口shut down了,查看链路状态数据库,对端原来的LSA还在?
A:为什么不在呢?OSPF规定,只有LSA的始发者才能Flooding掉自己发布的LSA,唯一的通路都down了,LSA的Flooding自然不能更新过来了,但我自己产生的Router LSA会更新描述新的链路状态,即使你这条LSA在我的数据库中,都不会参与SPF计算,会随着时间老化。
2.27 .OSPF的virtual link上MD5验证的配置为什么总是不通?
A:对于Comware来说,这也是一个比较常见的问题。事实上假设OSPF的v-link是在区域2,你不能只在v-link配置的时候配置MD5认证,由于v-link的链路是属于骨干区域的,你首先要使能骨干区(Area 0)的MD5认证。
2.28 如果配置Virtual link的cost,需要注意什么?
A:需要注意,这个cost是不能超过RFC规定的最大值65535的,否则不能建立v-link。
2.29 OSPF常用的LSA type怎么没有看到类型6呢?是否还有其它类型的?
A:Type 1 LSA:Router LSA;Type 2 LSA:network LSA;Type 3 LSA:summary LSA;Type 4 LSA:asbr-summary LSA;Type 5 LSA:AS-external-LSA;Type 7 LSA: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路径等信息,遗憾的是,目前完全实现的非常少。
值得一提的是RFC 2370中定义了重要的LSA类型:Opaque LSA,将OSPF的能力进一步提升,允许采用类似TLV的结构。OSPF流量工程等应用就是基于Opaque LSA扩展能力的。其中LSA Type 9为只在本链路范围扩散的Opaque LSA;LSA Type 10为只在本区域范围扩散的Opaque LSA;LSA Type 11为类似Type 5 LSA在本AS范围内扩散的Opaque LSA。
2.30 在一个Stub区域,有两个ABR,它们产生的缺省路由,不会让它们互相指向,形成路由环路吗?
A:不会形成环路的。当一个STUB区域中的ABR接收到同一区域ABR发出的默认路由LSA的时候,它只会将其放到LSA Database里,而不会计算出路由,这样就避免了两个ABR缺省路由相互指向形成环路。
2.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。
2.32 当一条路由既有type 5 路由又有type 7的时候,我们优选哪个?
A:在关于NSSA的RFC1587中明确定义了OSPF路由的优先级从高到低的次序是:Intra-Area>Inter-Area>Type 5 LSA>Type 7 LSA,因此目前ComwareV3是按照这个RFC来实现的。但是大家可能注意到在新的RFC3101 2.5里这个顺序的定义有些不同,A Type-7 LSA with the P-bit set>A Type-5 LSA>The LSA with the higher router ID,RFC3101在ComwareV5里完全实现。
2.33 OSPF DD报文中的Interface MTU是否有用?两端是否一致才能形成Full?
A:在RFC 2328中对DD报文的Interface MTU规定是要填入本链路的MTU大小的(v-link只好填为0),而且要求如果收到对方的DD报文中的Interface MTU大于本端的,这个DD报文就要被丢弃,那么邻居状态就会停留在“Exchange start”下。
事实上,各主要厂商也意识到这个问题,可以在接口下增加相关配置命令,忽略对interface MTU的检查,这样并不需要两端链路配置的MTU完全一致,也可以正常达到Full状态,完成数据库同步。当然要注意,两端的MTU不能相差太悬殊。和IS-IS的hello padding要求达到链路MTU-1可以抑制一样,这也是协议追求完美和现实应用的妥协。
2.34 OSPF LSA中的TOS字段做什么用的?
A:本来的意图是希望做Qos Routing用的,简单的说就是对于不同的TOS值,链路可以配置不同的cost,以实现基于TOS的路由,即目的网络相同但不同TOS值的IP报文做不同的路由。但在RFC 2328中取消了这个应用,只支持TOS 0,也就是只基于目的IP地址的路由。
2.35 OSPF的收敛速度到底是多少?如何能调整加快收敛?
A:大家都说OSPF快速收敛,但具体要给个数据,却一时找很多人要都没有给出,只能重新测试。按Spirent标准的OSPF Route Reconvergence测试方法,在为FT提供的数据,两个小组的测试数据比较接近。当网络拓扑规模为20个结点,100条路由的情况下,用Agilent的Router Tester在spf-schedule-interval为1s时候,收敛速度为2140.9 ms;spf-schedule-interval
事实上,对OSPF来说网络变化影响路由收敛主要由如下几个因素组成:1.侦测对端链路down,邻居失效;2.新的LSA
为了加快OSPF的收敛速度,ComwareV3可调整的选项比较少:1.邻居的hello和dead间隔时间;2. spf-schedule-interval(缺省5秒),缩短两次SPF算法运行的间隔时间;3.
2.36 在MPLS/BGP VPN环境中,PE-CE之间路由协议用OSPF,站点的区域号编码有什么限制吗?
A:Comware一个起码的要求是,如果某个站点(site)的OSPF有区域0(骨干区)的话,必须保证PE-CE之间的链路也属于区域0。这是由于在MPLS/BGP VPN环境中,实际上OSPF将MPLS区域当作了一个super backbone来处理。
2.37 什么是OSPF sham-link,有什么用?
A:在MPLS VPN配置的时候,OSPF经常用来作为PE-CE中间的路由协议,以通过MPLS骨干网络连接VPN内的各站点。虽然OSPF PE-CE之间的连接保证了VPN站点间的连通性,但VPN站点间的backdoor后门链路也应该考虑。如果两个站点属于同一个site,那么经过后门链路的路径总是会被优先选择,因为按OSFP协议规定,intra-area的路径总是优于inter-area路径。因此,必须考虑存在后门链路时,能通过策略来控制路由。
如果后门链路只是用来作为备份使用而不参与VPN业务提供服务,缺省的处理流程将不可接受。为了重新通过MPLS VPN骨干区建立站点间的连接,必须在相关PE路由器的入口和出口VRF间建立逻辑的intra-area链路。本特性提供一种解决方案,在两个站点间建立一个假OSPF链路:sham-link,作为intra-area通道,以使得两个站点间的之间的通讯通过MPLS骨干区域,而后门链路作为备份使用。如果两个站点间不存在后门链路,没有必要使用sham-link。
2.38 i_SPF是个什么东西,有什么用?
A:所谓的i-SPF就是Incremental-SPF,增量SPF算法,是在原来的普通SPF算法改进以空间换时间,以达到加快SPF的计算速度,提高OSPF及IS-IS的收敛速度的目的。核心思想在于当路由变化时判断其对SPF树的影响,对于不涉及SPF树的变化则不需要计算,对于叶结点的增加和删除也可以实现增量计算但有时如一个down掉的链路并不在SPT上时,并不需要重新计算SPF。可以通过在SPT上保存更多的信息如:父亲列表,邻居列表来实现,基于这些增强的信息和变化,SPF再来计算反映变化。ComwareV5版本支持该特性。
2.39 支持IPv6的OSPFv3路由协议是否基本和OSPFv2一样?
A:事实上RFC 2740 OSPF for IPv6已经成文很久了。OSPFv3保留了OSPFv2的基本的报文类型,邻居发现维护机制,网络类型,LSA泛洪机制,以及核心的SPF算法。但由于IPv6的地址及其结构的特点,OSPFv3在报文的组成上都做了较大的改变:增加了新的Link LSA,Intra-Area Prefix LSA等LSA类型;IPv6的地址已经不像IPv4那样频繁出现在OSPF协议报文中,协议报文描述的更多是网络拓扑关系,更像是IS-IS那样的PDU组成方式了,协议的扩展性更为灵活。总的来说,差异还是相当大的,但主要的协议思想基本没有改变,有了很好的OSPFv2的基础,如果你对IPv6的机制有一定的了解,OSPFv3还是能很快熟悉的。BTW,需要注意的是,对IPv6的支持,OSPF对应的是OSPFv3,而IS-IS是IS-ISv6。
2.40 OSPF vs. IS-IS到底谁更好?
A:这是IS-IS开始在中国大行其道时候很多人问的一个问题,事实上,专门讨论这个问题的文档也是不少的,用句很俗的话,OSPF和IS-IS各有优缺点,而且非常近似,如何选择可能确实是个人喜好了。总的来说,在大型的一级运营商网络中,采用IS-IS做IGP的占大多数;而在绝大部分的企业网络中,OSPF是应用最多的IGP。
IS-IS的配置相对OSPF来说简单,不容易出错,比较少耗资源,能支撑更大的网络应该是不争的事实了。